2011-06-21 14 views
17

パススルー頂点とフラグメントシェーダがあります。頂点シェーダとフラグメントシェーダの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の値を変更することができますどのように、混乱していますか?私は何が欠けているのですか?

答えて

32

gl_Colorは別の場所で異なることを意味します。

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

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

三角形の特定の面に基づいて異なる頂点ごとの出力値を持つことは、しばしば有用です。プライマリカラーは前面カラーとバックカラーを持ち、前面を向いている三角形と背面を向いている三角形の色を表します。これらの頂点シェーダの出力はgl_FrontColorgl_BackColorです。

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

+0

それは良い説明です! – vrince

0

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

+3

ところでピクセルシェーダはDirectXにあります。 OpenGLはそれらをFragmentShadersと呼びます。これはより正確です。 – Nobody

関連する問題