0

OpenGL ES 2.0 を使用した 2D シーンがあります。有機的な効果をシミュレートするために、さまざまなフェーズで回転する半透明のテクスチャ (一種のノイズ) を含むクワッドを描画する必要があります。2 つのオプションがあると仮定します。

  • 複数のサンプラーを備えたシェーダーを使用して 1 つのクワッドを描画し、各サンプラーのテクスチャ座標を回転させます (頂点シェーダーなど)。
  • 複数の上に重なって回転するクワッドを描画し、異なるテクスチャを各メッシュにバインドします (そして、はるかに単純なシェーディング プログラム)。

四角形 (または四角形) は、頂点配列を使用して描画されます。

glBindVertexArrayOES(vertexArray);

glDrawArrays(GL_TRIANGLE_STRIP, index, numVertex);

最初のオプションは、メッシュが 1 つしかなく、すべてのブレンドがフラグメント シェーダーで 1 回行われるため、より効率的です。glDrawArrays() への呼び出しは 1 つだけです。

一方、2 番目のオプションは、はるかに単純なフラグメント シェーダーを意味し、1 つのテクスチャ ルックアップ (ただし、クワッドごとに N 回と呼ばれます) を使用します。

どちらのオプションにも同じ数のテクスチャ バインディングがありますが、最初のオプションでは、すべてのテクスチャが異なるテクスチャ ユニットにバインドされます。

これらの各オプションのパフォーマンスについて、ご意見をお聞かせください。

4

1 に答える 1

2

複数のテクスチャ ユニットを使用すると、パフォーマンスが向上することは間違いありません。一般的に言えば、データがパイプラインを通過する必要があるトリップが少ないほど、データはより速く終了します。したがって、より多くの操作を単一のフラグメント シェーダーに詰め込むことができれば、より強力になります。

他の方法を検討する唯一の理由は、使用される一時レジスタまたは命令スロットの数やテクスチャ イメージ ユニットなどのハードウェアの制限に遭遇した場合であり、いずれも単純な例には関係ありません。OpenGL ES 2.0 を実装できる最も哀れなハードウェアでも、8 つのテクスチャ ユニットが保証されます。

  • const mediump int gl_MaxVertexTextureImageUnits= 0; // 頂点テクスチャ ルックアップはオプションです
  • const mediump int gl_MaxCombinedTextureImageUnits= 8;
  • const mediump int gl_MaxTextureImageUnits= 8;

ES 2.0 にはテクスチャ単位のマトリックスはありませんが、uniform を使用して独自のものを提供できます。次に、頂点シェーダーで、回転を定義するマトリックスでテクスチャ座標を乗算し、結果をテクスチャ座標の個別のセットの形式でフラグメント シェーダーに渡すことができます。テクスチャ イメージ ユニットの制限に達するまでは、これが推奨される一連のアクションです。

于 2013-09-09T19:56:00.197 に答える