编写顶点和片元着色器

ShaderLab 着色器不仅仅包括“硬件着色器”。这些着色器做很多事情。它们描述在材质检视器 (Material Inspector) 中显示的属性,容纳用于不同图形硬件的多种着色器实现,配置固定函数硬件状态等等。实际可编程着色器 - 如顶点和片元程序 - 只是整个 ShaderLab“着色器”概念的一部分。请查看着色器教程中的基本简介。在这里,我们将调用低级硬件着色器着色器程序

如果您想编写与光照交互的着色器,请查看表面着色器文档。本页剩余部分将假设着色器不与 Unity 光照交互(例如:特殊效果、Image Effects|图像效果等。)

着色器程序的编写采用 Cg/HLSL 语言,是通过在着色器文本中 Pass 命令内的某处嵌入“代码片段”的来实现的。它们通常看起来像这样:

  Pass {
      // ...常用的通道状态设置...

      CGPROGRAM
      // 该代码片段的编译指令,例如:
      #pragma vertex vert
      #pragma fragment frag

      // Cg 代码自身

      ENDCG
      // ...通道设置的剩余部分...
  }

Cg 代码片段

Cg 程序代码片段被编写在 CGPROGRAMENDCG 之间。

在代码片段编译指令的开头,可以使用 #pragma 指令。指示编译哪些着色器函数的编译指令:

其他编译指令:

每个代码片段都必须包含一个顶点程序或一个片元程序或两者皆包含。因此,要求使用一个 #pragma vertex 指令或一个 #pragma fragment 指令或两者都使用。

着色器目标

默认情况下,Unity 将着色器编译为简约 Shader Model 2.0 的相等物。使用 #pragma target 可使着色器被编译成其他能力等级。当前支持以下目标:

渲染平台

Unity 支持几个渲染 API(例如,Direct3D 9 和 OpenGL),默认情况下,所有着色器程序都编译成受支持的渲染器。使用 #pragma only_renderers #pragma exclude_renderers 指令,您可以指示编译成哪些渲染器。如果您知道您将只把 Mac OS X (无 Direct3D)或 Windows(Unity 默认为 D3D)作为目标,或者如果某个特定着色器只在一个渲染器中可用,而在其他渲染器中不可用,这样是有用的。当前受支持的渲染器名称有:

例如,以下这行指令只会将着色器编译为 D3D9 模式:

  #pragma only_renderers d3d9

小节

Page last updated: 2013-06-26