opengl - glBindAttribLocation 无法按预期工作

标签 opengl

我有一个非常基本的 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/

相关文章:

c++ - Visual Studio 2012 - 错误 LNK1104 : cannot open file 'glew32.lib'

c++ - 光标方向 openGL C++

c++ - CMake 声称找到 OpenGL 但找不到 EGL 和 OpenGL::GL

cocoa - 使用 OpenGL 和 Cocoa 绘制文本的最佳方法?

linux - Clang OpenGL 和 Max

java - 如何管理实体数据

c++ - SDL + OpenGL,具有周期性尖峰的不规则帧时间

opengl - GLSL 中到相机平面的距离为深度

c++ - AMD GPU 在 OpenGL 3.3 中可以绘制的顶点数是否有最大限制?

OpenGL 2.1 : glMapBuffer and usage hints