着色器(Shader)

时间:2023-03-09 04:27:33
着色器(Shader)

着色器(Shader)

  • 顶点着色器(Vertex shader)
  • 片段着色器(Fragment shader)
  • 几何着色器(Geometry Shader)
  • 提供通用计算能力的着色器(Compute Shader)

顶点着色器(Vertex Shader)

每个顶点都要执行一次Vertex Shader。 它的功能就是把每个顶点在虚拟空间中的三维坐标变换为可以在 屏幕上显示的二维坐标,并带有用于z-buffer的深度信息。
可操作属性:位置、颜色、纹理坐标,但是不能创建新的顶点。

主要完成以下工作:

  • 基于点操作的矩阵乘法位置变换
  • 根据光照公式计算每点的color值
  • 生成或者转换纹理坐标

顶点着色器的输入

  • attribute
  • uniform
  • sampler

attribute

attribute可以理解为针对每一个顶点的输入数据,如空间位置,法向量,纹理坐标以及顶点颜色。
它只在顶点着色器中才有,片段着色器中没有属性

uniform

uniform保存由应用程序传递给着色器的只读常量数据
在顶点着色器中,这些数据通常是变换矩阵,光照参数,颜色等。
由 uniform 修饰符修饰的变量属于全局变量,该全局性对顶点着色器与片段着色器均可见
若这两个着色器如果被连接到同一 个program Object,则它们共享同一份 uniform 全局变量集
因此如果在这两个着色器中都声明了同名的 uniform 变量,要保证这对同名变量完全相同:同名+同类型,因为它们实际是同一个变量
此外,uniform 变量存储在常量存储区

sampler

一种特殊的 uniform,在vertex shader中是可选的,用于呈现纹理。sampler 可用于顶点着色器和片段着色器。

顶点着色器输出

  • varying
  • 内建变量

varying

varying 变量用于存储顶点着色器的输出数据,当然也存储片元着色器的输入数据,varying 变量最终会在光栅化处理阶段被线性插值。
顶点着色器如果声明了 varying 变量,它必须被传递到片元着色器中才能进一步传递到下一阶段,因此顶点着色器中声明的 varying 变量都应在片元着色器中重新声明同名同类型的 varying 变量。

内建变量

如:gl_Position, gl_FrontFacing, gl_PointSize

片段着色器(Fragment Shader)

它计算每个像素的颜色和其它属性。它通过应用光照值、凹凸贴图,阴影,镜面高光,半透明等处理来计算像素的颜色并输出。它也可改变像素的深度(z-buffering)或在多个渲染目标被激活的状态下输出多种颜色。一个Pixel Shader不能产生复杂的效果,因为它只在一个像素上进行操作,而不知道场景的几何形状。

片段着色器的输入数据

  • varying
  • uniform
  • sampler

varying

顶点着色器阶段输出的 varying 变量在光栅化阶段被线性插值计算之后输出到片元着色器中作为它的输入,包含上述中的 gl_FragCoord,gl_FrontFacing 和 gl_PointCoord。

uniform

前面也已经讲过,这里是用于片元着色器的常量,如雾化参数,纹理参数等

sampler

一种特殊的 uniform,用于呈现纹理

在片段着色器阶段只有唯一的 varying 输出变量-即内建变量:gl_FragColor