将顶点属性传递给正在运行的着色器程序时出现问题。我想传递两个属性,即位置和RGBA颜色。绑定属性位置适用于该位置。但是,它不适用于颜色。因此,所有几何体最终都呈现为黑色。
这就是我的所作所为:
GLuint programHandler;
// create program
// compile & attach vertex shader
// compile & attach fragment shader
glBindAttribLocation(programHandler, 0, "InPosition");
glBindAttribLocation(programHandler, 1, "InColor");
glBindFragDataLocation(programHandler, 1, "FragColor");
glLinkProgram(programHandler);
glUseProgram(programHandler);
// initialize uniform variables
// I'm trying to get the attribute locations now.
// I expect location "0" for InPosition and location "1" for InColor.
// In fact, it gets me a "-1" for InColor. I simply cannot see the reason for that behaviour
GLint positionLocation = glGetAttribLocation(programHandler, "InPosition"); // returns 0
GLint colorLocation = glGetAttribLocation(programHandler, "InColor"); // returns -1
glEnableVertexAttribArray(positionLocation);
glEnableVertexAttribArray(colorLocation); // fails!
我的顶点着色器非常基本。我真正做的就是转换顶点并将颜色传递给片段着色器:
#version 150 core
// input
uniform mat4 ModelviewMatrix;
uniform mat4 ProjectionMatrix;
in vec3 InPosition;
in vec4 InColor;
// output
out vec4 PassColor;
void main(void) {
// passing color through to fragment shader
PassColor = InColor;
// transformation
gl_Position = ProjectionMatrix * ModelviewMatrix * vec4(InPosition, 1.0);
}
我的片段着色器应该只返回那种颜色:
#version 150 core
precision highp float;
// input
in vec4 PassColor;
// output
out vec4 FragColor;
void main(void) {
FragColor = PassColor;
}
为什么绑定“InPosition”工作而“InColor”不工作?我知道GLSL编译器优化着色器代码,因此不能绑定未使用的变量。但是,我不明白为什么这里应该优化颜色。毕竟,我通过将它传递给片段着色器来使用它。
答案 0 :(得分:1)
盲目拍摄,我认为这是错误的:
glBindFragDataLocation(programHandler, 1, "FragColor");
应该是:
glBindFragDataLocation(programHandler, 0, "FragColor");