9

頂点シェーダーは頂点ごとに 1 回 (つまり三角形では 3 回) 実行されるため、(例のように) 3 回しか割り当てられない場合、可変変数はどのようにフラグメントごとに計算されるのでしょうか?

フラグメント シェーダー:

precision mediump float;
varying vec4 v_Color;

void main() {
    gl_FragColor = v_Color;
}

頂点シェーダー:

attribute vec4 a_Position;
attribute vec4 a_Color;

varying vec4 v_Color;

void main() {
    v_Color = a_Color;
    gl_Position = a_Position;
}

したがって、問題は、このシェーダーが v_Color を 3 回 (三角形で) しか割り当てないため、この背後にあるシステムが各フラグメントで変数 v_Color を計算する方法をどのように知っているかということです。

4

2 に答える 2

3

まず、頂点シェーダーが頂点ごとに 1 回実行されると仮定するのは誤りです。インデックス付きレンダリングを使用すると、プリミティブ アセンブリは通常、頂点インデックスに基づいてポスト T&L キャッシュ (以前の頂点シェーダー呼び出しの結果) にアクセスして、頂点を複数回評価する必要がなくなります。ただし、ジオメトリ シェーダーなどの新しいものは、これを簡単に破綻させる可能性があります。

フラグメント シェーダーがその値を取得する方法については、通常、ラスタライズ中に行われます。これらの頂点ごとの属性は、プリミティブの作成に使用された頂点に対するフラグメントの距離に基づいて、プリミティブの表面 (この場合は三角形) に沿って補間されます。DX11 では、フラグメント シェーダー自体が実行されるまで補間を延期できます (「プル モデル」補間と呼ばれます) が、従来、これはラスタライズ中に発生するものです。

于 2014-04-21T17:20:03.083 に答える