GLSL 着色器程序
除了使用 Cg/HSL 着色器程序,还可直接编写 OpenGL 着色语言 (GLSL) 着色器。
然而,仅推荐将原始 GLSL 用于测试,或是在您确定您的目标仅为与 Mac OS X 或 OpenGL ES 2.0 兼容的移动设备的时候。在大部分普通情况下,Unity 会将 Cg/HLSL 交叉编译为优化的 GLSL(默认情况下,这是为移动平台进行的操作,但可以通过 #pragma glsl
有选择地为桌面平台开启此功能)
GLSL 代码片段
GLSL 程序代码片段被编写在 GLSLPROGRAM 和 ENDGLSL 关键字之间。
在 GLSL 中,所有的着色器函数进入点都必须被称为 main()。Unity 在加载 GLSL 着色器时,会使用顶点 (VERTEX) 预处理器定义为顶点程序加载一次源代码,然后再使用片元 (FRAGMENT) 预处理器定义为片元程序加载一次。因此,在 GLSL 代码片段中区分顶点和片元程序部分的方法是用 #ifdef VERTEX .. #endif 和 #ifdef FRAGMENT .. #endif 将它们包围。每个 GLSL 代码片段都必须包含一个顶点程序和一个片元程序。
标准包含文件与提供 给 Gg 着色器的那些包含文件相匹配。只是它们的扩展名为 .glslinc:UnityCG.glslinc。
顶点着色器输入来自预定义 GLSL 变量(gl_Vertex、gl_MultiTexCoord0 等)或为用户定义属性。通常,仅切线向量需要用户定义属性:
attribute vec4 Tangent;
从顶点程序到片元程序的数据是通过变化 (varying) 变量传递的,例如:
varying vec3 lightDir; // vertex shader computes this, fragment shader uses this,