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