1

OpenGL ES 2.0 フラグメント シェーダーでミップマップされたテクスチャの詳細レベルを理解しようとしています。

この回答によると、biasパラメーターを使用texture2Dしてフラグメントシェーダーの特定の詳細レベルにアクセスすることはできません。この投稿によると、詳細レベルは代わりに、隣接するフラグメントの並列実行から自動的に計算されます。それが物事の仕組みだと信じなければなりません。

私が理解できないのは、その理由です。特定のレベルの詳細にアクセスできないのはなぜですか?実際には非常に簡単なはずなのに、アクセスできないのはなぜですか? なぜ代わりに複雑な固定機能に頼らなければならないのでしょうか?

私には、これは非常に直感に反するように思えます。結局のところ、OpenGL 関連のものはすべて、固定機能から離れて進化しています。また、OpenGL ES は、OpenGL よりも幅広いハードウェアをカバーすることを目的としているため、多くの単純なバージョンのみをサポートしています。したがって、仕様の開発者が LOD パラメーターを必須 (おそらくデフォルトはゼロ) であると判断し、シェーダー プログラマーが適切と考える方法で適切な LOD を計算する必要があることを完全に理解できます。その計算を自動的に行う関数を追加することは、デスクトップの OpenGL で期待していたことのように思えます。

特定のレベルへの直接アクセスを提供しないことは、どう見ても私にはまったく意味がありません。特に、そのbiasパラメーターは実際に詳細レベルを微調整できることを示しているため、これは明らかに、並列処理される一連のフラグメントの単一レベルのメモリからデータをフェッチすることではありません。他に理由が思いつきません。


もちろん、なぜ質問が意見を引き寄せる傾向があるのか​​. ただし、Stack Overflow では意見に基づく回答は受け付けていないため、意見はコメントとしてのみ投稿してください。一方、回答は、明確な知識を持っている人の発言など、検証可能な事実に基づいている必要があります。この事実について開発者が話し合った記録があれば、それで完璧です。内部の誰かがこの問題について議論しているブログ投稿があれば、それは非常に良いことです。

スタック オーバーフローの質問は実際のプログラミングの問題に対処する必要があるため、理由を尋ねるのは悪い質問であると主張する人もいるかもしれません。答えを得ても、その明示的な lod アクセスが突然現れるわけではないので、差し迫った問題の解決には役立ちません。しかし、ここでの理由は、これまで把握していなかった OpenGL ES の動作に関する重要な側面にあるのではないかと思います。その場合、この 1 つの決定の背後にある動機を理解することは、私や他の人が OpenGL ES 全体をよりよく理解し、パフォーマンス、正確性、移植性などの点でプログラムでより有効に利用するのに役立ちます。 . したがって、私はこの質問を「何が欠けているのか?」と述べたかもしれませんが、これは現時点で私にとって非常に現実的なプログラミングの問題のように感じます。

4

1 に答える 1

8

texture2DLod (...)頂点シェーダー テクスチャ ルックアップで非常に重要な目的を果たしますが、フラグメント シェーダーでは必要ありません。

フラグメント シェーダーでテクスチャ ルックアップが発生すると、フラグメント シェーダーは、現在シェーディングされているプリミティブの属性ごとのグラデーション (dFdx (...)やなどの部分的な導関数) にアクセスし、この情報を使用して、フィルタリング中に隣接するテクセルをフェッチする LOD を決定します。 dFdy (...).

頂点シェーダーの実行時には、プリミティブに関する情報は不明であり、そのようなグラデーションはありません。頂点シェーダーでミップマップを利用する唯一の方法は、特定の LOD を明示的にフェッチすることです。そのため、その機能が導入されました。

デスクトップ OpenGL は、入力の 1 つとしてグラデーションを実際に取る頂点シェーダーのテクスチャ ルックアップのバリアントを提供することで、この問題をもう少しインテリジェントに解決しました。この関数は と呼ばtextureGrad (...)れ、GLSL 1.30 で導入されました。ESSL 1.0 は GLSL 1.20 から派生したものであり、すべて同じ基本的なハードウェア機能の恩恵を受けるわけではありません。

ES 3.0 にはこの制限がなく、デスクトップ GL 3.0 にもありません。明示的な LOD ルックアップがデスクトップ GL (3.0) に導入されたとき、それはどのシェーダー ステージからでも実行できました。それは単に見落としである可能性があり、またはいくつかの基本的なハードウェアの制限がある可能性があります (古い GPU には特殊な頂点およびピクセル シェーダー ハードウェアがあり、組み込み GPU が GPU 設計の最先端にあることは決してないことを思い出してください)。


この制限の元の理由が何であれ、後の OpenGL ES 2.0 拡張で修正され、OpenGL ES 3.0 のコアとなっています。次の拡張機能を使用すると、最新の GL ES 2.0 実装が実際にフラグメント シェーダーで明示的な LOD ルックアップをサポートする可能性が非常に高くなります。

GL_EXT_shader_texture_lod

フラグメント シェーダーでの明示的な LOD ルックアップを示す疑似コード:

#version 100
#extension GL_EXT_shader_texture_lod : require

attribute vec2      tex_st;
uniform   sampler2D sampler;

void main (void)
{
  // Note the EXT suffix, that is very important in ESSL 1.00
  gl_FragColor = texture2DLodEXT (sampler, tex_st, 0);
}
于 2015-03-11T12:11:17.203 に答える