1

OpenGL ES 2.0 の制限に関する Apple のドキュメントによると、 「フラグメント シェーダーでは最大 8 つのテクスチャを使用できます。」

これはそれほど具体的ではないように思われるので、「フラグメント シェーダーのパスごとに最大 8 つのテクスチャ ユニットを参照できる」という意味だと思っていました。

つまり、フラグメント シェーダーの特定のパスで、テクスチャ ユニット 0 から始まる 1 つのテクスチャ ユニットのみを参照します。次のパスでは、ユニット 1 を参照します。次のパスでは、ユニット 2 などを参照します。 . 上記の仮定に基づいて、これは最大で正常に機能するはずですGL_MAX_COMBINED_TEXTURE_IMAGE_UNITS.

ただし、ユニット 7 までしか機能しないようで、ユニット 8 以上で壊れます。

これにより、最大のテクスチャ ユニットに到達するように聞こえますか? または、何か不足していますか?

実際にフラグメント シェーダーで許容されるテクスチャ ユニットの上限に達している場合は、変更可能なプログラムの配列を保持し、定義したテクスチャの数に必要な数のプログラムを実行時にビルドすることになると思います。 、8 の倍数であるテクスチャ ユニット インデックスのステップをヒットしたら、適切なプログラムに切り替えます。

これは合理的に聞こえますか、それとも何か不足していますか?

4

1 に答える 1

1

次のような方法で、デバイス上のテクスチャユニットの最大数を照会できます。

+ (GLint)maximumTextureUnitsForThisDevice;
{
    GLint maxTextureUnits; 
    glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &maxTextureUnits);
    return maxTextureUnits;
}

私が持っている最も強力なデバイスであるRetinaiPadでこれを実行すると、最大8つのテクスチャユニットが得られます。これは、テクスチャを上記のものにバインドできないことを意味しGL_TEXTURE7、シェーダーにフィードできる同時テクスチャの数を8に制限します。

ただし、Timがコメントで示唆しているように、一度に1つのテクスチャにアクセスする必要がある場合は、各テクスチャを1つのユニットに順番にバインドして処理し、次のテクスチャを同じユニットにバインドすることを妨げるものは何もありません。

于 2012-08-02T15:00:34.413 に答える