1

我目前正在向我的项目中添加一个着色器系统,并且遇到了一些我希望有人能解决的问题。我的项目是用 Java 编写的,使用 LWJGL 库,并以 OpenGL 2.1 为目标。

据我了解,使用glVertexAttrib函数设置一个属性,该属性在传递新值之前保持不变。例如,以下调用应该使我的所有几何图形变为白色,直到我更改它:

glVertexAttrib3f(shader.getAttributeLocation("in_Color"), 1.0f, 1.0f, 1.0f);

但是,如果in_Color绑定到索引 0(使用 时就是这种情况glGetAttribLocation),则每次调用 只会影响一个顶点glVertexAttrib3f。例如,如果我把它放到我的初始化代码中:

int colorLocation = shader.getAttributeLocation("in_Color");
glVertexAttrib3f(colorLocation, 1.0f, 1.0f, 1.0f);
glVertexAttrib3f(colorLocation, 1.0f, 0.0f, 0.0f);
glVertexAttrib3f(colorLocation, 0.0f, 1.0f, 0.0f);
glVertexAttrib3f(colorLocation, 0.0f, 0.0f, 1.0f);

然后尝试使用以下方法渲染立方体:

for(int i = 0; i < 6; i++) {
    glDrawArrays(GL_TRIANGLE_STRIP, i * 4, 4);
}

这是呈现的内容:http: //i.imgur.com/uSuT3sH.jpg

但是,如果in_Color绑定到任何其他属性索引,则整个立方体是蓝色的,正如预期的那样:http: //imgur.com/uOVa2iA.jpg

4

1 回答 1

0

我也刚遇到这个bug。

使用我的 Intel HD Graphics 3000,驱动程序版本 8.17.12.9632,glVertexAttrib*() 就像卡在 glBegin()/glEnd() 之间一样工作。每个调用都可能将属性值附加到一个内部数组,该数组在渲染时逐个顶点使用,就像立即模式一样。此数组在刷新/交换后不会被清除,因此您无法重置这些值。它看起来确实只发生在属性索引(位置)0。

此行为与同一台机器中的 Nvidia 卡的行为不匹配。您可以将 Intel 检测为 GL_VENDOR 并有选择地尝试我的解决方法。它似乎在提醒驱动程序它没有使用立即模式调用,但它仅在使用 glVertexAttrib*() 调用的每一帧中完成时才有效。在每帧调用一次 glVertexAttrib*() 之前执行此操作:

if(apply_Intel_attrib_workaround && location == 0)
{
    apply_Intel_attrib_workaround = 0;
    glBegin(GL_TRIANGLES);
    glEnd();
}

*apply_Intel_attrib_workaround* 必须在帧完成后设置为 1。

于 2014-01-24T17:00:00.343 回答