在 Unity 中,通常使用 HLSL 编写着色器程序。要将 HLSL 代码添加到着色器资源,应将该代码放在一个着色器代码块中。
注意:Unity 还支持使用其他语言编写着色器程序,不过通常不需要或不建议这样做。有关更多信息,请参阅编写着色器。
本手册的这一部分介绍了有关以 Unity 特定方式使用 HLSL 的信息。有关编写 HLSL 的一般信息,请参阅 Microsoft 的 HLSL 文档。
注意:Unity 最初使用 Cg 语言,这影响了 Unity 一些关键字 (CGPROGRAM) 和文件扩展名 (.cginc) 的名称。Unity 不再使用 Cg,但这些名称仍在使用。
HLSL 有两种语法:旧版的 DirectX 9 样式语法以及更现代的 DirectX 10+ 样式语法。不同之处主要在于纹理采样函数的工作方式:
Unity 提供了包含预处理器宏的着色器库来帮助您管理这些差异。有关更多信息,请参阅内置着色器宏。
__顶点着色器__是在 3D 模型的每个顶点上运行的程序。通常情况下,它并不执行特别复杂的操作。我们在这里只是将顶点位置从对象空间转换为所谓的“裁剪空间”(由 GPU 用于光栅化屏幕上的对象)。我们还传递未修改的输入纹理坐标;我们需要该坐标来对片元着色器中的纹理进行采样。
__片元着色器__是在屏幕上对象占据的每个像素上运行的程序,通常用于计算和输出每个像素的颜色。通常,屏幕上有数百万个像素,而片元着色器的执行过程涵盖了所有像素!优化片元着色器是整体游戏性能优化工作的重要组成部分。
一些变量或函数定义后跟一个语义指示符 - 例如 :POSITION 或 :SV_Target。这些语义指示符将这些变量的“含义”传达给 GPU。请参阅着色器语义页面,以了解详细信息。