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はOpenGL仕様を適切に実装していないため、NVIDIAカードで機能します。

glVertexAttrbDivisorARB汎用属性でのみ機能します。つまり、ユーザー定義のシェーダー属性です。で指定された属性以外の属性では機能しませglVertexAttrib(I)Pointer

NVIDIAは、属性エイリアシングの動作を長い間実装してきました。これgl_MultiTexCoorc[0]には、属性インデックス8もあります。つまりgl_Vertex、頂点位置入力には、属性インデックス0があります。

問題?OpenGL仕様ではこれは許可されていません。具体的には、実装が失敗し、試行するとエラーが発生する必要があります。glDraw*これらの配列を設定して呼び出すと、実装でエラーが発生するはずです。

悲しいことに、あなたはNVIDIAの罠に巻き込まれました:彼らのドライバーでたまたま機能する非仕様の振る舞いを使用しています。NVIDIAの論文からアイデアを得たに違いないと思います。したがって、組み込みの属性ではなくユーザー定義の属性を使用するように、すべてのコードを変更する必要があります。

ああ、仕様のどこにこれが記載されているのか疑問に思っている場合は、OpenGL 3.3互換性プロファイル(94ページ)の一番下を参照してください。

一般的な属性を従来の属性にエイリアスすることはできません。

于 2011-09-01T03:30:17.557 に答える