glVertexAttribDivisor和索引输入

时间:2011-09-01 03:20:52

标签: opengl graphics ati

人, 我试图在我的OpenGL实例绘图中使用glVertexAttribDivisor。

它适用于NV卡,但在ATI卡中不起作用。什么都没画。

从GlExtensionViewer,它显示这两种卡都支持glVertexAttribDivisor / InstancedStream。跑步时没有错误。

我不知道这是否是由于我的错误用法。

我将实例数据放在一个单独的顶点数组缓冲区中,然后将其映射到gl_MultiTexCoord0~3。实例数据是世界矩阵。

代码在这里。

    for( int i=0;i<3;i++)
    {
        glClientActiveTexture(kGL_TEXTURE0 + i);
        glTexCoordPointer(size, type, stride, i*4*sizeof(float));

        int instanceVertexAttribIndex = i + 8;
        glVertexAttribDivisorARB(instanceVertexAttribIndex, 1);
    }

关键问题是如果我尝试将实例数据放在gl_MultiTexCoord0上,我应该给glVertexAttribDivisorARB正确的“索引”吗?

1 个答案:

答案 0 :(得分:13)

它适用于NVIDIA显卡,因为NVIDIA没有正确实现OpenGL规范。

glVertexAttrbDivisorARB仅适用于通用属性。也就是说,用户定义的着色器属性。除<{1}}指定的属性外,它 不会处理任何属性。

NVIDIA长期以来实现了属性别名的行为。 glVertexAttrib(I)Pointer也有属性索引8. gl_MultiTexCoorc[0],顶点位置输入,属性索引为0.

问题? OpenGL规范不允许这样做。它特别要求实现失败并在尝试时给出错误。当你设置这些数组调用gl_Vertex时,你的实现应该会给你一个错误。

可悲的是,你陷入了NVIDIA陷阱:使用非规范行为,这恰好恰好影响了他们的驱动程序。我想你一定是从一些NVIDIA论文中得到了这个想法。因此,现在您必须更改所有代码以使用用户定义的属性而不是内置属性。

哦,如果你想知道它在说明书中的哪个位置,请参阅OpenGL 3.3兼容性配置文件,第94页,最底层:

  

不可能将常规属性与常规属性别名。