9

伙计们,我正在尝试在我的 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 什么正确的“索引”?

4

1 回答 1

13

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

glVertexAttrbDivisorARB仅适用于通用属性。即用户定义的着色器属性。它不适用于除由 指定的属性以外的任何属性glVertexAttrib(I)Pointer

NVIDIA 早就实现了属性别名的行为。Thatgl_MultiTexCoorc[0]也有属性索引 8。 that gl_Vertex,顶点位置输入,有属性索引 0。

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

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

哦,如果您想知道规范中的哪个地方这么说,请参阅 OpenGL 3.3 兼容性配置文件,第 94 页,最底部:

不能用常规属性为通用属性起别名。

于 2011-09-01T03:30:17.557 回答