ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Fixed-Z vs 结构化采样:volsample 凭什么让体积渲染在相机移动时保持画面稳定?

Fixed-Z vs 结构化采样:volsample 凭什么让体积渲染在相机移动时保持画面稳定? Fixed-Z vs 结构化采样volsample 凭什么让体积渲染在相机移动时保持画面稳定【免费下载链接】volsampleStructured Volume Sampling - sample placement algorithm for real-time volume rendering with low aliasing, for camera-in-volume case.项目地址: https://gitcode.com/gh_mirrors/vo/volsample在实时体积渲染Volume Rendering中相机一旦进入云层、烟雾等体积内部并开始移动画面就会像隔着摇晃的水面观察世界一样抖动闪烁这就是困扰无数开发者的采样锯齿问题。volsample 正是为此而生的开源项目它提出了一套全新的结构化采样Structured Volume Sampling算法用很低的采样数就实现了相机移动时依旧稳定的体积渲染画面。本文将从 Fixed-Z 与结构化采样两种方案的对比出发用最通俗的语言讲清楚为什么 Fixed-Z 会崩结构化采样又凭什么稳。上图来自项目官方资料 img/overview.png左侧是围绕相机栅格化的种子几何十二面体体积采样点被放置在与五边形面平行的平面上右侧是渲染结果不同颜色代表每条像素射线实际行进并混合的射线数量。为什么相机一移动体积渲染画面就疯狂闪烁实时体积渲染为了性能通常只做 16~64 次采样。采样点就像是“画在空间里的一层层切片”体积的密度、颜色都靠读取这些切片上的值来积分。问题在于如果采样层的位置是跟着相机走的那么相机每移动一步采样层就会在体积里“扫”过一片区域。体积数据在采样层上被反复切开、重组同一帧里不同像素看到的采样密度不均匀下一帧又完全错位——于是画面出现明显的带状闪烁、波纹和“脏块”这就是采样锯齿。Fixed-Z 采样问题从“采样层跟着相机走”开始最常见的做法就是 Fixed-Z 采样所有采样点都放在与视方向相机 Z 轴垂直的平行平面上随相机一起运动。它的优点是实现简单、代码只有几十行缺点是只要相机移动采样层就在体积里整体平移锯齿立刻爆发。在 RayMarchCore.cginc 中RayMarchFixedZ就是这种方案从t dt开始沿着射线每隔固定步长取一个样本。视线每帧移动样本点就在体积中“扫”过配合稀疏采样数闪烁几乎不可避免。治标不治本Fixed-Z Pinned 的补救与局限为了改善这个问题项目里还实现了一个“改良版”RayMarchFixedZPinned见 RayMarchCore.cginc。它的思路是把采样层“钉”在世界空间通过累积相机前进距离_ForwardMotionIntegrated来反向补偿采样起始偏移让采样层在相机前进时尽量保持静止。这个方案对直线前进确实有效但对旋转、侧移、升降就束手无策了相机一转屏幕边缘的采样层会随着视锥横扫体积补偿机制完全失效闪烁照旧。代码注释里也明确承认了这一点——它只能解决平移解决不了旋转。结构化采样把采样层“钉”在世界空间volsample 的核心贡献是彻底换了一套思路不再让采样层跟着相机而是把采样层固定在世界空间的多组平行平面上。具体做法是用一组或多组世界空间朝向的平行平面来定义采样层相机无论怎么平移旋转采样点永远落在这些静止的平面上。由于采样点在平面上是“无限密集”的相机移动时样本只会沿平面滑动永远不会穿过采样层——锯齿的根源被直接消灭了。这个思想对应的核心代码是RaymarchStructuredRayMarchCore.cginc先计算射线与每组平面的交点作为起始偏移t_0和步长dtIntersectPlanes负责这部分再沿着平面逐层采样最后把多组采样的结果按权重混合。核心实现一个围绕相机的十二面体那么“用哪几组世界空间平面”就成了关键。volsample 的答案是正十二面体Dodecahedron。十二面体的每个五边形面对应一组平行平面方向12 个面覆盖了所有主要朝向方向分布均匀任意视线方向都能找到合适的采样平面。具体构建工作由 PlatonicSolidBlend.cs 完成它动态生成一个带倒角的十二面体网格并把每组平面的法线编码进顶点的 UV 通道、把混合权重写进顶点色然后让这个十二面体始终围绕相机栅格化渲染。为什么需要“倒角”因为不同面相交的棱边和顶点处单组平面无法平滑衔接。倒角把棱边变成矩形、顶点变成小三角形让三组平面可以在这些区域平滑过渡。混合三趟渲染1条、2条、3条射线体积渲染时像素被分成三种情况见 VolumeRender.shader 的三个 Pass五边形面区域只用 1 条射线采样权重为 1倒角棱边矩形区域用相邻两组平面的 2 条射线采样后混合倒角顶点三角区域用 3 组平面的 3 条射线采样后混合。每条射线的混合权重会依据视线与平面的夹角步长大小平滑计算保证三种区域之间没有硬边界、不产生接缝。这种“按几何区域分配采样射线数量”的设计让画面在任意角度下都稳定且无明显瑕疵。怎么亲手体验 volsamplevolsample 是一个开箱即用的 Unity 5 项目克隆仓库后直接用 Unity 打开即可git clone https://gitcode.com/gh_mirrors/vo/volsample体验入口非常友好打开测试场景src/unity/Assets/Scenes/下提供了云clouds.unity、雾立方体fogcube.unity和斯波扎大教堂sponza.unity三个体积渲染场景一键切换算法运行后屏幕左上角有 GUI 开关Structured Sampling是结构化采样关闭它即可切换回 Fixed-Z还可勾选Pin Samples对比 Fixed-Z Pinned直观对比两种方案在相机移动时的画面差异控制逻辑场景切换、关键词开关由 StructuredVolumeSampling.cs 的OnGUI和OnRenderImage第 80 行起驱动。如果你不想装 Unity也可以直接看 Shadertoy 风格的 GLSL 源码src/shadertoy/clouds.shader 是完整的体积云实时演示点鼠标可切换结构化/朴素采样src/shadertoy/diagram_BufA.shader 则是采样原理的可视化示意图。项目的完整幻灯片说明在 doc/volsample.pptximg/teaser.jpg 是体积云渲染的缩略效果图。总结什么时候该用结构化采样一句话概括如果你的体积渲染场景里相机可能进入体积内部并自由移动游戏飞行、云层穿梭、医学可视化结构化采样就是解决闪烁的最优解而如果你只是固定视角或相机不进入体积简单的 Fixed-Z 依然够用且更省性能。volsample 用“世界空间静止平面 十二面体几何 多射线混合”这套优雅组合证明了低采样数与高稳定性可以兼得。无论你是做游戏特效、气象可视化还是科研渲染都值得克隆下来跑一跑亲眼看看“相机移动不再闪”是什么体验。【免费下载链接】volsampleStructured Volume Sampling - sample placement algorithm for real-time volume rendering with low aliasing, for camera-in-volume case.项目地址: https://gitcode.com/gh_mirrors/vo/volsample创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表