https://support.apple.com/en-us/102041?utm_source=chatgpt.com
Shader API
- frac
- 返回值就是参数
x的 fractional part,并且支持标量、向量或矩阵形式的 float 输入。
- 返回值就是参数
Blender导出模型到Unity
在Unity中Add Package By name:属兔输入com.unity.cloud.gltfast
Blender中全选,应用“旋转 + 缩放”

导出格式选择.glb 2.0 (其实FBX也可以)
写实场景渲染
- 离线渲染offline Rendering:Blender
- 实时渲染 Real-Time Rendering:Unity
- 非真实渲染 NPR(Non‑Photorealistic Rendering)
- 基于物理的渲染 PBR
渲染数据
- 模型
- 材质
- 动态元素和特效
- 摄影测量:通过多张二维影像,解算出物体和场景的三维坐标、形状与尺寸并重建模型的技术
渲染过程
光照模型(Illumination Model)
- 局部光照模型
- Lambert漫反射模型
- Gourmand光照模型
- Phong 光照模型
- 改进的Blinn-Phong模型
- 全局光照模型
- 基于光线追踪实现
- 路径追踪(基础蒙特卡洛GI算法)
- 双向路径追踪
- Metropolls
- 递归光线追踪(基础反射/折射,非完整GI)
- 分布式光线追踪
- 路径追踪(基础蒙特卡洛GI算法)
- 其他GI实现技术
- 光子映射
- 基于点的全局光照
- 辅助效果(非完整GI)
- 环境光遮蔽(Ambient Occlusion ):只算局部遮挡,无光线反弹,只加缝隙阴影,是 “假细节阴影”
- 基于光线追踪实现

阴影
大气渲染
- 云
- 雾
- 体积光(Volume light),光束
- 物理光照

采样 (Sampler)
抗锯齿
渲染输出
后处理(Post Process)
上面提到的光照模型、材质等有很多交错的地方,比如SSR和SSAO,甚至下面会提到输出部分的物理相机部分在实时渲染引擎也算是后处理的内容,可以说实时渲染的后处理合并了渲染输出。
- 物理相机模拟




- 人眼观察模拟

- 调色 or 颜色分级
- 抗锯齿
课堂笔记
- TA 光照模型 – 美术中的黑白关系、影调、高光
- 空间变换 – 美术中的透视理论(近大远小)
- 原画给一张图,然后交给地编、TA
- 很多时候其实是建模的人出了问题,空间变换有问题,但是却交给TA,扣了很长时间Shader,但也没有用,TA一定要正确的做事情,不一定要通过复杂的方式解决问题,而是要选择最适合项目的角度解决问题
- 我现在目前做的是美术做的事情,根据原画还原场景。
- shader和所有事情都相关,但不是所有问题都需要动shader,比如空间变换
- 谁的问题就给谁,就比如GI有问题,导致暗部死黑,
如果是直接光照有问题,那就有可能是光照模型有问题,但光照模型是你自己写的,你知道肯定没问题,所以一定是别的地方
然后会怀疑间接光照,LightMap,AO,SSAO
想表达的是,很多时候在不正确的地方付出了200%的力,但是效果只提升了1%,我们要的是付出很少的力实现很好的效果,立竿见影的效果,所以一定要正确的找到导致这个问题的主要原因是什么(定位问题的能力) - 然后才能谈解决问题的能力,也就是技术选型,我们在有限的时间很难进行创新,所以就需要对市面上有的技术进行筛选,可以从论文中拿到技术然后用在论文中,实现1+1(美术模块和shader模块)大于10的效果。
不要想着自己创造技术,很多时候是模型上的技术A和Shader上的技术B和引擎上的技术C,有了这些技术积累才有可能能迸发出灵感,所以丰富技术矩阵很重要,光有程序技术矩阵是不够的,还要有美术技术矩阵 - 现在问矩阵问得少了,但是PBR问得多了
- unity自带的原生烘焙,GI涉及的效果器在Scene面板中(天空盒的左边)
- 尽可能逼近要的效果,工作中也是这样给你的,给一张技术原画,然后去复刻
- 原画有的时候不全是根据透视关系画上去的,有可能是贴上去的,所以原画的透视关系不一定正确

