shader入门基础-内置变量,标签,函数,光照模型
变量
Unity 内置的变换矩阵





函数



光照模型
漫反射
公式
$$
\mathtt{c}{diffuse}=(\mathtt{c}\cdot \mathtt{m}_{diffuse})max(0,\vec n \cdot \vec l)
$$
$\vec n$ 是表面法线,$\vec l$ 指向光源的单位矢量,$m_{diffuse}$ 材质漫反射颜色,$c_{light}$ 是光源颜色。
高光反射
phong 模型
$$
c_{\text{specular}} = (c_{\text{light}} \cdot m_{\text{specular}}) \cdot \max(0, (\vec{v} \cdot \vec{r}))^{m_{\text{gloss}}}
$$
参数解释:
-
$m_{\text{gloss}}$:材质的光泽度(gloss)或反光度(shininess)
- 控制高光区域的大小:值越大,高光区域越小、越集中
- 典型范围:8-256(金属材质通常100+,塑料通常20-80)
-
$m_{\text{specular}}$:材质高光反射颜色
- 控制高光反射的强度和颜色(如金色材质:$(1.0, 0.8, 0.2)$)
- 数据类型:RGB向量(例:$(0.8, 0.8, 0.8)$为银白色)
-
$c_{\text{light}}$:光源的颜色和强度
- 与材质高光颜色相乘($c_{\text{light}} \cdot m_{\text{specular}}$)
- 数据类型:RGB向量
-
$\vec{r}$:反射方向
- 计算公式:$\vec{r} = 2(\vec{n} \cdot \vec{l})\vec{n} - \vec{l}$
- 其中$\vec{n}$为表面法线,$\vec{l}$为指向光源的单位矢量
-
$\vec{v}$:视线方向
- 从表面点到摄像机的单位矢量
公式修复说明:
-
移除冗余项:
- 删除$\mathrm{c}_{\text{dot}}$(不是标准Phong模型的一部分)
- 简化表达式:$(\mathrm{c}{\text{light}} \cdot \mathrm{c}{\text{dot}} \cdot → c_{\text{light}} \cdot$
-
修正点积表示:
- $\mathrm{vec}\ v \cdot \mathrm{c} \cdot → \vec{v} \cdot$
- 点积是标量运算,正确表达:$\vec{v} \cdot \vec{r}$
-
指数位置修正:
- $)^{m_{\text{gloss}}}$ → $)^{m_{\text{gloss}}}$(确保指数作用于点积结果)
-
向量表示规范化:
- $\mathrm{vec}\ n → \vec{n}$(统一使用标准向量表示法)
- $\mathrm{vec}\ r → \vec{r}$
半兰伯特模型
公式
$$
\mathtt{c}{diffuse}=(\mathtt{c}\cdot \mathtt{m}_{diffuse})(\alpha(0,\vec n \cdot \vec l)+\beta)
$$
半兰伯特模型没有使用max操作来防止$\vec n$和$\vec l$和的点积为负值,而是进行了$\alpha$倍的缩放和再加上一个$\beta$的偏移。
在绝大多数情况下,$\alpha$和$\beta$的值均为0.5。一般公式为
$$
\mathtt{c}{diffuse}=(\mathtt{c}\cdot \mathtt{m}_{diffuse})(0.5(0,\vec n \cdot \vec l)+0.5)
$$
指令
常见的渲染状态设置选项
| 状态名称 | 设置指令 | 解释 |
|---|---|---|
| Cull | Cull Back Front Off | 设置剔除模式:剔除背面/正面/关闭 |
| ZTest | ZTest Less Greater/LEqula/GEqual/Equal/NotEqual/Always | 设置深度测试 |
| ZWrite | ZWrite On/Off | 开启/关闭深度写入 |
| Blend | Blend SrcFactor DstFactor | 开启并设置混合模式 |
用于SubShader则会对所有Pass生效,用于特定Pass则对特定Pass生效。
透明度混合


Tags
SubShader的标签类型
Pass的标签类型
Unity提前定影的5个渲染队列

$$
$$
浙公网安备 33010602011771号