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 vec4 ourColour;
in vec2 TexCoord; in vec2 TexCoord;
uniform sampler2D ourTexture; uniform sampler2D texture1;
uniform sampler2D texture2;
void main() 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 { public class Mesh {
@Getter @Setter private int vaoID, vboID, eboID; @Getter @Setter private int vaoID, vboID, eboID;
@Getter private Shader shader; @Getter protected Shader shader;
@Getter float[] vertices; @Getter float[] vertices;
@Getter int[] elements; @Getter int[] elements;

View File

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

View File

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

View File

@@ -6,17 +6,17 @@ import static org.lwjgl.opengl.GL20.*;
import lombok.Getter; import lombok.Getter;
public class TexturedMesh extends Mesh { public class TexturedMesh extends Mesh {
@Getter private Texture texture; @Getter private Texture[] textures;
private final int TEXTURE_COORDS_SIZE = 2; 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); super(shader, vertexArray, elementArray);
this.texture = texture; this.textures = textures;
} }
public TexturedMesh(Shader shader, Texture texture) { public TexturedMesh(Shader shader, Texture[] textures) {
this(shader, texture, DEFAULT_VERTEX_ARRAY, DEFAULT_ELEMENT_ARRAY); this(shader, textures, DEFAULT_VERTEX_ARRAY, DEFAULT_ELEMENT_ARRAY);
} }
protected int initialiseAttribPointers() { protected int initialiseAttribPointers() {
@@ -34,8 +34,14 @@ public class TexturedMesh extends Mesh {
} }
protected void glDraw() { protected void glDraw() {
glActiveTexture(GL_TEXTURE0); for (int i = 0; i < textures.length; i++) {
glBindTexture(GL_TEXTURE_2D, getTexture().getTextureID()); 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(); super.glDraw();
} }
} }