マルチサンプルレンダリング中にフラグメントシェーダーがどのように呼び出されるかを理解しようとしています。仕様を注意深く読みましたが、少し混乱しています。
色とデプス/ステンシルレンダーバッファを使用してマルチサンプルFBOをセットアップします。
変換専用の単純な1行の頂点シェーダーと、黒色を返す別の1行のフラグメントシェーダーをセットアップしました。
線を引きます-線は滑らかに表示されます..細かい
ここで、フラグメントシェーダーで、ぼんやりと黒い色を返す代わりに、マルチサンプルテクスチャからtexelFetchを実行し、常にサンプル番号0(つまり、黒)を読み取ると、ギザギザの線が表示されます。
シンプルmyoutcolor=vec4(0.0)
と?の違いはmyoutcolor=texelFetch(mysampler2DMS,...,0)
何ですか?
仕様では、フラグメントシェーダーは、静的に、、、gl_SampleID
またはgl_Samplemask[]
「サンプル」ストレージ修飾子を使用する場合にのみサンプルレベルで実行されると規定されています(これらすべての場合、これはGLSL#version 400
以上を意味します)。それ以外の場合は、フラグメントレベルで実行されます。 。
しかし、どうしてそれができるのでしょうか?上記の例では、常に同じ色を返しても滑らかな線が得られたので、フラグメントシェーダーは常にマルチサンプルフレームバッファーのサンプルレベルで実行されると考えました。一方、そうでない場合は、 MSテクスチャから常に同じサンプルを返す場合でも、スムーズな結果が得られるはずです。
誰かが私がこれを理解するのを手伝ってくれる?
PS:現在#version 330を使用していますが、MS(、、 sample ..)を正しく処理する必要があるすべてのマルチサンプリング対応ステートメントgl_SampleID
はgl_Samplemask[]
GLSL 400以降でのみサポートされていることがわかりました。したがって、GLSL330が提供するサポートは正確には何ですか。マルチサンプリングを正しく処理するために?GLSL 330でMSテクスチャを処理するにはどうすればよいですか?