2010-03-31 264 views
3

是否可以使用GLSL頂點着色器程序設置單個頂點的顏色,就像gl_Position更改頂點的位置一樣?更改頂點着色器中頂點的顏色

+1

您使用哪種OpenGL版本? *總是*記住解釋這一點。 – 2010-03-31 13:26:55

+0

GL_ARB_shading_language_100擴展名 – 2010-03-31 13:30:44

+0

OpenGL版本,不是着色器版本。 – 2010-03-31 15:29:33

回答

8

我想我對你的GLSL經驗有太多瞭解。我很抱歉。

對於GLSL之前版本1.30的版本,您想要寫入gl_BackColor內置插件,這些插件可以在頂點着色器中訪問。詳細瞭解GLSL 1.10規範(http://www.opengl.org/registry/doc/GLSLangSpec.Full.1.10.59.pdf)的更多信息或GL_ARB_vertex_shader擴展規範。

gl_FrontColor和gl_BackColor是採用標準化浮點標量的4D RGBA向量。

但是,這將設置所有頂點爲紅色,而不是一個頂點。這是因爲所有頂點都運行相同的頂點着色器。如果要設置單獨的顏色,請將glColorPointer與glDrawArrays,glDrawElements,glDrawRangeElements或glMultiDrawElement一起使用。由glColorPointer設置的頂點顏色可以在頂點着色器中讀取爲gl_Color。頂點着色器中的gl_Color是每個頂點屬性。

要讀取您在頂點着色器中寫入的顏色,請在片段着色器中讀取內置的變化gl_Color。完成的片段應寫入gl_FragColor。

頂點着色例如:

void main() 
{ 
    gl_FrontColor = gl_Color; 
    gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; 
} 

片段着色器例子:

void main() 
{ 
    gl_FragColor = gl_Color; 
} 

此外,爲了使頂點着色器設置varyings就像OpenGL的固定功能管線,調用函數ftransform( )。

void main() 
{ 
    ftransform(); 
} 
+1

感謝您的回覆。順便說一句,在頂點着色器中使用gl_FrontColor時,似乎片段着色器的定義(至少使用gl_FragColor = glColor)是強制性的。 – 2010-04-01 12:09:55

+0

err,在片段着色器中設置gl_Position? glColor而不是gl_Color?自行變換,而不設置爲gl_Position? – Bahbar 2010-04-02 13:30:52

+0

現在已修復:) – 2010-04-05 23:23:50