tajourney tajourney
  • 首页
  • 渲染
    • PBR
    • NPR
  • 引擎
    • Unity
    • UE
  • DCC
    • Houdini
    • PhotoShop
    • Blender
  • 优化
  • 工具
  • 杂谈
    • 游戏
  • 友链
  • 关于
    • About Me
    • 网站公告
    • 维护记录
    • QA
  • 注册
  • 登录
首页 › 引擎 › Unity APV体素化光栅化实现

Unity APV体素化光栅化实现

糯米
5月前引擎阅读 427

今天查看Unity APV 源码时看其是如何对场景实现体素化的,网络上关于U6的APV系统讲解也非常少,写文章分享下。

APV系统在准备场景烘焙的数据之前,需要体素化场景用来加速场景SDF计算:因为计算每个三角面的距离非常复杂。APV使用了一种保守光栅化的方法实现了场景的体素化,大致步骤如下:

1.遍历场景中所有需要体素化的renderer的submesh,对于每个submesh:

2.在vertex shader内,将vertex Position (object space) => 根据x/y/z不同的投影轴投影到体素坐标系(world space)下;

3.geo shader内对原始的primitive边缘进行扩展,进行保守化光栅;

4.frag shader内进行AABB检测,将符合条件的体素化数据写入对应的 UAV (unordered access view)缓冲区的3D Tex内

Unity APV体素化光栅化实现-tajourney

为什么需要保守光栅化?

普通光栅化情况下,体素化一个三角面,我们只需要找到投影面积最大的投影面如下图所示:

Unity APV体素化光栅化实现-tajourney

但是,这样做会带来一个问题,部分primitive可能因为没有覆盖像素的中心点而出现漏洞:看一个2维的例子:

Unity APV体素化光栅化实现-tajourney
Unity APV体素化光栅化实现-tajourney

由于红色的primitive沿z轴的投影未覆盖任何像素(中心点),所以红色部分没有任何投影,这显然是不对的,我们需要扩展对应的像素。需要在shader中开启此功能。

Shader "Examples/CommandExample"
{
    SubShader
    {
         // The rest of the code that defines the SubShader goes here.

        Pass
        {    
              // Enable conservative rasterization for this Pass.
              Conservative True
            
              // The rest of the code that defines the Pass goes here.
        }
    }
}

APV如何进行保守化光栅

Unity APV体素化光栅化实现-tajourney

VS中计算

在GS中计算扩展后primitive的AABB最大最小值:由于上面所说原因,除了找到最小的投影值外还需要扩展1像素大小。

Unity APV体素化光栅化实现-tajourney

rcp(_outputsize.x)为1体素大小.

FS中进行AABB测试:

Unity APV体素化光栅化实现-tajourney

测试通过则输出结果到对应的3D Tex中。

这里_Output[pos]是填充3DTex的alpha值,目的是为了给后续操作进行标记是否存在体素。

参考&引用

1.《天谕》手游的体素方案实践

2.The Basics of GPU Voxelization

3.https://docs.unity3d.com/6000.0/Documentation/ScriptReference/Graphics.SetRandomWriteTarget.html

4.https://docs.unity3d.com/6000.0/Documentation/Manual/writing-shader-conservative-rasterization.html

5.https://learn.microsoft.com/zh-cn/windows/win32/direct3d11/conservative-rasterization

6.https://learn.microsoft.com/zh-cn/windows/win32/direct3d12/conservative-rasterization

赞(2)

请登录以参与评论

现在登录
暂无评论
搜索
近期文章
  • 终末地人物渲染(更新中) 2025年3月17日
  • Unity APV体素化光栅化实现 2025年2月5日
  • Unity 不同 ReflectionProbe 打断 Instancing 解决方案 2025年1月15日
  • Renderdoc 原神截帧记录 2024年8月22日
  • Houdini VAT:Vellum Cltoh笔记 2 2024年7月17日
归档
  • 2025年3月 (1)
  • 2025年2月 (1)
  • 2025年1月 (1)
  • 2024年8月 (1)
  • 2024年7月 (2)
  • 2024年1月 (1)
  • 2023年10月 (3)
  • 2023年9月 (4)
  • 2023年8月 (5)
  • 2023年7月 (4)
  • 2023年6月 (4)
  • 2023年5月 (1)
  • 2023年4月 (3)
  • 2023年3月 (11)
  • 2023年2月 (11)
  • 2023年1月 (1)
  • 2022年7月 (1)
  • 2022年6月 (2)
  • 2022年5月 (1)
  • 2022年4月 (1)
  • 2022年3月 (1)
  • 2022年2月 (1)
  • 2022年1月 (7)
  • 2
  • 0
Copyright © 2022-2025 tajourney. Dev by nuomi 版权所有.
鲁ICP备19015245号
  • 首页
  • 渲染
    • PBR
    • NPR
  • 引擎
    • Unity
    • UE
  • DCC
    • Houdini
    • PhotoShop
    • Blender
  • 优化
  • 工具
  • 杂谈
    • 游戏
  • 友链
  • 关于
    • About Me
    • 网站公告
    • 维护记录
    • QA
糯米
日语学习中
68
文章
15
评论
44
喜欢