【案例】三维扫描实现
开发平台:Unity 2022
开发工具:Unity Shader Graph
学习视频:三维扫描效果 Unity Shader Graph 教程
附注:参考视频为第三方作者,本文为学习性了解 Shadergraph 实现思路。
一、效果展示

注:扫描效果实质上是使用 Shader 进行 外轮廓描绘 + 模型缩放 的综合效果。
二、Shader Graph 路线图

三、案例分析
核心思路:
3.1 说明 | 获取模型深度信息

扫描效果的呈现在于一个三维空间下进行。需要获取模型的位置信息。因此有以下两种涉及模型位置信息:
- Screen Postion(屏幕位置):提供 屏幕上的二维坐标信息
- Postion(位置):提供 Object(模型空间)、World(世界空间)、View(视窗空间)、Tangent(切线空间)等的三维坐标信息
由于扫描效果的表现为三维空间环境下的立体效果,故选择 Position(位置)作为输入。
由于扫描效果与模型的叠加需要应用 “深度信息(模型)”,故 Mode = “View”。
Splite(分割)对 RGBA 数据分离单独输出。R G B 在三维中分别对应 X Y Z 轴。
- 在颜色的输出中,<=0 为黑色,反之为灰色->白色的过渡表现。
- 为了有效的获取 “深度信息(模型)”,利用其特性,接入 B(Z)作为值输出。但有意思的是
在相机视角前,无论如何拉远、近该材质应用的游戏对象,均表现为黑色。
最佳解释是 拉远近的操作对相机而言属于在 <=0 的范围内运动。 因此加入逆矩阵操作,Mutiple(乘法)转置。得到相机视角下 灰至白的深度信息。

3.2 说明 | 获取模型相交的位置信息

Scene Depth(场景深度)允许使用输入 UV(应该是标准化的屏幕坐标)访问当前摄像机的深度缓冲区。
Scene Depth(场景深度)设置 Sampling = “Eye”,该采样数据来源相机的 “深度视角位置” 信息。
知识点:在经过此算式后可以得到模型重叠处的位置信息。
