颜色属性和使用gl_Color之间的区别



大多数 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 着色器时更好的做法是什么?

对我来说,第二个着色器看起来更好(=更有效?(,因为它使用更少的属性。

它不会使用更少的属性。它只是使用较少的显式属性声明。将颜色值获取到OpenGL所需的所有工作仍然存在。它仍在进行中。硬件仍在从缓冲区对象获取数据或从glColor上下文值或其他任何内容获取数据。

您只是在着色器的文本中看不到它。但仅仅因为你没有看到它并不意味着它是免费的。

出于以下原因,首选用户定义的属性:

  • 用户定义的属性可以清楚地显示着色器正在使用多少资源。如果想知道需要向着色器提供多少个属性,只需查看全局声明即可。但是对于预定义的属性,您无法执行此操作;您必须扫描整个顶点着色器,以查找命名预定义属性的任何gl_*名称。
  • 用户定义的属性可以执行更多操作。如果要将整数值作为整数传递到顶点着色器,则必须使用用户定义的属性。如果需要将双精度浮点数传递给顶点着色器,预定义属性也无济于事。
  • 预定义属性已从核心 OpenGL 上下文中删除。例如,OSX 不允许兼容性配置文件。您仍然可以使用 OpenGL 2.1,但如果要在 OSX 上使用任何 OpenGL 3.2 或更高版本,则无法使用已删除的功能。内置的顶点属性在OpenGL 3.1中删除了。
  • 预定义属性从来都不是OpenGL ES 2.0+的一部分。因此,如果你想编写可以在OpenGL ES中工作的着色器,你又不能使用它们。

所以基本上,现在没有理由使用它们。

如果我

没记错的话gl_Color旧式 API 中弃用了 glBegin() ... glEnd() 的 VAO/VBO 残余。如果你去核心配置文件,就没有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 中删除

这并不完全是性能问题,而是图形渲染软件架构或 GL 调用层次结构的更改(如果需要(。

最新更新