在 GLSL 中,实际有三种标签可以赋值给我们的变量:
- Uniforms
- Attributes
- Varyings
Uniforms 是一种外界和你的着色器交流的方式。Uniforms 是为在一个渲染循环里不变的输入值设计的。如果你正在应用茶色滤镜,并且你已经指定了滤镜的强度,那么这些就是在渲染过程中不需要改变的事情,你可以把它作为 Uniform 输入。 Uniform 在顶点着色器和片段着色器里都可以被访问到。
Attributes 仅仅可以在顶点着色器中被访问。Attribute 是在随着每一个顶点不同而会发生变动的输入值,例如顶点的位置和纹理坐标等。顶点着色器利用这些变量来计算位置,以它们为基础计算一些值,然后把这些值以 varyings 的方式传到片段着色器。
最后,但同样重要的,是 varyings 标签。Varying 在顶点着色器和片段着色器都会出现。Varying 是用来在顶点着色器和片段着色器传递信息的,并且在顶点着色器和片段着色器中必须有匹配的名字。数值在顶点着色器被写入到 varying ,然后在片段着色器被读出。被写入 varying 中的值,在片段着色器中会被以插值的形式插入到两个顶点直接的各个像素中去。
2. 内建输出变量
片元着色器中的内建输出变量主要有 gl_FragColor 与 gl_FragData,在片元着色器中根据具体情况需要给这两个内建变量写入值。实际开发中,对这两个内建变量赋值时应该根据具体情况仅选用其中的一个,而不应该同时对这两个都进行赋值。若执行了discard操作则两个内建变量都不需要写入值了。大部分的情况下,都是给 gl_FragColor 内建变量赋值了。
(1) gl_FragColor
gl_FragColor (vec4类型) 内建变量用来由片元着色器写入计算完成的片元颜色值,此颜色值将送入渲染管线的后继阶段进行处理。
(2) gl_FragData
gl_FragData 内建变量本身是一个vec4类型的数组,写入时要给出下标,如”gl_FragData[0]”。通过其写入的信息将供渲染管线中的后续过程使用。