Unity 中的所有渲染都使用着色器完成 - 可配置图形硬件设置方法以进行渲染的小脚本。Unity 配备了八十多个内置着色器(详见内置着色器指南)。可制作自己的着色器扩展此设置。
可使用以下三种不同方法之一在 Unity 中编写着色器:
如需让您的着色器受到光线和阴影的影响,那么表面着色器 (Surface Shaders) 是您最好的选择。表面着色器可让您以简单的方法编写复杂的着色器 - 这是与 Unity 照明管道的更高层次交互提取。大部分表面着色器自动支持正向和延迟照明。可用数行 Cg/HLSL 编写表面着色器,且其中将生成更多代码。
如果着色器未对光线进行任何处理,请勿使用表面着色器。对于图像效果 (Image Effects) 或许多特殊效果着色器而言,表面着色器不是最理想的选项,因为它们会在没有充分理由的情况下执行一系列照明计算!
如果着色器无需与照明互动,或者需要制作一些表面着色器无法实现的非凡效果,则需使用顶点和片段着色器。按此方法编写的着色器程序可让您以最灵活的方式制作所需的效果(甚至表面着色器自动转换为一堆顶点和片段着色器),但这也是要付出代价的:必须写更多代码,且代码与照明的互动更难于实现。也可使用 Cg/HLSL 编写这些着色器。
固定功能着色器 (Fixed Function Shaders) 适用于不支持可编程着色器的旧硬件。在 n 次回退至您喜爱的片段或表面着色器时,您可能需要撰写固定功能着色器,确保在旧硬件或更简单的移动平台上运行时游戏仍可渲染一些可理解的内容。固定功能着色器完全使用 ShaderLab 语言(类似于 Microsoft's .FX 文件或 NVIDIA's CgFX)进行编写。
无论选择哪种类型的着色器,着色器代码的实际内容将始终包含在用于组织着色器结构的 ShaderLab 中。示例如下:
Shader "MyShader" { Properties { _MyTexture ("My Texture", 2D) = "white" { } // other properties like colors or vectors go here as well } SubShader { // here goes the 'meat' of your // - surface shader or // - vertex and fragment shader or // - fixed function shader } SubShader { // here goes a simpler version of the SubShader above that can run on older graphics cards } }
我们建议您从了解 ShaderLab 组件手册 中的一些 ShaderLab syntax 基本概念开始,然后再阅读下方列出的教程。
教程列举了大量不同类型着色器示例。如需了解更多特定表面着色器的示例,可以在资源 (Resources) 部分获取 Unit 内置着色器的原始资料。Unity 的图像效果 (Image Effects) 资源包包含许多有趣的顶点和片段着色器。
如需了解着色器的简介,请参阅着色器组件手册!
Page last updated: 2013-06-26