glBindAttribLocation不能像预期的那样工作

时间:2016-09-02 10:02:34

标签: opengl

我有一个非常基本的OpenGL应用程序,在VAO中有一个三角形的顶点。顶点属性对于位置是“p”,对于颜色是“c”。着色器也很基本。它不会变换位置并在三角形上插入3个顶点的颜色。

访问属性时出现问题。如果position位于0位且color位于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;
}

Fragment Shader:

#version 430

in vec4 fCol;

void main() {
    gl_FragColor = fCol;
}

1 个答案:

答案 0 :(得分:4)

调用glLinkProgram后,您必须使用glBindAttribLocation链接着色器程序。来自OpenGL website

  

在程序对象链接之后发生的任何属性绑定在下次链接程序对象之前不会生效。