21

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

頂点シェーダー

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の値がどのように変わるのでしょうか。私が欠けているものは何ですか?

4

2 に答える 2

36

gl_Colorさまざまな場所でさまざまなことを意味します。

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

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

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

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

于 2011-06-21T18:40:56.163 に答える
2

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

于 2011-06-21T18:31:03.430 に答える