奇怪的glVertexAttrib行为?

时间:2013-07-12 06:23:35

标签: java opengl lwjgl

我目前正在为我的项目添加一个着色器系统,并且遇到了一些障碍,我希望有人可以解决这个问题。我的项目是用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

1 个答案:

答案 0 :(得分:0)

我也遇到过这个错误。

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

此行为与同一台机器中的Nvidia卡不匹配。您可以将英特尔检测为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。