2010-03-31 263 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