我正在尝试学习 GLSL,并且想将浮点属性发送到我的顶点着色器。现在,这个浮点数仅用于设置亮度(我将 in_Color 乘以 in_Light 并将其分配给 out_Color)。无论我尝试传递什么(下面代码中的 0.1),顶点着色器中的亮度似乎总是等于 1.0。我试过用谷歌搜索,也试过很多次,但我就是不明白出了什么问题。位置、纹理坐标和颜色似乎工作正常。
这是我绑定属性位置的方式,以及更多代码。
this.vsId = Shader.loadShader(pVertexFilePath, GL20.GL_VERTEX_SHADER);
this.fsId = Shader.loadShader(pFragmentFilePath, GL20.GL_FRAGMENT_SHADER);
this.pId = GL20.glCreateProgram();
GL20.glAttachShader(this.pId, this.vsId);
GL20.glAttachShader(this.pId, this.fsId);
GL20.glBindAttribLocation(this.pId, 0, "in_Position");
GL20.glBindAttribLocation(this.pId, 1, "in_TextureCoord");
GL20.glBindAttribLocation(this.pId, 2, "in_Color");
GL20.glBindAttribLocation(this.pId, 3, "in_Light");
GL20.glLinkProgram(this.pId);
this.normalMatrixId = GL20.glGetUniformLocation(this.pId, "normalMatrix");
this.projectionModelViewMatrixId = GL20.glGetUniformLocation(this.pId, "projModelViewMatrix");
这就是我设置每个属性的位置的方式
FloatBuffer verticesFloatBuffer = BufferUtils.createFloatBuffer(verticesCount * 36);
for (VertexData vert : vertices) {verticesFloatBuffer.put(vert.getElements());}
vertices.clear();
verticesFloatBuffer.flip();
GL30.glBindVertexArray(vaoId);
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, vboId);
GL15.glBufferData(GL15.GL_ARRAY_BUFFER, verticesFloatBuffer, GL15.GL_STATIC_DRAW);
GL20.glVertexAttribPointer(0, 3, GL11.GL_FLOAT, false, 36, 0);
GL20.glVertexAttribPointer(1, 2, GL11.GL_FLOAT, false, 36, 12);
GL20.glVertexAttribPointer(2, 3, GL11.GL_FLOAT, false, 36, 20);
GL20.glVertexAttribPointer(3, 1, GL11.GL_FLOAT, false, 36, 32);
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
这是上面使用的 getElements 方法(出于测试目的,我手动输入了颜色和亮度)。请注意,应该是 in_Light 的最后一个值是 0.1f,并且在顶点着色器中始终是 1.f。
public float[] getElements() {
return new float[]{this.x, this.y, this.z, this.s, this.t, 1.f, 0.f, 1.f, 0.1f};
}
顶点着色器:
#version 430 core
uniform mat4 projModelViewMatrix;
uniform mat3 normalMatrix;
in vec3 in_Position;
in vec2 in_TextureCoord;
in vec3 in_Color;
in float in_Light;
out vec4 pass_Color;
out vec2 pass_TextureCoord;
void main(void) {
gl_Position = projModelViewMatrix * vec4(in_Position, 1.0);
pass_TextureCoord = in_TextureCoord;
pass_Color = vec4(in_Color * in_Light, 1.0);
}
片段着色器(以防万一有人想看):
#version 430 core
uniform sampler2D texture_diffuse;
in vec4 pass_Color;
in vec2 pass_TextureCoord;
out vec4 out_Color;
void main(void) {
out_Color = texture2D(texture_diffuse, pass_TextureCoord) * pass_Color;
}
我传递给顶点着色器的所有其他属性都可以正常工作。
编辑:作为一个注释,我尝试更改着色器以指定位置,例如:
layout (location = 0) in vec3 in_Position;
我还使用了 glGetAttributeLocation 它给了我相同的属性位置(0、1、2、3),例如:
GL20.glGetAttribLocation(this.pId, "in_Position");
我还在着色器中添加了一个 if 语句来检查 in_Light 的值,它总是等于 1。
EDIT2:现在我已将颜色属性更改为 vec4 并传递光值代替 alpha 工作正常。基于其他试验,以及这个,我几乎因为某种原因不能拥有超过 3 个属性。