2013-08-15 11 views
20

ウィンドウに静的な三角形を描画する単純なhello-world OpenGLプログラムでは、 三角形の3つの頂点を赤、緑、青の色に設定すると、三角形はグラデーションで塗りつぶされます。頂点シェーダはどのようにカラー情報をフラグメントシェーダに渡しますか?

しかし、私はこのようなシェーダを使用する場合:

バーテックスシェーダを:aVertexaColorが頂点バッファから来ている属性は、glVertexAttribPointerの呼び出しを通過

attribute vec4 aVertex; 
attribute vec4 aColor; 

varying vec4 vColor; 

void main(void) { 
    gl_Position = gl_ModelViewMatrix * gl_ProjectionMatrix * aVertex; 
    vColor = aColor; 
} 

フラグメントシェーダ:

varying vec4 vColor; 
void main(void) { 
    gl_FragColor = vColor; 
} 

三角形はまだ勾配で満たされ、そしてここで問題になるのは:

頂点シェーダは、頂点ごとに計算されている場合は、vColorの各インスタンスがなければなりません頂点の色が割り当てられます。頂点の色は、頂点バッファに設定されている赤、緑、青のいずれかでなければなりません。

勾配はどこから来ましたか?

または、別の言葉で言えば、フレッシュシェイダーでは、vColorがいつ頂点の代わりに補間された色になるのですか?

+0

vecやmatの値が変化する場合の詳細は、https://gamedev.stackexchangeを参照してください。com/questions/139720/glsl-varying-interpolation-component-ws-spec-in-the-spec – trusktr

答えて

13

ラスタライザは、ピクセルで断片を吐き出すときに、その位置も重心座標における三角形の頂点に対して与えられています。これらの座標は、頂点シェーダから変化するすべての変数を補間するために使用されます。ほとんどの場合、これはあなたが望むものであり、補間しないことから得られるスピードは今日ではあまり意味がありません。

キーワード「フラット」を使用すると補間が無効になり、代わりに最初の頂点の値を使用します(フラットは、入力/出力キーワードをnewer versions of GLSL )。サイドノートでは

フラグメントは頂点のそれぞれからいくつかの値を必要とする場合、私はこの特に有用であることがわかりました。この場合、ジオメトリシェーダ(for example here)にflat out myVertexValue[3]を使用します。

+3

私は突然補間を適用する前に変数が色に関することを知る必要はないことに気付きました。実際には、コード、法線、TexCoordsなどは頂点間の補間です。 – RnMss

1

グラデーションは、変化するパスがfragmentシェーダに入るときに起こる頂点カラー間の補間に由来します。変化の始まりで「フラット」キーワードを補間したくない場合。中に生成された断片をカバーする必要があるとして、フラグメント-per-pixel.The補間は、デフォルトで起こっている間 あなたの誤解は、おそらく仕事differently.Vertexシェーダが頂点ごとに呼び出されるwork.They方法を頂点とフラグメントのステージ上の知識の欠如に起因します私が言ったように、 "フラット"で補間を無効にすることができます。そのような場合、最初の頂点属性の色はシェイプの全体的な色を定義します。フラグメントシェーダの変数が線形(頂点間の断片の相対位置に基づいて)頂点シェーダ段階で与えられた値の間を補間した結果を持っている「変化」

関連する問題