web-dev-qa-db-ja.com

頂点シェーダーとフラグメントシェーダーの両方でのgl_Colorとgl_FrontColorの関係は何ですか

パススルー頂点シェーダーとフラグメントシェーダーがあります。

頂点シェーダー

void main(void)
{
    gl_TexCoord[0] = gl_MultiTexCoord0;
    gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
}

フラグメントシェーダー

void main(void)
{
    gl_FragColor = gl_Color;
}

それらは空のレンダリングを生成します(glClearBufferのように背景色ではなく黒)。

頂点シェーダーを変更してgl_FrontColorをgl_Colorに設定すると、手付かずのOpenGlバッファーがレンダリングされます...パススルーシェーダーの予想される動作です。

void main(void)
{
    gl_FrontColor = gl_Color; //Added line
    gl_TexCoord[0] = gl_MultiTexCoord0;
    gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
}

混乱しています。頂点シェーダーのgl_FrontColorを設定すると、フラグメント1のgl_Colorの値がどのように変わるのでしょうか。私が欠けているものは何ですか?

20
vrince

gl_Colorは、場所によって意味が異なります。

頂点シェーダーでは、gl_Colorはユーザーから渡された主要な頂点ごとの色属性を表します。これは、glColor*呼び出しまたはglColorPointerによってフェッチされた配列データを使用して設定されます。

フラグメントシェーダーでは、gl_Colorは、レンダリングされる三角形の面の補間色を表します。三角形には前面と背面があることに注意してください。面カリングを有効にすると、一方または他方(または両方)のすべての面がレンダリングされません。ただし、フェイスカリングをオフにすると、両面がレンダリングされます。

三角形の特定の面に基づいて、頂点ごとの出力値を変えると便利なことがよくあります。原色には、前面の色と背面の色があり、前面の三角形と背面の三角形の色を表します。これらの頂点シェーダー出力は、gl_FrontColorgl_BackColorです。

両面レンダリングを行う場合、フラグメントシェーダーのgl_Color入力が何かを意味するようにするには、これらの値の両方を設定する必要があります。正面レンダリングのみを行う場合は、gl_FrontColorを設定するだけで済みます。

34
Nicol Bolas

gl_Colorは、ソースで頂点に渡した色であるため、属性です。 gl_FrontColor(およびBackColor)は、プリミティブのどちら側に表示されるかに応じて、フラグメントシェーダーのgl_Colorを設定するバリエーションです。したがって、フロントを見ると、gl_Colorはgl_FrontColorと等しくなります...

1
Nobody