【问题标题】:glVertexAttribDivisor and index inputglVertexAttribDivisor 和索引输入
【发布时间】:2011-09-01 03:20:52
【问题描述】:

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

【问题讨论】:

    标签: opengl graphics ati


    【解决方案1】:

    它适用于 NVIDIA 卡,因为 NVIDIA 未正确实施 OpenGL 规范。

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

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

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

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

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

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

    【讨论】:

    • 还有一个。你的意思是顶点位置 gl_Position 不应该有属性索引 0?或者常规顶点属性的索引信息,如gl_Position、gl_Normal,不应对外显式或固定。
    • @giggle:我的意思是你不能使用任何通用属性命令来影响 gl_Position、gl_Normal 等内置属性的值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-05
    • 2022-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多