2

私は DirectX で作業していたときに HLSL をコーディングしていましたが、かなり忘れてしまい、現在 GLSL とその仕組みを理解しようとしています。私は OpenFramework で OpenGL の固定パイプラインを使用していますが、これは私にとっては新しい概念ですが、良い出発点です。

私の最初の質問: 頂点シェーダーの場合、フラグメント シェーダーに入る前にすべての頂点が計算されますよね? フレーム バッファに入力されたすべての頂点の Z 座標の最小値/最大値を見つけるなど、ここで情報を事前に計算できますか?

次に、フラグメント シェーダーに入ると、さまざまな変数によってこれらの事前計算された値にアクセスできますか? したがって、可変変数 (頂点の z 位置からの最小値/最大値など) で頂点シェーダーから値を設定すると、後でフラグメント シェーダーからこれらの設定値にアクセスできますか?

また、Z 要素にアクセスするときの組み込み変数 gl_FragCoord は、すべての頂点に対して常に 1.0 を生成するようです。これは、頂点シェーダーで頂点の位置を変換する方法に関連していますか?

最後に、すべての頂点の最小/最大 Z 位置を見つけてフラグメント シェーダーに渡そうとしていますが、次のコードは正しいですか?

varying float minZ = 9999.9;
varying float maxZ = -9999.9;

void main()
{
    gl_TexCoord[0] = gl_MultiTexCoord0;
    gl_TexCoord[1] = gl_MultiTexCoord1;
    gl_FrontColor  = gl_Color;
    gl_Position    = ftransform();

    if (gl_Position.z < minZ) minZ = gl_Position.z;
    if (gl_Position.z > maxZ) maxZ = gl_Position.z;
}

これが StackOverflow での質問の不適切な方法である場合は申し訳ありません。おそらく、いくつかの質問に分割する必要がありました。

4

1 に答える 1

3

頂点シェーダーの場合、フラグメント シェーダーに入る前にすべての頂点が計算されますよね?

いいえ。

フレーム バッファに入力されたすべての頂点の Z 位置の最小/最大値を見つけるなど、ここで情報を事前に計算できますか?

頂点シェーダーは一度に 1 つの頂点を認識し、GPU は並列で動作するため、直接ではありません。最小/最大を決定するには、map-reduce のようなものが効率的である必要があり、スレッド間で情報を渡す何らかの方法が必要です。実行できますが、あまり効率的ではありません。

コード スニペットminZmaxZは、すべての頂点間で共有されるグローバルではありません。それらは、現在処理されている頂点に関連付けられたローカル変数です。

次に、フラグメント シェーダーに入ると、さまざまな変数によってこれらの事前計算された値にアクセスできますか?

それらは実際には「事前計算」されたものではなく、直前のステップで処理されただけです。最初にすべての頂点に対して頂点シェーダーが実行され、次にフラグメント シェーダーが実行されるわけではありません。各プリミティブ (つまり、1 つの三角形) は、ステージ間に保存されることなく、ステージを通過します。

于 2013-06-10T10:28:22.650 に答える