1. ホーム
  2. opengl

[解決済み] 頂点シェーダとフラグメントシェーダにおけるgl_Colorとgl_FrontColorの関係を教えてください。

2022-02-10 17:42:04

質問事項

バーテックスとフラグメントのパススルーシェーダーがあります。

バーテックスシェーダ

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 を設定すると、フラグメントシェーダで gl_Color の値がどのように変化するのか、混乱しています。私は何を見逃しているのでしょうか?

解決方法は?

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

バーテックスシェーダーで gl_Color は、ユーザーから渡された主な頂点ごとの色属性を表します。これは glColor* の呼び出しや配列データの取得は glColorPointer .

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

三角形の特定の面に基づいて、頂点ごとの出力値が異なると便利なことがよくあります。原色には前面カラーと背面カラーがあり、正面を向いた三角形と背面を向いた三角形のカラーを表します。これに対するバーテックスシェーダ出力は gl_FrontColorgl_BackColor .

両面レンダリングを行う場合、フラグメントシェーダの gl_Color の入力は何の意味も持ちません。フロントフェイス・レンダリングのみを行う場合は、以下のように gl_FrontColor .