2016-07-17 6 views
0

アップルは、フラグメントシェーダで計算されたUV座標を使用するテクスチャの読み込みを避けることを推奨しています。 (https://developer.apple.com/library/ios/documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/BestPracticesforShaders/BestPracticesforShaders.htmlフルスクリーンテクスチャからのサンプリング時に依存テクスチャの読み込みを防止する方法

ここで、私はいくつかの3Dモデルをレンダリングしており、関連するフラグメントシェーダではフルスクリーンテクスチャからサンプルする必要があるとします。サンプルの位置は、画面上の現在のフラグメントの位置に対応する必要があります。

この全画面テクスチャをサンプリングするためにUVを計算する最も簡単な方法は、gl_FragCoord.xy/u_viewportWidthを使用することですが、Applesのガイドラインによれば、従属テクスチャの読み込みが導入されるようになりました。ピクセルシェーダでUVを生成します。

基本的に各頂点のスクリーン位置を計算し、UVを取得するためにビューポート分割を行い、この座標をフラグメントシェーダに変化として渡すことによって、UV計算を頂点シェーダにプルすることができます。しかし、私は、UV値が実際にハードウェアによって正しく補間されるかどうかについて疑問を呈します。 (これは有効なアプローチですか?)

それ以外の場合は、ピクセルシェーダーでUVを計算する必要はありませんか?

+0

"* Appleは、フラグメントシェーダで計算されたUV座標を使用するテクスチャの読み込みを避けることを推奨します。*"いいえ、そうではありません。彼らは単に、それらを「認識」し、潜在的なパフォーマンスの影響を言います。シンプルなパフォーマンスの警告を「すべてのコストをかけてクリアに」と誤解しないでください。 –

答えて

2

しかし、私はUV値が実際にハードウェアによって正しく補間されるかどうかは疑問です。 (これは有効なアプローチですか?)

あなたは良い本能を持っています。それらは正しく補間されません。 Perspectiveの正しい補間は、真の線形補間が必要なまれなケースの1つなので、このアプローチを混乱させます。 OpenGL ES 3.2にはnoperspectiveの修飾子がありません(ただし、Vulkan にはのサポートが必要です)。私はESワーキンググループがボールを落としたと推測しています。

正規化されたスクリーン座標を計算せずにフラグメントシェーダーに取り込む方法はありません。

+0

確認していただきありがとうございます – user8709

+0

頂点シェーダで*パースペクティブディビジョンを使用しない正規化座標*を計算し、 'textureProj()'を使用してフラグメントシェーダをサンプリングすることができますか?私はそれを考えていない、ちょうど私の心を越えた... –

+0

@ Retekara:私は 'textureProj'が非透視 - 正しく補間された値を透視正しい補間された値に調整できるとは思わない。 –

関連する問題