笔记

该笔记对应入门精要中 4、5、6 章节部分。

坐标空间以及顶点变换的顺序

  • 模型空间(model space), 在 DCC 中建立的坐标
  • 世界空间(world space),将模型的顶点变换到世界空间中这个操作叫做 Model Transform。
  • 观察空间(view space),也被称为摄像机空间(camera space)将顶点从世界空间变换到观察空间的操作叫做 View Transform。
  • 裁剪空间(clip space), 从观察空间转换到裁剪空间的矩阵叫做 clip matrix,也称为 projection matrix(投影矩阵)。完全位于这个空间内部的图元会被保留,位于这个空间之外的图元会被剔除,位于边界的图元会被裁剪。
  • 屏幕空间(screen space), 投影之后,获得一个真正的像素坐标。首先,通过标准齐次除法获得归一化的设备坐标(Normalized Device Coordinates, NDC)。然后,我们可以根据变换后的 x 和 y 坐标来映射输出窗口的对应像素坐标。总结为两个操作(齐次除法,屏幕映射)。

顶点变换的过程

  • 顶点从模型空间 -> 世界坐标系下 ->

顶点和片元的基本功能。

  • 顶点着色器的基本任务就是把顶点坐标从模型空间转换到裁剪空间中。
  • 片元着色器返回该顶点的裁剪空间坐标和该顶点的颜色。

顶点和片元之后的工作

  • 模板测试
  • 深度测试
  • 混合操纵

顶点/片元 着色器的基本结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
Shader "MyShaderName" {
Properties{
//属性
}

//针对显卡 A 的 SubShader
SubShader {

// Pass 01, 可能有多个 Pass 也可能只有一个 Pass
Pass {
// 设置渲染状态和标签

// CG 代码片段
CGPROGRAM
// 指定顶点函数和片元函数名称
#pragma vertex vert
#pragma fragment frag

// 自定义代码

// 结束 CG 代码
EndCG
}

// 其他 Pass
Pass {

}
}

//针对显卡 B 的 SubShader
SubShader {

}

FallBack "Default Shader"
}

通常会定义一个名为 a2v 的结构体来作为 vert(a2v v) 的输入结构体,其结构和含义如下

1
2
3
4
5
6
7
8
9
10
11
12
struct a2v {

// 此处的 POSITION 表示语义,用模型空间的顶点坐标填充 vertex 变量,下面的也表示语义
float4 vertex : POSITION;

// 用模型空间的法线方向填充 normal 变量
float3 normal : NORMAL;

// 用模型的第一套纹理坐标填充 texcoord 变量
float4 texcoord : TEXCOORD0;
}

语义

顶点和片元都有各自的不同的语义,简单如下:

顶点输入语义

输入 说明
POSITION[n] 模型空间中的位置

顶点输出语义

输入 说明
COLOR[n] 漫反射或者反射的颜色

更多的片元语义可以通过 此连接 来查看。

顶点/片元的调用方式

  • 需要注意的是,定点着色器是逐顶点调用的,片元着色器是逐片元调用的。片元着色器中的输入实际上是把定点着色器的输出进行插值后得到的结果。

ShaderLab 和 CG 的变量类型对应

ShaderLab 属性类型 CG 变量类型
Color,Vector float, half4, fixed4
Range, Float float, half, fixed
2D sampler2D
Cube samplerCube
3D sampler3D

UnityCG.cginc 中一些常见的结构体

名称 描述 包含的变量
appdata_base 可用于顶点着色器的输入 顶点位置、顶点法线、第一组纹理坐标
appdata_tan 可用于顶点着色器的输入 顶点位置、顶点切线、顶点法线、第一组纹理坐标

光照模型

计算光照模型的时候可以选择是逐顶点着色、还是逐像素着色,一般来说,如果是线性着色,则选择计算量较小的逐顶点,而非线性则只能逐像素。

符合兰伯特定律的 漫反射公式

$C{diffuse} = (C{light} \cdot M{diffuse})max(0,(n \cdot l ))$

反射光线的强度与表面法线和光源方向之间的夹角的余弦值成正比。其中 :

  • n 是表面法线
  • l 是指光源的单位矢量
  • $M{diffuse}$ 是材质的漫反射颜色
  • $C{light}$ 是光源颜色。

这里用 max 函数截取到 0,可以防止物体被后面的光源照亮。

符合布冯模型的 高光计算公式

$C{specular} = (C{light} \cdot M{specular})max(0,v \cdot r) ^ {M{gloss}}$

  • 其中 $M{gloss}$ 是材质的光泽度,用于控制高光区域的 “亮点” 有多宽,$M{gloss}$ 越大,亮点越小。

符合 Blinn 模型的高光反射公式

它的基本思想是:避免计算反射方向 $r$,为此引入一个新的矢量 $h$,

$h= \frac{ v + I}{ v - I}$