glBindAttribLocation 不像预期的那样工作

Posted

技术标签:

【中文标题】glBindAttribLocation 不像预期的那样工作【英文标题】:glBindAttribLocation does not work like expected 【发布时间】: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 页面。 【参考方案1】:

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

在程序对象被链接之后发生的任何属性绑定直到下次程序对象被链接时才会生效。

【讨论】:

以上是关于glBindAttribLocation 不像预期的那样工作的主要内容,如果未能解决你的问题,请参考以下文章

$geoIntersects 不像预期的那样工作

Clickhouse:runningAccumulate() 不像我预期的那样工作

sleep() 不像我预期的那样工作

正则表达式不像预期的那么贪婪 /^(\d+)[^_]/

按钮并不像预期的那样完全一样 iOS Autolayout

异步函数的行为不像我对 Jest 的预期那样