glVertexAttribDivisor和索引输入

gig*_*gle 9 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);
    }
Run Code Online (Sandbox Code Playgroud)

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

Nic*_*las 13

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

glVertexAttrbDivisorARB仅适用于通用属性.也就是说,用户定义的着色器属性.它并不能在比由规定的其他任何属性的工作glVertexAttrib(I)Pointer.

NVIDIA长期以来实现了属性别名的行为.这gl_MultiTexCoorc[0]还具有属性索引8.即gl_Vertex,顶点位置输入,具有属性索引0.

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

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

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

通用属性不可能与常规属性别名.