大多数GLSL着色器在顶点着色器中使用颜色属性,该属性将作为变化转发到片段着色器。像这样:
attribute vec4 position;
attribute vec4 color;
uniform mat4 mvp;
varying vec4 destinationColor;
void main(){
destinationColor = color;
gl_Position = mvp * position;
};
可以使用glVertexAtribPointer()
设置颜色,以便为每个顶点传递一种颜色或使用glVertexAttrib4fv()
传递所有顶点的全局颜色。我尝试理解顶点着色器中预定义变量gl_Color
的差异(如果有任何差异)。即。
attribute vec4 position;
uniform mat4 mvp;
varying vec4 destinationColor;
void main(){
destinationColor = gl_Color;
gl_Position = mvp * position;
};
并使用glColorPointer()
为每个顶点传递一种颜色或使用glColor4fv()
为所有顶点使用全局颜色。对我来说,第二个着色器看起来更好(=效率更高?),因为它使用较少的属性。但是所有的教程和在线资源正在使用第一种方法 - 所以我想知道我是否遗漏了任何东西或者根本没有差别。
编写GLSL着色器时有什么更好的做法?
答案 0 :(得分:3)
对我来说,第二个着色器看起来更好(=效率更高?),因为它使用较少的属性。
它不使用更少的属性。它只使用较少的显式属性声明。为OpenGL获取该颜色值所需的所有工作仍然存在。它还在做。硬件仍在从缓冲区对象获取数据或从glColor
上下文值或其他任何内容获取数据。
您只是在着色器的文字中看不到它。但仅仅因为你没有看到它并不意味着它是免费发生的。
出于以下原因,首选用户定义的属性:
gl_*
名称。所以基本上,这些天没有理由使用它们。
答案 1 :(得分:1)
如果我没记错,gl_Color
已弃用旧版 API ,不使用 VAO / VBO 使用glBegin() ... glEnd()
。如果您转到核心配置文件,则不再有gl_Color ...所以我假设您使用旧的OpenGL版本或兼容性配置文件。
如果您尝试在核心配置文件中使用gl_Color
(例如4.00),您可以:
0(35) : error C7616: global variable gl_Color is removed after version 140
这意味着gl_Color
已从 GLSL 1.4
如果您愿意,这不仅仅是性能问题,而是图形渲染 SW 架构或 GL 层次结构的变化。