Vertex Baking

顶点烘焙技术:基于最小二乘法的实现
顶点颜色渲染用于存储模型表面信息,如AO效果,以节省空间和提高效率。本文介绍了基于最小二乘法的顶点烘焙方法,通过计算采样点与顶点间的最小二乘关系,得到烘焙后的顶点值。实验结果显示,虽然Least Square方法视觉上可能不那么平滑,但在图像相似度上优于平均方法。

顶点颜色渲染是一种较早的渲染方法,它为模型的三维网格中的每个顶点提供一组单独的颜色值,然后在传入硬件进行光栅化渲染时GPU会根据顶点的颜色对每个像素进行相应的插值而得到Pixel上的颜色值,进而为多边形着上渐变色。由其操作模式可知,一个三角形内部的像素受到其关联的三个顶点上的颜色值所影响而不论三角形的大小,因而若三角形的密度较大时这种方法还是很不错的,但是,当整个网格中三角形的密度较小时(大面种区域上有较少的三角形),就会得到不够平滑的着色效果。不过使用顶点颜色的渲染方式来表示模型表面一些较为低频的信息还是蛮不错的,比如AO等。一些早期(包括现在)的游戏引擎中就选择以顶点颜色来存储AO信息从而取代LightMap的作用以节省各种空间并提高效率。

 

上左图为对一个场景进行基于RT的AO烘焙的结果;右图为使用顶点着色的方法得到的结果,从其中可以看出使用顶点颜色来进行AO效果的烘焙效果还是不错的。当然,顶点颜色并不只能存储AO信息,其它一些Mesh表面的信息均可以通过一定的方式向顶点中存储并在渲染时使用。
一般来说将外部信息向Mesh的顶点中进行烘焙主要以下几种方法:

  1. 从当前顶点处直接采样外部信息并做为其对应的颜色值。在此种方式下,比如对于AO的烘焙就是直接根据场景计算该点外的AO值即可;
  2. 在Mesh表面上使用某种方式的采样(一般是均匀采样)并根据不同采样点对当前顶点的权重来计算外部信息在当前顶点下的颜色均值。一个三角形在渲染插值时其内部的像素只会受到其三个顶点的影响,因而一个顶点处的颜色值在计算时也只需考虑其所关联的那些三角形上的采样点即可。每个采样点对于该顶点的权重则可以直接由其重心坐标来计算。
  3. 类同于第二种方法,同样是在Mesh表面上设置采样点,只不过在由采样点计算顶点值时并不直接使用均匀权重综合的方法来计算,而是增加使用某些优化算法来进行,比如Least Square等(Least Square Vertex Baking中提出的这种方法)。
Least Square based Baking

接下来简单介绍下基于最小二乘法的顶点值烘焙方法(关于Least square介绍的资料也很多):给定Mesh表面的均匀采样点集P = (p1, ..., p

### Unity 中的顶点颜色烘焙插件 在 Unity 中,烘焙顶点颜色(Vertex Color Baking)是一种将光照信息或环境光遮蔽(AO)直接写入模型顶点颜色通道的技术。虽然 Unity 的内置烘焙系统(如 Lightmapper)通常用于生成光照贴图,但在某些情况下,使用顶点颜色烘焙可以节省内存、减少纹理依赖,并在运行时提供更灵活的着色器控制。 #### 支持顶点颜色烘焙的插件 1. **Vertex Color Bakery** Vertex Color Bakery 是一款专为 Unity 设计的插件,支持将光照、AO、阴影等信息烘焙到模型的顶点颜色中。该插件提供了直观的界面,支持多边形网格的实时预览,并可将结果导出为带有顶点颜色数据的 Mesh。其主要功能包括: - 支持静态和动态光照烘焙 - 可将 AO、光照强度等信息写入顶点颜色的 RGB 或 Alpha 通道 - 支持 Unity 的渐进式 Lightmapper 和 Enlighten 系统 [^1] 2. **ProBuilder + ProGrids + Vertex Paint** Unity 的 ProBuilder 插件集成了顶点绘制功能,允许用户在编辑器中直接为模型顶点上色。虽然它主要用于手动绘制顶点颜色,但结合自定义脚本,也可用于将烘焙光照数据写入顶点颜色。此方案适合需要快速原型设计和轻量级烘焙的项目。 3. **Mesh Baker** Mesh Baker 是一个功能强大的网格合并与烘焙插件,支持将多个网格合并为一个,并在合并过程中烘焙光照、AO 和颜色信息。该插件可将烘焙结果写入顶点颜色,适用于需要减少 Draw Call 的性能优化项目。 4. **Custom Vertex Color Baking Script** 若项目需求较为特殊,可使用 C# 编写自定义顶点颜色烘焙脚本。以下是一个简单的示例代码,用于将 AO 值写入顶点颜色的 Alpha 通道: ```csharp using UnityEngine; public class VertexColorBaker : MonoBehaviour { public float aoIntensity = 1.0f; void Start() { Mesh mesh = GetComponent<MeshFilter>().mesh; Color[] vertexColors = new Color[mesh.vertexCount]; for (int i = 0; i < mesh.vertexCount; i++) { float aoValue = CalculateAO(i); // 自定义 AO 计算逻辑 vertexColors[i] = new Color(1, 1, 1, Mathf.Clamp01(aoValue * aoIntensity)); } mesh.colors = vertexColors; } float CalculateAO(int vertexIndex) { // 示例:简单随机 AO 值,实际应根据光照或遮挡计算 return Random.Range(0.5f, 1.0f); } } ``` #### 数据导入与使用 Unity 支持从 FBX 文件中导入顶点颜色数据,包括 Alpha 通道。在导入设置中,确保启用“Import Vertex Colors”选项,以便在运行时访问顶点颜色值。顶点颜色可在 Shader 中通过 `COLOR` 语义访问,例如: ```hlsl struct appdata { float4 vertex : POSITION; float4 color : COLOR; }; struct v2f { float4 pos : SV_POSITION; float4 vertexColor : COLOR; }; v2f vert(appdata v) { v2f o; o.pos = TransformObjectToHClip(v.vertex.xyz); o.vertexColor = v.color; return o; } half4 frag(v2f i) : SV_Target { float ao = i.vertexColor.a; return half4(1, 1, 1, ao); } ``` #### 应用场景 - **环境光遮蔽(AO)烘焙**:将 AO 信息写入顶点颜色 Alpha 通道,用于后期着色器混合或阴影增强。 - **性能优化**:减少光照贴图的使用,适用于低端设备或移动平台。 - **快速原型设计**:在无需复杂光照烘焙流程的情况下,快速生成视觉效果。 ####
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值