- 增大“裁剪结束”的值
- 表示这个相机只会显示距离相机 0.1 米到 500 米之间 的物体。超过 500 米 的物体,在相机视图和最终渲染里就会被裁掉,看不见
- 先按照透视关系把大致的模型建出来,如果比例关系不正确(原因可能不在于我们)
那就直接根据经验调整比例 - 调整相机的焦距
调整相机的rx
缩放,平移物体调整使其与原画重合 - 对于编辑状态下有时面不可选中的问题 回到物体模式后全选,这时在进入编辑模式就能同时修改这些面
- 主观的处理美术,不要追求绝对正确,追求相对正确以及最终效果,抓大放小
如果物体将参考图挡住了,启用这个选项
Lightmapping Settings
- Lightmapper:Progressive CPU / Progressive GPU
| 选项 | 说明 |
|---|---|
| Progressive CPU | 用 CPU 烘焙,兼容性好,但慢 |
| Progressive GPU | 用 GPU 烘焙,速度快,但对显卡和驱动有要求 |
- Direct Samples:直接光采样
- 影响:直接光、直接阴影的质量。
- Indirect Samples:间接光采样
- 影响:GI 反弹光的质量。
- 墙面反光到地面; 地面反光到天花板; 室内暗部的柔和光; 彩色物体对周围环境的染色
- Environment Samples:环境光采样
- 影响:来自天空盒、环境光的采样质量。
- Light Probe Sample Multiplier:光照探针采样倍率
- Light Probe Sample Multiplier 会提高光照探针的采样质量。动态物体受光不稳定、颜色不自然时,可以适当提高。
- Max Bounces:最大反弹次数
- 作用:光最多反弹几次
- Lightmap Resolution:光照贴图分辨率
- texels per unit 也就是每 1 个 Unity 单位分配多少个 Lightmap 像素
- Lightmap Resolution 决定 Lightmap 的清晰度。数值越高,阴影和间接光越清晰,但贴图更大、内存更高、烘焙更慢。
- Lightmap Padding:光照贴图间距
- Lightmap 中不同 UV 岛之间的像素间距。
- Lightmap Padding 用来防止不同物体或 UV 岛之间的光照互相污染。分辨率越高,Padding 也可以适当提高。
- Max Lightmap Size:最大 Lightmap 尺寸
- Max Lightmap Size = 4096
- Max Lightmap Size 越大,单张 Lightmap 能装更多物体,接缝可能更少,但显存占用更高。4096 质量高,但对性能和内存压力更大
- texels per unit 也就是每 1 个 Unity 单位分配多少个 Lightmap 像素
- Ambient Occlusion:烘焙 AO
- 它会让物体接触处、墙角、缝隙更暗
- Albedo Boost:反照率增强
- 作用:增强材质颜色对反弹光的影响
- Albedo Boost 会增强材质颜色对间接光的贡献。数值太高会导致颜色反弹过强,不物理真实
什么影响间接光照
渲染好不好基本拉开技术差距的就是涉及间接光的渲染技术(直接光的技术已经很成熟了,无非是拿空间换时间,或做一些小trick)





