Glsl 颜色属性与使用gl_颜色之间的差异

Glsl 颜色属性与使用gl_颜色之间的差异,glsl,shader,vertex-shader,Glsl,Shader,Vertex Shader,大多数GLSL着色器都使用顶点着色器中的颜色属性,该属性将随片段着色器的变化而转发。像这样: attribute vec4 position; attribute vec4 color; uniform mat4 mvp; varying vec4 destinationColor; void main(){ destinationColor = color; gl_Position = mvp * position; }; 可以使用glvertexattribPointer()为每

大多数GLSL着色器都使用顶点着色器中的颜色属性,该属性将随片段着色器的变化而转发。像这样:

attribute vec4 position;
attribute vec4 color;
uniform mat4 mvp;
varying vec4 destinationColor;

void main(){
  destinationColor = color;
  gl_Position = mvp * position;
};
可以使用
glvertexattribPointer()
为每个顶点传递一种颜色,或使用
glVertexAttrib4fv()
为所有顶点传递全局颜色来设置颜色。我试图理解顶点着色器中预定义变量
gl_Color
的差异(如果存在任何差异)。i、 e

并使用
glColorPointer()
为每个顶点传递一种颜色,或使用
glColor4fv()
为所有顶点使用全局颜色。对我来说,第二个着色器看起来更好(=更高效?),因为它使用的属性更少。但是所有的教程和在线资源都使用第一种方法,所以我想知道我是否遗漏了什么,或者根本没有区别。
编写GLSL着色器时有什么更好的做法?

如果我没记错的话,
gl_Color
是旧样式API的弃用残余,没有VAO/VBO使用
glBegin()。。。glEnd()
。如果你去核心配置文件那里没有gl_颜色了。。。所以我假设您使用旧的OpenGL版本或兼容性配置文件

如果您尝试在core profile(例如4.00)中使用
gl_颜色
,您会得到:

这意味着
glu Color
已从GLSL 1.4


这不完全是性能的问题,而是图形渲染SW架构或GL调用层次结构的变化,如果您愿意的话。

如果我没记错的话
glu Color
是旧样式API的不推荐使用
glBegin()。。。glEnd()
。如果你去核心配置文件那里没有gl_颜色了。。。所以我假设您使用旧的OpenGL版本或兼容性配置文件

如果您尝试在core profile(例如4.00)中使用
gl_颜色
,您会得到:

这意味着
glu Color
已从GLSL 1.4

这不完全是性能问题,而是图形渲染SW架构或GL调用层次结构的变化(如果需要)

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

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

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

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

  • 用户定义的属性可以明确着色器使用的资源数量。如果您想知道需要为着色器提供多少属性,只需查看全局声明。但是使用预定义的属性,您无法做到这一点;您必须在整个顶点着色器中扫描命名预定义属性的任何
    gl.*
    名称
  • 用户定义的属性可以做更多的事情。如果要将整数值作为整数传递给顶点着色器,则必须使用用户定义的属性。如果需要将双精度浮点值传递给顶点着色器,则预定义属性同样无法帮助您
  • 预定义属性已从核心OpenGL上下文中删除。例如,OSX不允许兼容配置文件。您仍然可以使用OpenGL 2.1,但如果您想在OSX上使用任何OpenGL 3.2或更高版本,则不能使用已删除的功能。并且在OpenGL 3.1中删除了内置的顶点属性
  • 预定义属性从来都不是OpenGL ES 2.0+的一部分。因此,如果您想要编写可以在OpenGL ES中工作的着色器,那么您同样不能使用它们
所以基本上,现在没有理由使用它们

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

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

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

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

  • 用户定义的属性可以明确着色器使用的资源数量。如果您想知道需要为着色器提供多少属性,只需查看全局声明。但是使用预定义的属性,您无法做到这一点;您必须在整个顶点着色器中扫描命名预定义属性的任何
    gl.*
    名称
  • 用户定义的属性可以做更多的事情。如果要将整数值作为整数传递给顶点着色器,则必须使用用户定义的属性。如果需要将双精度浮点值传递给顶点着色器,则预定义属性同样无法帮助您
  • 预定义属性已从核心OpenGL上下文中删除。例如,OSX不允许兼容配置文件。您仍然可以使用OpenGL 2.1,但如果您想在OSX上使用任何OpenGL 3.2或更高版本,则不能使用已删除的功能。并且在OpenGL 3.1中删除了内置的顶点属性
  • 预定义属性从来都不是OpenGL ES 2.0+的一部分。因此,如果您想要编写可以在OpenGL ES中工作的着色器,那么您同样不能使用它们
所以基本上,现在没有理由使用它们

attribute vec4 position;
uniform mat4 mvp;
varying vec4 destinationColor;

void main(){
  destinationColor = gl_Color;
  gl_Position = mvp * position;
};
0(35) : error C7616: global variable gl_Color is removed after version 140