在顶点着色器中更改顶点的颜色

Posted

技术标签:

【中文标题】在顶点着色器中更改顶点的颜色【英文标题】:change the color of a vertex in a vertex shader 【发布时间】:2010-03-31 12:03:58 【问题描述】:

是否可以使用 GLSL 顶点着色器程序设置单个顶点的颜色,就像 gl_Position 改变顶点的位置一样?

【问题讨论】:

您使用哪个 OpenGL 版本? 总是记得解释这一点。 GL_ARB_shading_language_100 扩展 OpenGL 版本,而不是着色器版本。 【参考方案1】:

对于 1.30 之前的 GLSL 版本,您需要写入 gl_FrontColorgl_BackColor 内置函数,它们可以在顶点着色器中访问。阅读 GLSL 1.10 规范 (http://www.opengl.org/registry/doc/GLSLangSpec.Full.1.10.59.pdf) 中的变化以了解更多信息,或阅读 GL_ARB_vertex_shader 扩展规范。

gl_FrontColorgl_BackColor 是采用标准化浮点标量的 4D RGBA 向量。

但这会将所有顶点设置为红色,而不仅仅是一个顶点。这是因为对所有顶点运行相同的顶点着色器。如果要设置单独的颜色,请将glColorPointerglDrawArraysglDrawElementsglDrawRangeElementsglMultiDrawElements 一起使用。 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;

另外,要让顶点着色器像 OpenGL 固定功能管道一样设置变量,请调用函数 ftransform()。

void main()

    ftransform();

【讨论】:

感谢您的回复。顺便说一句,似乎在顶点着色器中使用 gl_FrontColor 时,片段着色器的定义(至少 gl_FragColor = glColor)是强制性的。 err, gl_Position 在片段着色器中设置? glColor 而不是 gl_Color ? ftransform 本身,不设置为 gl_Position ? 在片段着色器中,应该是:gl_FragColor = gl_Color;不是 gl_FragColor = glColor; 更正:顶点着色器中的 gl_ModelViewProjectionMatrix 不是 gl_ModelviewProjectionMatrix(大写 V),片段着色器中的 gl_Color 不是 glColor 只是想感谢您的回答。它为我节省了大量时间和性能!

以上是关于在顶点着色器中更改顶点的颜色的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在着色器中检查绘图模式并相应地更改一些顶点属性?

此顶点着色器中的统一浮动不起作用

顶点着色器中的 Phong 光照

Unity Shaders and Effects Cookbook (7-1) 在Surface Shader 中 访问 顶点颜色

在顶点着色器中定位顶点后如何更新法线?

顶点纹理获取(在顶点着色器中读取纹理)