MagicDawn神经渲染方案
看它整体是什么:AI 光照引擎、云烘焙、TOD 动态 GI、Unity/UE/Godot 工具链。官方介绍里明确说它融合 AI 渲染技术与云端算力,支持大世界 GI 烘焙和跨 UE/Unity 的光照方案 MagicDawn – 前沿渲染技术引领者,打造极致的视听体验
学术论文入口。这个页面列出了 CVPR 2026 的 Neural Dynamic GI、Eurographics 2026 的 Lightmap 压缩、SIGGRAPH 2025 的预计算间接光照压缩等论文 MagicDawn Research
老师认为是未来GI的主流,SSGI(屏幕空间实时间接漫反射),HPAO 好性能屏幕空间环境光遮蔽
概念辨析
直接光照:光源发出的光,直接照到物体表面,然后被相机看到。
间接光照:光源没有直接照到当前表面,而是先照到别的物体,再反弹到当前物体
全局光照 Global Illumination:不只计算光源直接照到物体的效果,还要考虑光在整个场景中反弹、传播、遮挡、染色后的整体结果。通常包含:直接光照 + 间接光照
Unity 里的:
- Directional Light
Point Light
Spot Light
Area Light - 这些光源直接照到物体时,就是直接光照。
- 标准光照模型是值常数自发光 + (直接)光照:高光反射 + 漫反射 + 一个常数环境光
- 其中Lambert用于计算漫反射部分,根据光线和法线方向计算
光线颜色×镜像反射颜色(其实就是BaseColor)×max(0,法线方向×入射光方向)
Blin – phong用于计算高光反射部分,根据光线和观测方向计算
光线颜色×镜像反射颜色×max(0,n×半程向量(入射光和观测方向的中间向量) - 自发光如果没有使用全局光照,那只是使自身变得更亮了而已,并不会照亮环境
- 其中Lambert用于计算漫反射部分,根据光线和法线方向计算
- 从公式也能看出只计算了入射光线,下一步就直接到摄像机观测方向了,所以是直接光照模型
考虑间接光照的光照模型,是GI全局光照,全局光照也分实时和离
BRDF不是一个完整的光照模型,他只是其中的一项,是一个材质反射函数它描述:某个方向来的光,打到表面后,会有多少光反射到观察方向。所以 BRDF 既可以用于。
下面的除了AO都会直接或间接用到BRDF
| 名称 | 类型 | 实时还是离线 | 说明 |
|---|---|---|---|
| Baked GI | 全局光照方案 | 离线 | 提前烘焙光照,运行时直接读取结果 |
| Realtime GI | 全局光照方案 | 实时 / 半实时 | 运行时更新间接光,但通常依赖预计算数据 |
| Lightmap | 光照数据贴图 | 离线生成,运行时采样 | 静态物体用得多 |
| Light Probe | 空间光照采样点 | 通常离线生成,运行时插值使用 | 给动态物体提供间接光 |
| Reflection Probe | 环境反射采样 | 可离线,也可实时 | Baked 模式是离线,Realtime 模式是运行时更新 |
| SSGI | 屏幕空间全局光照 | 实时 | 根据当前屏幕画面估算间接光 |
| Ray Tracing GI | 光线追踪全局光照 | 通常实时 | HDRP/DXR 中运行时追踪光线,开销较大 |
| Path Tracing | 路径追踪(双向路径追踪 相机 + 光源双向发射光线) | 离线 | 质量高,但太慢,不适合普通实时游戏 |
对于AO
| AO 类型 | 实时 / 离线 | 说明 |
|---|---|---|
| Baked AO | 离线 | 提前烘焙到贴图、Lightmap 或顶点色里 |
| AO Map | 离线生成,运行时采样 | Substance、Blender、Maya 烘焙出的 AO 贴图 |
| SSAO | 实时 | Screen Space Ambient Occlusion,屏幕空间实时 AO |
| GTAO / HBAO | 实时 | 比普通 SSAO 更高级的实时 AO 变体 |
| Ray Traced AO | 实时或离线 | 用光线追踪算遮蔽,高质量但开销更大 |
PBR资源生产流程

1. 基础模型
是什么:
先做一个大概形状正确的低精度模型,也叫 blocking / blockout / base mesh。
目的:
确定物体的整体比例、轮廓、结构和体块关系。
2. 高模制作
是什么:
在基础模型上继续增加大量细节,倒角、裂缝、雕刻纹理、凹凸细节、磨损
螺丝做出高精度模型 High Poly
目的:
让模型有丰富细节
3. 拓扑
是什么:
把高模重新整理成一个更干净、更低面数、更适合游戏运行的模型,也叫 Low Poly / Retopology。
目的:
让模型既保留整体轮廓,又能在引擎里高效运行。
高模可能几十万、几百万面,不能直接进游戏。
拓扑后的低模可能只有几千面或几万面。
拓扑时要注意:
布线是否干净
轮廓是否保留
动画区域是否合理
面数是否可控
法线是否稳定
4. UV 展开
是什么:
把三维模型表面展开成二维平面,方便贴图绘制。
目的:
让贴图能正确贴到模型表面。
可以理解为:
3D 模型表面
↓
剪开
↓
摊平成 2D 图纸
↓
贴图画在这张图纸上
6. SP 材质制作
这里的 SP 一般指:
Substance Painter
是什么:
在 Substance Painter 里给模型制作 PBR 材质。
目的:
制作模型的颜色、粗糙度、金属度、法线、污渍、磨损等材质效果。
常见输出贴图有:
BaseColor / Albedo:基础颜色
Normal:法线凹凸
Roughness:粗糙度
Metallic:金属度
AO:环境遮蔽
Height:高度
Emissive:自发光
UV 展开要注意:
不要严重拉伸
重要区域给更大 UV 面积
接缝位置尽量藏起来
UV 岛之间留间距
尽量提高 UV 利用率
如果 UV 不好,后面材质会出现:
贴图变形
纹理拉伸
接缝明显
烘焙错误
Unity 的全局照明系统
3种light模式
- Realtime:运行时每一帧实时计算的灯光,是“活的灯”,实时照场景。
- 适合:可移动光源
手电筒
移动灯
角色技能光
会开关/闪烁的灯
需要实时影响动态物体的灯
- 适合:可移动光源
- Baked:烘焙进光照数据里的灯。“死的灯”,提前算好,运行时只读结果。
- 不会实时照亮动态物体
不会运行时移动、变色后自动更新
主要影响静态物体的 Lightmap
也可以通过 Light Probe 间接影响动态物体 - 适合:固定不动的室内灯
Area Light
静态场景的柔和阴影
- 不会实时照亮动态物体
- Mixed:“半活半死的灯”:直接光实时,间接光烘焙
- 直接光可以实时影响动态物体
间接光可以烘焙进 GI / Lightmap / Probe
可以让静态物体吃烘焙光照
动态物体也能受到实时直接光 - 性能介于 Realtime 和 Baked 之间
- 适合:太阳光
主要方向光
既要动态物体受光,又想保留烘焙间接光的灯
- 直接光可以实时影响动态物体
2种全局光照系统
Unity 中有两种不同的全局光照系统:烘焙全局光照系统和实时全局光照系统。
实时照明
Unity在运行时(当你的游戏或其他实时体验运行时)计算实时光照。你之前教程中创建的定向光和其他光源目前都是实时光源。
这些灯光每帧计算一次,这意味着它们对移动的角色和场景中其他元素反应非常灵敏。然而,当场景变得更复杂时,这些灯光可能需要大量内存,这可能导致性能下降
烘焙光照通过在运行前(用户参与游戏或体验时)预先计算光照数据,有助于缓解这一问题。这可以减少硬件运行体验时的资源消耗。
实时全局照明系统包括:
- 光照映射:该全局照明系统使用已废弃的光照映射器,称为Enlighten光照映射器。
- 光探头:光探针在这个全局照明系统中还具有一些额外功能。
烘焙光照
Unity会在运行前(用户与体验互动之前)预先计算烘焙光照。这意味着 Unity 在运行时只需要将光照数据应用到场景上即可。你无法更改运行时烘焙的灯源属性,它们也不会响应动态游戏对象(比如角色在场景中走动)。
计算光照的过程涉及为整个场景生成UV坐标,就像用于映射材质纹理的UV坐标一样。这个纹理贴图称为光照贴图,创建过程称为光照贴图或烘焙。
烘焙光照效率更高,但它也可以用来实现更真实、更吸引用户的光照。
烘焙全局照明系统包括:
- 光照贴图:预先计算场景中表面亮度并将结果存储在称为光照贴图的纹理中。该全局照明系统使用一种称为渐进光照映射器(Progressive Lightmapper)的特定光照映射系统来完成这一过程。
- 光探头: 一个用来测量(或探测)场景中光线通过空白空间数据的工具。
- 反射探头: 一个在Unity中模拟更真实反射的工具。
光源种类
确定场景所需的光源是照明设计和实施的关键初步步骤。这包括:
- 自然光,通常是太阳或月亮。
- 有动力的照明,模拟场景中特定的真实光源——例如路灯或汽车大灯。
- 主光,指没有可识别光源的光,照亮场景中的焦点物体。
- 环境光照(在Unity中也称为漫反射环境光),环境光是指场景中存在但没有特定光源的光。这对于提升可见度或通过灯光创造特定风格效果非常有用,因为它为场景中的所有物体赋予统一色彩。Unity 的环境实时光照是计算出来并存储在光照贴图中。
注: 照明方式种类不止这些,但这四种是学习体验的绝佳起点!
- 配置方向灯,你可以把定向光放在场景的任何地方,都不会影响投射的光线。你需要明确改变光源的方向,才能在场景中改变它。
- 白色太阳图标:Directional Light / 方向光
- 绿色灯泡图标:Point Light / 点光源:这些光源从空间中的一个点向各个方向均匀地发射光线。你可以用它们来模拟灯光源。它们在场景视图中用灯泡图标表示。
- 红色锥形图标:Spot Light / 聚光灯: 这些光会从空间中的一点发出锥形光。你可以用它们来模拟光源,比如手电筒。它们在场景视图中用一个看起来有点像聚光灯的图标表示。
- 蓝色方形图标:Area Light / 区域光
- 形状代表光源的种类,颜色是光源的颜色

点光源和聚光灯光源效果对比:

- Indirect Mutiplier

间接乘法性质影响该光源提供的间接光强度(即在被传感器接收前多次反射的光)。如果你设置了:
- 低于1时,每次反射到物体时,间接光都会变暗。这就是真实光的表现方式,但你可能需要覆盖这种行为以实现特定的光照效果。
- 超过1时,间接光会随着每次反射变得更亮。这并不自然,但如果你想照亮场景中黑暗封闭空间,这非常有用。
目前,把这组保持在1。
环境光
在环境光照部分,找到源属性。目前,这个设置是你之前在学习体验中创建的天空盒,这意味着天空盒在场景中提供环境光照。这很简单,但通常很有效。

4. 强度倍增器特性控制场景中环境光的亮度,值可在0到1之间(默认值为1)。试试这对场景光线的影响。
注: GameObjects需要被标记为静态,才能包含在环境光照的光照贴图中。这是因为光照贴图数据是预先计算的,只能计算那些运行时不会移动的GameObjects。当你为这个场景烘焙灯光时,你会学到更多。要查看实验时的变化,请点击光照标签底部的“生成光照”。
5. 将源属性设置为梯度。现在你可以用颜色选择器为场景中的天空、赤道和地面环境光照设置特定颜色。试着改变这些,看看效果如何。

阴影
Projectsetting – Grphics – 配置文件



为场景烘焙光照贴图
- 选择你添加到场景中的其他光源的GameObjects,并将它们的模式属性设置为“烘焙”,方式相同。
- 提示:你可以使用光源管理器窗口(顶部菜单:Windows > 渲染>光源浏览器)快速更改这些参数。

- 接收烘焙光的物体也要设置为 Static / Contribute GI。


重要提示:在这个学习项目中,所有网格都有光照贴图UV。如果你导入一个没有光照贴图UV的新网格,你需要创建一个,或者让Unity自动生成一个,然后再烘焙光照贴图。

添加区域灯
面积光是矩形,从矩形一侧均匀地照射光线,覆盖该侧的表面积。这些灯可以获得细微效果,因为它们可以同时照射多个方向的物体。
在之前的教程中,你没有添加区域光的选项,因为它们只有在光照烘焙时才会生效。它们特别适合小型光源,比如室内灯——如果你想让场景更真实,区域灯在使用这类道具时比点灯更有效。
目前,场景中的路灯已经被烘烤了。你可以把光模式设置为混合,这样可以创建混合灯光。这些工具将动态(实时)阴影与同一光源的烘焙光照结合起来。这需要用户在探索体验时更多的处理,但可以提升阴影质量。对于这样相对小型且轻量的项目来说,通常值得付出性能成本。
一般来说,如果你在为桌面平台制作游戏或应用,会结合混合光、实时光和烘焙光照。不过,仅用烘焙灯光更容易展示可感知的效果,这对学习体验很有帮助。
清掉旧烘焙数据:

- 错误做法:
Static的意思是:这个物体是否参与静态烘焙 / 静态优化,所以禁用Static是不会清除数据的- 更换材质也没有用,原因见下:
- 烘焙后,Unity 会给每个参与烘焙的静态物体记录类似这些信息:
- 这个物体使用第几张 Lightmap
这个物体在 Lightmap 里的 UV 区域,所以
- 这个物体使用第几张 Lightmap
- 所以 Lightmap 本质上是:
一张或多张光照贴图+每个 Renderer 对应这张贴图里的某一块区域
用光探针改善你的照明
光照探针技术的核心,就是通过存储一些在空间中的关键信息,来插值计算出每个点的光照
探针的颜色,这个探针点在烘焙后记录到的空间光照颜色,物体的颜色就是其插值



- 什么是光探针?
- 光照探针和光照贴图都是对场景中的光照信息记录,但记录的对象不同:Lightmap 记录的是“表面上的光照”;Light Probe 记录的是“空间中的光照”
- 如果一个非静态物体不进行烘焙,
- 它们为什么有用?
- 你可以用光探针让你的烘焙光照更加真实。如果你小心放置,它们在运行时比实时灯光更高效。
- 虽然光探针通常有助于解决你在给动态物体打光时可能遇到的烘焙光照问题,但它们在场景中光照变化显著的区域也非常有用。如果用户在这些区域看到动态物体对光线的反应不符合预期,可能会对他们的沉浸感产生负面影响。
- 我怎么知道该把他们放在哪里?
- 这个网格应至少有两层垂直层——因此称为三维体积。
- 不要将探针放到物体内部,否则探针记录不到任何光照信息,没有意义




Static属性
- 这个 GameObject 在运行时被认为不会移动,所以 Unity 可以提前把它参与的一些计算烘焙或优化掉

反射探针
- 在游戏当中会有很多物体具有反射效果,像是一些金属材质、玻璃等等。只要一个物体具有镜面特征,就可以产生反射。但在游戏中实时的渲染反射的画面通常是一件性能消耗非常大的事情,为了减少运行时的性能消耗,Unity 提供了反射贴图技术,将这些反射的结果预存储在对应的反射贴图中,在游戏进行时只需要加载即可实现反射的画面效果。和上文中讲解光照贴图时是一样的思路:以空间换时间。

和光照探针的工作原理类似,反射探针也是利用一些探针来记录环境中不同位置的信息。
当使用反射探针在场景中的关键点对其中心点周围的视觉环境进行采样与烘培后,这些采样得到的反射信息结果会存储到一个立方体贴图上。
此立方体贴图的六个面分别记录了其周围六个方向上面的视觉信息,当一个物体靠近了反射探针之后,采样得到的反射效果就会被应用到物体上。当场景中存在多个反射探针时,其不同反射探针对应的反射效果会进行插值计算。
URP Asset

- Renderer List
- URP Asset = 总管线配置
Renderer Data = 具体怎么渲染画面 - 如果要加
- SSAO(Screen Space Ambient Occlusion,屏幕空间环境光遮蔽)
- Decal(贴花 / 投射贴图),直接把一张图“投射”到物体表面、比如墙上的污渍
地上的血迹、瓷砖上的霉斑 - 自定义全屏后处理基本都要进这个 Renderer 里加
- URP Asset = 总管线配置
- Depth Texture
- 这个会让 URP 额外生成一张 深度图记录画面中每个像素距离摄像机有多远
- 常用于:SSAO、体积雾、景深、水面交界线、软粒子、根据距离做淡出、物体边缘检测
- Opaque(不透明的) Texture
- URP 在渲染完不透明物体之后,把当前画面复制成一张纹理,简单来说场景里的墙、地面、家具等不透明物体先渲染出来,复制成 _CameraOpaqueTexture,然后透明材质 / Shader 可以采样这张图
- Opaque Downsampling
- 控制的是
_CameraOpaqueTexture的分辨率
- 控制的是
创建玻璃水雾 / 雨滴层
Reference:
讲解:
[The Art of Code] Rainy Window Tutorial In One Night – 二流遊戲開發 – Medium
https://www.youtube.com/watch?v=0flY11lVCwY
类似效果的不错的开源项目:
- 创建Unlit shader,因为它不是一个真正的玻璃物体,它主要做的是
- 采样玻璃后面的画面
- 用水滴/噪声偏移屏幕 UV
- 让背景产生扭曲
- 叠加白雾和模糊
- 不需要计算灯光、阴影、BRDF
output.uv = input.uv * _MainTex_ST.xy + _MainTex_ST.zw;
//等价于:
output.uv.x = input.uv.x * TilingX + OffsetX;
output.uv.y = input.uv.y * TilingY + OffsetY;
- 相加不是缩放,而是平移 UV 坐标系
- 相乘是在缩放 UV 坐标系
FlowMap的实现流动方式(BV1Zq4y157c9)
- flowmap 的实质:一张记录了 2D 向量信息的纹理,Flow map 上的颜色(通常为 RG 通道)记录该处向量场的方向,让模型上某一点表现出定量流动的特征。通过在 shader 中偏移 uv 再对纹理进行采样,来模拟流动效果
- 类似 UV 动画,而非顶点动画。换言之,无需对模型顶点进行操作,易实现,运算开销小。
- 不仅仅是水面,任何和流动相关的效果都可以采用 flowmap。


- 一个案例:2014GDC利用该技术制作的天空盒


- 借助shaderGraph理解FlowMap
- 采样 Flow map 获取向量场信息
- 用向量场信息,使采样贴图时的 UV 随时间变化
- 对同一贴图以半个周期的相位差采集两次,并线性插值,使贴图流动连续
- 先来看看 uv+time 的情况(u,v) + (time,0):模型上某个点:随着 time 增加,采样到的像素越远,视觉上可以形容为:更远距离的像素偏移向该点,视觉效果和我们直观认识到的运算法则是相反的。但 UV 偏移时,改变的不是顶点的位置(而是映射对吧)

- FlowMap的Shader Graph实现思路:

- 第一步先从FlopMap的texture中读取方向向量
- 但flow map 获取流动方向不能直接使用
需要将 flow map 上的色值从[0,1]的范围映射到方向向量的范围[-1,1]
- 但flow map 获取流动方向不能直接使用

//从flowmap获取流向
float3 flowDir = tex2D(_FlowMap, i.uv) * 2.0 - 1.0;
- 对时间处理,每次到1的时候会变为0,但是切换时

frac() 是取小数部分的意思同时为了实现无缝循环,构造2个Phase(红线、蓝线表示两层贴图采样的时间相位)
并使用变化的权重进行lerp混合

- 当
phase0 = 0时,贴图没有偏移;
当phase0 = 0.5时,贴图沿 flowDir 偏移了一半;
当phase0 = 1时,贴图偏移了一个完整周期,然后frac会让它重新回到 0 - 如果只用一层:那
phase0从1回到0的瞬间,UV 会突然跳回起点,画面会“闪一下”或者“跳一下”。 - 没太理解2个phase + lerp是怎么实现平滑过度的
采样贴图随时间的变化


Shader "Custom/Flow Map"
{
Properties
{
_MainTex("Main Texture / 主贴图", 2D) = "white" {}
_Color("Tint Color / 颜色叠加", Color) = (1, 1, 1, 1)
// Flow Map:用颜色存储流动方向
// 通常 R 通道控制 X 方向,G 通道控制 Y 方向
_FlowMap("Flow Map / 流向贴图", 2D) = "white" {}
// 控制 Flow Map 对 UV 的偏移强度
_FlowSpeed("Flow Strength / 向量场强度", Float) = 0.1
// 控制整体动画速度
_TimeSpeed("Time Speed / 全局流速", Float) = 1
// 勾选后反转 Flow Map 的流动方向
[Toggle(_REVERSE_FLOW_ON)] _ReverseFlow("Reverse Flow / 反转流向", Float) = 0
}
SubShader
{
Tags
{
// 当前为不透明渲染
"Queue" = "Opaque"
"RenderType" = "Opaque"
"IgnoreProjector" = "True"
}
Cull Off
Lighting Off
ZWrite On
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
// 根据 Toggle 开关生成 Shader Keyword
#pragma shader_feature _REVERSE_FLOW_ON
#include "UnityCG.cginc"
struct appdata_t
{
float4 vertex : POSITION;
float2 texcoord : TEXCOORD0;
};
struct v2f
{
float4 vertex : SV_POSITION;
half2 uv : TEXCOORD0;
};
fixed4 _Color;
sampler2D _MainTex;
float4 _MainTex_ST;
sampler2D _FlowMap;
float _FlowSpeed;
float _TimeSpeed;
v2f vert(appdata_t i)
{
v2f o;
// 模型空间坐标转换到裁剪空间
o.vertex = UnityObjectToClipPos(i.vertex);
// 传递原始 UV
o.uv = i.texcoord;
return o;
}
fixed4 frag(v2f i) : SV_Target
{
// 从 Flow Map 中读取流动方向
// 贴图颜色原本是 0~1,这里转换到 -1~1
float3 flowDir = tex2D(_FlowMap, i.uv).rgb * 2.0 - 1.0;
// FlowSpeed 控制流动强度
flowDir *= _FlowSpeed;
// 如果勾选反转流向,则整体反向
#ifdef _REVERSE_FLOW_ON
flowDir *= -1.0;
#endif
// 构造两个相位:
// phase0 和 phase1 相差半个周期,用于交替采样
float phase0 = frac(_Time.y * 0.1 * _TimeSpeed);
float phase1 = frac(_Time.y * 0.1 * _TimeSpeed + 0.5);
// 主贴图 UV 需要使用 Tiling 和 Offset
float2 tiling_uv = i.uv * _MainTex_ST.xy + _MainTex_ST.zw;
// 用 Flow Map 偏移 UV 后采样主贴图
// 两次采样使用不同 phase,形成半周期错开的两层流动
half3 tex0 = tex2D(_MainTex, tiling_uv - flowDir.xy * phase0).rgb;
half3 tex1 = tex2D(_MainTex, tiling_uv - flowDir.xy * phase1).rgb;
// 构造一个三角波混合权重
// 作用:让 tex0 和 tex1 交替淡入淡出,隐藏 frac 从 1 跳回 0 的瞬间
float flowLerp = abs((0.5 - phase0) / 0.5);
// 在两层错相位采样结果之间混合
half3 finalColor = lerp(tex0, tex1, flowLerp);
// 乘上颜色叠加
fixed4 c = fixed4(finalColor, 1.0) * _Color;
return c;
}
ENDCG
}
}
FallBack Off
}

