shader入门基础-内置变量,标签,函数,光照模型

变量

Unity 内置的变换矩阵
imageimageimageimageimage

函数

imageimageimage

光照模型

漫反射

公式
$$
\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}}}
$$

参数解释:

  1. $m_{\text{gloss}}$:材质的光泽度(gloss)或反光度(shininess)

    • 控制高光区域的大小:值越大,高光区域越小、越集中
    • 典型范围:8-256(金属材质通常100+,塑料通常20-80)
  2. $m_{\text{specular}}$:材质高光反射颜色

    • 控制高光反射的强度和颜色(如金色材质:$(1.0, 0.8, 0.2)$)
    • 数据类型:RGB向量(例:$(0.8, 0.8, 0.8)$为银白色)
  3. $c_{\text{light}}$:光源的颜色和强度

    • 与材质高光颜色相乘($c_{\text{light}} \cdot m_{\text{specular}}$)
    • 数据类型:RGB向量
  4. $\vec{r}$:反射方向

    • 计算公式:$\vec{r} = 2(\vec{n} \cdot \vec{l})\vec{n} - \vec{l}$
    • 其中$\vec{n}$为表面法线,$\vec{l}$为指向光源的单位矢量
  5. $\vec{v}$:视线方向

    • 从表面点到摄像机的单位矢量

公式修复说明:

  1. 移除冗余项

    • 删除$\mathrm{c}_{\text{dot}}$(不是标准Phong模型的一部分)
    • 简化表达式:$(\mathrm{c}{\text{light}} \cdot \mathrm{c}{\text{dot}} \cdot → c_{\text{light}} \cdot$
  2. 修正点积表示

    • $\mathrm{vec}\ v \cdot \mathrm{c} \cdot → \vec{v} \cdot$
    • 点积是标量运算,正确表达:$\vec{v} \cdot \vec{r}$
  3. 指数位置修正

    • $)^{m_{\text{gloss}}}$ → $)^{m_{\text{gloss}}}$(确保指数作用于点积结果)
  4. 向量表示规范化

    • $\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生效。

透明度混合
imageimage![标签]({{ image
image

Tags

SubShader的标签类型
imagePass的标签类型
imageUnity提前定影的5个渲染队列
image

$$

$$

posted @ 2025-07-22 14:54  晓叔  阅读(10)  评论(0)    收藏  举报