读书笔记16《Unity Shader入门精要》

铁名_IronName Lv4

第 17 章 Unity 的表面着色器

表面着色器(Surface Shader)是对顶点/片元着色器添加了一层抽象。

表面着色器的例子

实践

使用 Unity 的表面着色器。

相比之前所学的顶点/片元着色器技术,表面着色器的代码量很少。

编译指令

1
#pragma surface surfaceFunction lightModel [optionalparams]

#pragma surface 用于指明该编译指令是用于定义表面着色器的,在它的后面需要指明
使用的表面函数(surfaceFunction) 和光照模型( lightModel ), 同时,还可以使用一些可选参数来控制表面着色器的一些行为。

表面函数

1
2
3
void surf (Input IN, inout SurfaceOutput o)
void surf (Input IN, inout SurfaceOutputStandard o)
void surf (Input IN, inout SurfaceOutputStandardSpecular o)

光照函数

Unity 内置了基于物理的光照模型函数 Standard 和 StandardSpecular (在 UnityPBSLighting.cginc 文件中被定义),以及简单的非基于物理的光照模型函数 Lambert 和 BlinnPhong ( 在 Lighting.cginc 文件中被定义)。
也可以自己定义光照函数。

其他可选参数

  • 自定义的修改函数。表面函数,光照模型,顶点修改函数,颜色修改函数
  • 阴影
  • 透明度混合和透明度测试
  • 光照
  • 控制代码的生成

两个结构体

表面函数的输入结构体 Input,存储了表面属性的结构体 SurfaceOutput

Unity 背后做了什么

单击”Show generated code”可以查看表面着色器生成的所有顶点/片元着色器。

Unity 对该 Pass 的自动生成过程大致如下 。

(1)直接将表面着色器中 CGPROGRAM 和 ENDCG 之间的代码复制过来,这些代码包括了我们对 Input 结构体、表面函数、光照函数(如果自定了的话)等变盘和函数的定义。这些函数和变益会在之后的处理过程中被当成正常的结构体和函数进行调用 。

(2)Unity 会分析上述代码,并据此生成顶点着色器的输出——v2f_surf 结构体,用于在顶点着色器和片元着色器之间进行数据传递。Unity 会分析我们在自定义函数 中所使用的变盘 ,例如,纹理坐标 、视角方向、反射方向等。如果需要,它就会在 v2f_surf 中 生成相应的变量 。 而且,即便有时我们在 Input 中定义了某些变黛(如某些纹理坐标),但 Unity 在分析后续代码时发现我们并没有使用这些变量,那么这些变量实际上是不会在 v2f_surf 中 生成 的 。这也就是说,Unity 做了一些优化。v2f_surf 中还包含了 一些其他需要的变量 ,例如阴 影纹理坐标、光照纹理坐标、逐顶点光照等 。

(3)接着,生成顶点着色器。
① 如果我们自定义了顶点修改函数,Unity 会首先调用顶点修改函数来修改顶点数据,或填充自定义的 Input 结构体中的变挝 。然后,Unity 会分析顶点修改函数中修改的数据 , 在需要 时通过 Input 结构体将修改结果存储到 v2f_surf 相应的变量中 。
② 计算 v2f_surf 中其他生成的变量值。 这主要包括了顶点位置、 纹理坐标、 法线方向、 逐顶点光照、光照纹理的采样坐标等。当然 ,我们可以通过编译指令来控制某些变扯是否需要计算。
③ 最后,将 v2f_surf 传递给接下来的片元着色器 。

(4)生成片元着色器 。
① 使用 v2f_surf 中的对应变批填充 Input 结构体,例如,纹理坐标、视角方向等。
② 调用我们自定义的表面函数填充 SurfaceOutput 结构体 。
③ 调用 光照函数得到初始的颜色值 。 如果使用的 是 内置的 Lambert 或 BlinnPhong 光照函数,Unity 还会计算动态全局光照 ,并添加到光照模型的计算中。
④ 进行其他的颜色叠加。例如 , 如果没有使用光照烘焙 ,还会添加逐顶点光照的影响。
⑤ 最后,如果 自定义了 最后的颜色修改 函数,Unity 就会调用它进行最后的颜色修改。

表面着色器实例分析

并没有实践

使用 Unity 的表面着色器,实现膨胀效果。

表面着色器的缺点

  • 牺牲自由度换的便利。没法进行深层的优化;无法完成一些自定义的渲染效果。

更多信息去 Unity 手册看。

  • 标题: 读书笔记16《Unity Shader入门精要》
  • 作者: 铁名_IronName
  • 创建于 : 2026-01-30 14:22:58
  • 更新于 : 2026-02-16 18:44:42
  • 链接: https://blog.ironname.top/2026/01/30/读书笔记16《Unity-Shader入门精要》/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论