2011-06-21 53 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在頂點着色器可以在片段一個改變gl_Color的價值?我錯過了什麼?

回答

32

gl_Color在不同的地方意味着不同的事情。

在頂點着色器中,gl_Color表示用戶傳遞的主要每頂點顏色屬性。這是使用glColor*調用或由glColorPointer獲取的陣列數據設置的。

在片段着色器中,gl_Color表示正在渲染的三角形的正面的插值顏色。請記住,三角形有一個正面和一個背面。如果啓用面部剔除,則不會呈現一種或另一種(或兩種)的所有面。但是,如果您關閉臉部剔除,則會呈現雙方。

基於三角形的特定面對具有不同的每個頂點輸出值通常是有用的。原色具有正面顏色和背面顏色,表示正面三角形和背面三角形的顏色。這些頂點着色器輸出是gl_FrontColorgl_BackColor

如果您正在進行雙面渲染,則需要設置這兩個值才能使片段着色器的gl_Color輸入表示任何內容。如果您只進行正面渲染,那麼您只需設置gl_FrontColor即可。

+0

這是一個很好的解釋! – vrince

0

gl_Color是您在源中傳遞給頂點的顏色,所以它是一個屬性。 gl_FrontColor(也是BackColor)是根據你看到的基元的哪一側設置片段着色器中的gl_Color的變化。所以如果你看到前面gl_Color將等於gl_FrontColor ...

+3

順便說一下像素着色器在DirectX中。 OpenGL將它們稱爲FragmentShaders,它也更精確。 – Nobody

相關問題