https://teckartist.com/?page_id=107

半透明效果
Unity Shader入门精要阅读总结:


- 代价很高的解决方案:

AVBOIT解决方案:






角落、边缘、缝隙附近更白 = 这些地方更模糊
做“玻璃边缘磨砂 / 脏污”
- 导入 Unity 时的贴图设置
sRGB 关掉
因为这张不是颜色图,而是数据图。
它表示 0 到 1 的模糊强度,不应该被颜色空间校正。
Q1:您说的“用 AO、法线、曲率计算粗糙度图”,更准确地说就是:
用 AO、Normal、Curvature 等 Bake Mesh Maps 生成 Mask,Dirt / Mask Editor 是一个计算器。AO、曲率、法线、位置图是输入数据。Roughness 通道是输出结果。
再用这个 Mask 控制 Roughness 通道,最终导出 Roughness 图。
通过获取SDF去做地形融合(待整理)
- SDF是“符号距离函数”(Signed Distance Function)的缩写。它用于描述空间中某一点到物体表面的最小距离,并通过正负值来区分该点位于物体内部还是外部
第一步:安装 Mesh-To-SDF
在 Unity 里打开:
Window > Package Manager
点击左上角 +:
Add package from git URL
输入:
https://github.com/Unity-Technologies/com.unity.demoteam.mesh-to-sdf.git
这个安装方式是官方 README 给出的方式,项目要求 Unity 2021.2+,并且目标平台要支持 Compute Shader
这一步是在创建一个 3D RenderTexture,用来存储 SDF 距离场。
它不是普通颜色贴图,不是给你看的图片,而是一个三维数据盒子。
可以理解成:
一个 64 × 64 × 64 的空间网格
每个格子里存一个数字
这个数字表示当前位置到石头表面的距离
以地面混合石头的模式为例:石头的 SDF 体积贴图记录了包围盒内空间点到石头表面的距离。地面 Shader 在渲染每个像素时,会先把该像素的世界坐标转换到石头 SDF 的体积坐标中,然后采样这张 3D SDF,得到当前地面像素到石头表面的距离值。Shader 再把这个距离值通过 smoothstep 等方式转换成 0~1 的融合 Mask:距离石头越近,Mask 越接近 1;距离越远,Mask 越接近 0。最后用这个 Mask 在地面当前像素上混合地面原材质和石头/泥土/过渡材质。Mask 为 0 时显示地面原材质,Mask 为 1 时显示融合材质,中间值则进行不同程度的过渡混合。地面的 SDF 反过来同理,石头 Shader 可以采样地面 SDF 或地形高度信息,让石头底部混入地面材质。
如何消除Tiling感
(51 封私信 / 81 条消息) 在Unreal中如何消除材质的Tilling效果 – 知乎
Substance Painter制作刺绣网纱材质
- Op通道默认是关闭的

