在哪个着色器中执行计算有什么区别吗

Does it make any difference which shader calculations are performed in?

本文关键字:计算 什么 区别 执行      更新时间:2023-10-16

使用GLSL,我将执行照明计算、纹理和各种操作;但是它在哪个着色器中完成有什么区别吗例如,在顶点着色器而不是片段着色器中执行照明计算是否有性能优势?我只需要将最终结果传递给片段着色器,并将其添加到片段颜色中。反之亦然吗?

我的下一个问题是,关于顶点属性和统一:

顶点属性对于任何着色器程序中的所有着色器都是全局的吗例如,假设我们有:

glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(vertices), (GLvoid*)0);

如果我在顶点着色器中声明:

layout (location = 0) in vec3 VertexPosition; 

我也可以在片段着色器中执行同样的操作吗?我也可以在与第二个着色器程序相关的顶点着色器中执行同样的操作吗

关于制服,我是否可以在该着色器程序的所有着色器中使用制服,只要我声明它们

uniform mat4 modelMatrix; // In the vertex shader
uniform mat4 modelMatrix; // In the fragment shader

我的最后一个问题是,所有顶点属性在整个主程序中都应该一致吗如中所示,如果我将顶点属性0分配为"顶点位置",那么我就不能再将该属性分配给其他对象,如"顶点法线",对吗?只有当我用禁用顶点属性数组时,才会发生这种情况

glDisableVertexAttribArray(0);

我会进行照明计算,纹理和各种各样的;但是它在哪个着色器中完成有什么区别吗?

想想OpenGL管道中的数据流

大多数基本体由1个(点)、2个(线)或3个(三角形)顶点组成,但可能会生成数千个片段。因此,由于顶点着色器的运行频率要低得多,因此每个顶点可以计算的任何东西都比每个片段便宜。

通常,您尽量不计算每个顶点的整个照明方程(gourud),因为除非使用过多的顶点,否则它看起来很糟糕。但是,可以在顶点着色器中将所有照明向量变换到相同的坐标空间中,以简化片段着色器并提高性能。

顶点属性对于任何着色器程序中的所有着色器都是全局的吗?

顶点属性被指定给常规位置,并且这些位置是全局的。但是片段着色器是按每个片段操作的,并且没有顶点的概念(再次回想数据流)。

我是否可以在该着色器程序的所有着色器中使用统一,只要我声明它们?

另一方面,统一格式在所有着色器阶段之间共享。只要名称和类型一致,就可以从顶点、几何体、镶嵌或片段着色器中使用它们。

所有顶点属性是否应该在整个主程序中保持一致?

这真的没关系,可编程管道是可编程的。只要知道执行着色器时N表示的顶点属性,就可以继续。但是,如果建立了标准约定,则可以在不更改顶点属性指针的情况下动态交换着色器程序。

在固定函数管道的时代,有一种标准化的约定,其中顶点位置别名为0,颜色别名为3、法线别名为2等等。但这纯粹是历史性的,如果你想或创建自己的,你可以遵循这个惯例。