【发布时间】:2016-09-02 10:02:33
【问题描述】:
我有一个非常基本的 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;
}
【问题讨论】:
-
顺便说一句,您可以使用适当的
layout限定符轻松地在顶点着色器中分配和属性位置。在您的具体示例中,您可以编写layout (location = 0) in vec4 p;,然后简单地使用0而不是loc_p。顺便说一句,制服也是如此。这样可以节省各种 API 调用。请参阅this wiki 页面。
标签: opengl