奇怪的glVertexAttrib行为?(Strange glVertexAttrib Behavi

2019-10-18 09:05发布

我目前加入的着色器系统为我的项目,遇到了一点,我很希望有人能理清障碍的。 我的项目是用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

Answer 1:

我刚刚遇到这个错误了。

随着我的英特尔高清显卡3000,因为如果它停留在glBegin之间的驱动程序版本8.17.12.9632,glVertexAttrib *()的作品()/ 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。



文章来源: Strange glVertexAttrib Behavior?