版本:Unity 6 (6000.0)
语言:English
编写 HLSL 着色器程序
添加 HLSL 着色器程序

着色器程序基础

在 Unity 中,您通常使用 HLSL 编写着色器在 GPU 上运行的程序。 更多信息
参见 术语表
程序。要将 HLSL 代码添加到您的着色器资源,您需要将代码放在着色器代码块中。

注意:Unity 也支持使用其他语言编写着色器程序,但这通常不需要或不建议使用。有关更多信息,请参见编写着色器

本手册部分包含有关以 Unity 特定方式使用 HLSL 的信息。有关编写 HLSL 的常规信息,请参见Microsoft 的 HLSL 文档

注意:Unity 最初使用Cg语言,因此 Unity 的一些关键字(CGPROGRAM)和文件扩展名(.cginc)的名称由此而来。Unity 现在不再使用 Cg,但这些名称仍在使用。

HLSL 语法

HLSL 有两种语法:一种是旧版 DirectX 9 样式的语法,另一种是更现代的 DirectX 10+ 样式的语法。区别主要在于纹理采样函数的工作方式。

  • 旧版语法使用 sampler2D、tex2D() 和类似函数。此语法适用于所有平台。
  • DX10+ 语法使用 Texture2D、SamplerState 和 .Sample() 函数。此语法的一些形式在 OpenGL 平台上不起作用,因为在 OpenGL 中纹理和采样器不是不同的对象。

Unity 提供了包含预处理器宏的着色器库,以帮助您管理这些差异。有关更多信息,请参见内置着色器宏

顶点和片段着色器

顶点着色器在渲染 3D 模型时,在 3D 模型的每个顶点上运行的程序。 更多信息
参见 术语表
是在 3D 模型的每个顶点上运行的程序。通常它不会执行任何特别有趣的操作。在这里,我们只是将顶点位置从对象空间变换到所谓的“裁剪空间”,这是 GPU 用于在屏幕上光栅化对象的。我们还将输入纹理坐标未经修改地传递 - 我们需要它在片段着色器中对纹理进行采样。

片段着色器是在对象占据屏幕上的每个像素计算机图像中的最小单位。像素大小取决于屏幕分辨率。像素光照在每个屏幕像素处计算。 更多信息
参见 术语表
上运行的程序,通常用于计算和输出每个像素的颜色。屏幕上通常有数百万个像素,并且会为所有这些像素执行片段着色器!优化片段着色器是整体游戏性能工作中非常重要的一部分。

某些变量或函数定义后跟有语义指示符 - 例如:POSITION:SV_Target。这些语义指示符向 GPU 传达这些变量的“含义”。有关详细信息,请参见着色器语义页面。

编写 HLSL 着色器程序
添加 HLSL 着色器程序