Unity 技术美术 - Shader 篇

片段着色器

图元、片元和像素

生成的先后顺序:顶点 → 图元 → 片元 → 像素

ShaderLab 模板

  • Standard Surface Shader 表面着色器
  • Unlit Shader 不受光照(UnLight)
  • Image Effect Shader 后处理
  • Compute Shader
  • Ray Tracing Shader

SubShader

GPU 会检查第一个 SubShader,如果 SubShader 不支持(显卡特性等),会检查第二个 SubShader,如果没有找到合适的 SubShader 就会执行 FallBack 中的 Shader 代码

常用的 cginc

  • HLSLSupport.cginc 编译 CGRPOGRAM 时自动包含此文件,其中声明了很多预处理器宏帮助多平台开发
  • UnityShaderVariables.cginc 编译 CGRPOGRAM 时自动包含此文件,其中声明了很多各种内置的全局变量
  • UnityCG.cginc 需要手动添加,其中声明了很多内置的帮助函数与结构

材质属性 Properties

语法格式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// Attribute 为属性
// _Name 为变量名
// Dispaly_Name 为展示在材质面板上的名字
// Type 为变量类型
/*********************
* {
* color,
* int,
* float,
* vector,
* 2D,
* 3D,
* cube
* }
**********************/
// Default_Value 为默认值
[Attribute]_Name("Display_Name", Type) = Default_Value
1
2
3
4
5
6
7
8
Properties
{
[HDR]_Color(" 颜色 ", color) = (1, 1, 0, 1)
_Int(" 整数 ", int) = 0.5
[PowerSlider(3)]_Float(" 浮点数 ", range(0, 10)) = 0.5
_Vector(" 四维向量 ", vector) = (0.5, 2, -1, 1)
_2DTex("2D 纹理 ", 2D) = "black"{}
}

混合操作

片段着色器(源颜色 * SrcFactor) BlendOp 帧缓冲区 Frame Buffer(目标颜色 * DstFactor)

Shader 中的时间_Time

_Time.xyzw

  • _Time.x (t / 20)
  • _Time.y (t)
  • _Time.z (t * 2)
  • _Time.w (t * 3)

相关术语

菲涅尔效应

在真实世界中,除了金属之外,其它物质均有不同程度的“菲涅尔效应”。简单的讲,就是视线垂直于表面时,反射较弱,而当视线非垂直表面时,夹角越小,反射越明显。如果你看向一个圆球,那圆球中心的反射较弱,靠近边缘较强。不过这种过度关系被折射率影响。如果你站在湖边,低头看脚下的水,你会发现水是透明的,反射不是特别强烈;如果你看远处的湖面,你会发现水并不是透明的,但反射非常强烈。这就是“菲涅尔效应”


Unity 技术美术 - Shader 篇
https://silhouettesforyou.github.io/2023/04/03/6539b036c88c/
Author
Xiaoming
Posted on
April 3, 2023
Licensed under