Implement Texture Units, bugfix guessChannelCountAndInternalFormat

This commit is contained in:
2025-11-13 06:53:24 +00:00
parent ad56624b51
commit d3dc397353
6 changed files with 33 additions and 12 deletions

View File

@@ -4,9 +4,16 @@ out vec4 FragColour;
in vec4 ourColour;
in vec2 TexCoord;
uniform sampler2D ourTexture;
uniform sampler2D texture1;
uniform sampler2D texture2;
void main()
{
FragColour = texture(ourTexture, TexCoord);
vec4 tex1Color = texture(texture1, TexCoord);
vec4 tex2Color = texture(texture2, TexCoord);
if (tex2Color.a < 0.1)
tex2Color = tex1Color;
FragColour = mix(tex1Color, tex2Color, 0.4f);
}

BIN
assets/textures/flames.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 MiB

View File

@@ -12,7 +12,7 @@ import org.lwjgl.BufferUtils;
public class Mesh {
@Getter @Setter private int vaoID, vboID, eboID;
@Getter private Shader shader;
@Getter protected Shader shader;
@Getter float[] vertices;
@Getter int[] elements;

View File

@@ -38,9 +38,15 @@ public class SplashScene extends Scene {
Shader texturedShader = new Shader("assets/shaders/texture");
texturedShader.init();
Texture logoTexture = new Texture(225, 225, "assets/textures/plink.png");
Texture flameTexture = new Texture(2500, 2500, "assets/textures/flames.png");
logoTexture.init();
flameTexture.init();
Mesh logoMesh =
new TexturedMesh(texturedShader, logoTexture, logoRectVertices, screenCoverRectElements);
new TexturedMesh(
texturedShader,
new Texture[] {logoTexture, flameTexture},
logoRectVertices,
screenCoverRectElements);
logoMesh.init();
setLogo(logoMesh);
}

View File

@@ -39,9 +39,11 @@ public class Texture {
case "png":
setChannelCount(4);
setInternalFormat(GL_RGBA);
break;
case "jpg":
setChannelCount(3);
setInternalFormat(GL_RGB);
break;
default:
// just pray at this point
setChannelCount(3);
@@ -69,7 +71,7 @@ public class Texture {
setTextureID(glGenTextures());
glBindTexture(GL_TEXTURE_2D, getTextureID());
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
// glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
setupFilterParameters();
setupWrapParameters();

View File

@@ -6,17 +6,17 @@ import static org.lwjgl.opengl.GL20.*;
import lombok.Getter;
public class TexturedMesh extends Mesh {
@Getter private Texture texture;
@Getter private Texture[] textures;
private final int TEXTURE_COORDS_SIZE = 2;
public TexturedMesh(Shader shader, Texture texture, float[] vertexArray, int[] elementArray) {
public TexturedMesh(Shader shader, Texture[] textures, float[] vertexArray, int[] elementArray) {
super(shader, vertexArray, elementArray);
this.texture = texture;
this.textures = textures;
}
public TexturedMesh(Shader shader, Texture texture) {
this(shader, texture, DEFAULT_VERTEX_ARRAY, DEFAULT_ELEMENT_ARRAY);
public TexturedMesh(Shader shader, Texture[] textures) {
this(shader, textures, DEFAULT_VERTEX_ARRAY, DEFAULT_ELEMENT_ARRAY);
}
protected int initialiseAttribPointers() {
@@ -34,8 +34,14 @@ public class TexturedMesh extends Mesh {
}
protected void glDraw() {
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, getTexture().getTextureID());
for (int i = 0; i < textures.length; i++) {
int textureUnitIndexStart = GL_TEXTURE0;
int textureUnitIndex = textureUnitIndexStart + i;
glActiveTexture(textureUnitIndex);
glBindTexture(GL_TEXTURE_2D, getTextures()[i].getTextureID());
String uniformName = "texture" + Integer.toString(i + 1);
glUniform1i(glGetUniformLocation(getShader().getShaderProgramID(), uniformName), i);
}
super.glDraw();
}
}