我有一个非常基本的 OpenGL 应用程序,其中包含 VAO 中单个三角形的顶点。顶点属性“p”表示位置,“c”表示颜色。着色器也非常基本。它不会变换位置并在三角形上插入 3 个顶点的颜色。
访问属性时出现问题。如果位置位于位置 0,颜色位于位置 1,则着色器会以某种方式交换属性(将颜色解释为位置,反之亦然)。如果颜色为 0,位置为 1,则效果与预期一致。
我不知道出了什么问题,希望得到任何帮助。这是我的代码:
...
GLint loc_p = 0, loc_c = 1; // works not
// GLint loc_p = 1, loc_c = 0; // works
glBindAttribLocation(shader1, loc_p, "p");
glBindAttribLocation(shader1, loc_c, "c");
glVertexAttribPointer(loc_p, 4, GL_FLOAT, false, 8*sizeof(GLfloat), (GLvoid*)0);
glVertexAttribPointer(loc_c, 4, GL_FLOAT, false, 8*sizeof(GLfloat), (GLvoid*)(4*sizeof(GLfloat)));
do {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// Render with shader 1
glBindVertexArray(vao);
glUseProgram(shader1);
glEnableVertexAttribArray(loc_p);
glEnableVertexAttribArray(loc_c);
glDrawArrays(GL_TRIANGLES, 0, 3);
} while(running);
顶点着色器:
#version 430
in vec4 p;
in vec4 c;
out vec4 fCol;
void main() {
fCol = c;
gl_Position = p;
}
片段着色器:
#version 430
in vec4 fCol;
void main() {
gl_FragColor = fCol;
}
最佳答案
调用glBindAttribLocation
后,您必须使用glLinkProgram
链接着色器程序。来自 OpenGL website :
Any attribute binding that occurs after the program object has been linked will not take effect until the next time the program object is linked.
关于opengl - glBindAttribLocation 无法按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39289687/