GLSL 着色器程序

除了使用 Cg/HSL 着色器程序,还可直接编写 OpenGL 着色语言 (GLSL) 着色器。

然而,仅推荐将原始 GLSL 用于测试,或是在您确定您的目标仅为与 Mac OS X 或 OpenGL ES 2.0 兼容的移动设备的时候。在大部分普通情况下,Unity 会将 Cg/HLSL 交叉编译为优化的 GLSL(默认情况下,这是为移动平台进行的操作,但可以通过 #pragma glsl 有选择地为桌面平台开启此功能)

GLSL 代码片段

GLSL 程序代码片段被编写在 GLSLPROGRAMENDGLSL 关键字之间。

在 GLSL 中,所有的着色器函数进入点都必须被称为 main()。Unity 在加载 GLSL 着色器时,会使用顶点 (VERTEX) 预处理器定义为顶点程序加载一次源代码,然后再使用片元 (FRAGMENT) 预处理器定义为片元程序加载一次。因此,在 GLSL 代码片段中区分顶点和片元程序部分的方法是用 #ifdef VERTEX .. #endif#ifdef FRAGMENT .. #endif 将它们包围。每个 GLSL 代码片段都必须包含一个顶点程序和一个片元程序。

标准包含文件与提供 给 Gg 着色器的那些包含文件相匹配。只是它们的扩展名为 .glslincUnityCG.glslinc

顶点着色器输入来自预定义 GLSL 变量(gl_Vertex、gl_MultiTexCoord0 等)或为用户定义属性。通常,仅切线向量需要用户定义属性:

    attribute vec4 Tangent;

从顶点程序到片元程序的数据是通过变化 (varying) 变量传递的,例如:

    varying vec3 lightDir; // vertex shader computes this, fragment shader uses this

Page last updated: 2013-06-26