- alpha test / alpha blending 材质球,选择alpha blending做出来的效果有朦胧感

- 确保其中有opacity
- 新建FIll Layer + Add BlackMask + 给Mask Add Fill + 选择一张程序化纹理
- 黑透白不透

- 选中Layer + 确保OP打开并将值拉到0

密度通过填充层的比例调整


加一个反转遮罩,现在透明和不透明的关系是反的
HDRI
https://zhuanlan.zhihu.com/p/650167280
- High Dynamic Range Image 高动态范围图像
- 图片格式有 hdr,exr 等
与之相对的是LDRI(Low Dynamic Range Image,低动态范围图像)每天使用的 jpeg,png 格式的图像,都属于 LDRI
HDRI 图像是怎么来的?
- 通常是使用摄影机以不同曝光档位拍摄同一场景,得到若干张 LDR 图片,使用软件,把这些 LDR 信息合并成一张图片
- HDR 图像因为使用更高位深和浮点格式,可以存储比 8-bit JPEG 更丰富的颜色层级和亮度信息,尤其能保留超过普通屏幕显示范围的高亮信息
- 所以HDR 图片中的颜色数值从最亮的部分到最暗的部分的跨度很大,即所谓的“动态范围”很高
- 在默认情况下,两张图片在屏幕上看起来是一样的,这是因为屏幕显示的位深度也是 8 位/通道,超出这个范围的信息,会在屏幕上呈现“过曝”的纯白色,或者严重曝光不足带来的纯黑色

- 我们给两张图片都添加“曝光度”调整图层,并且把曝光档位同样压低3档:下方的 HDR 图片中,原本过曝变白的区域,显示出了更多的内容:云的细节,蓝天,太阳等。而上方的 LDR 图片的过曝区域,只是从纯白色变成了暗淡的灰色,因为这些过曝区域中本来就没记录任何细节信息

使用 HDRI(High-Dynamic Range Image 高动态范围图像)不仅可作为背景,还可以照亮整个场景


想要模型在不同DCC软件中表现一样需要注意哪些方面
这是TA的一个分支
- HDRI / 环境光要一致
- 影响最大的一项
- 灯光颜色、强度
- 色彩空间
- 贴图编码
- sRGB 开关
- 法线空间
showreal的相机设置和后处理
- 启用相机的后处理
