我目前正在将着色器系统添加到我的项目中,并且遇到了一些麻烦,希望有人可以解决。我的项目是用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 最佳答案
我也遇到了这个错误。
对于我的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。