中法线如何反转_[GPU Gems3] 22. 在GPU上烘焙法线贴图

Chapter 22. Baking Normal Maps on the GPU​developer.nvidia.com
0a1b298036a6746af8105857b14901f2.png

介绍

本文介绍在GPU中使用像素着色器生成法线贴图的方法,比CPU更快。首先分析传统的基于光线投射的法线贴图投影技术如何在图形处理器上实现,并解决一些常见问题比如内存限制和反走样。

传统算法

传统的烘焙算法包括沿着高模的方向将点投影到低模的表面。其中,低模需要纹理坐标以便在纹理空间光栅化,而高模则不需要。此外,低模还包含每个顶点的包围盒的位置信息。包围盒是从低模挤出的网格,使用包围盒作为光线投射的起点。

实现步骤如下:

  • 将低模光栅化到纹理空间,使用硬件对表面位置、切线基和纹理坐标进行插值。

c6548f6f26b00182d0d2b19ca716d9cf.png
  • 然后从插值的包围盒位置沿着高模的方向发射光线,对每个交点求导得到候选法线,然后选择离包围盒最近的法线作为最合适的法线。

4d5767730711e38664936f91b026e530.png
高模表面为reference surface;低模表面为working surface

数据结构优化

  • 加速结构:传统实现依赖于高模的光线追踪,因此需要加速结构来减少计算代价,这在高度并行的GPU中很容易实现。此处使用一致网格(uniform grid),它将网格分为固定大小的体素,然后使用3D数字微分分析器(3D-DDA)来遍历网格。3D-DDA允许一致网格的体素快速遍历,它只遍历光线经过的相邻体素,遍历的代价和访问的体素线性相关。

72a6840201be89e8208f2e94bba6f45b.png

09c5f48008922c4b1b0e56e7b14a7dc2.png

6f935cad7273408eb94b270f59312608.png
  • GPU结构:将一致网格和高模数据映射到硬件中的方法类似于光线追踪。将一致网格存储为3D纹理,每个体素包含一个指针用来指向代表网格cell的三角形列表。访问一致网格就是使用归一化的三次坐标来从3D纹理获取数据。每个cell的三角形列表被存储在各自的2D纹理中,每组三角形包含指向顶点的指针。参考的高魔被存储为2D纹理集,且顶点位置和法线分开存储。

256ae490de3451e21247c0d83556cefd.png

GPU实现

  • 设置和预处理:首先需要加载两个模型并生成基于高模的一致网格,然后将网格和几何数据映射到显存中的纹理。工作的低模被映射到顶点缓冲,并设置切线基、包围盒位置和纹理坐标信息。
  • 单Pass实现:1. 首先使用顶点着色器发送的顶点位置和包围盒向量来设置当前像素的光线,当包围盒在网格外面时将光线起点调整到光线和网格边界的交点;2. 接下来设置光线前进的步长和当前位置;3. 使用向量化静态分支对网格进行遍历来查找法线;4. 将法线转换到切线空间并缩放来存储在位图中。但该方法存在循环次数的限制,如果想要突破限制的话需要使用多pass方法。

1096044ccc8011a4063ac7ad4289bbd7.png
  • 多Pass实现:第一个pass为单Pass的第一二个步骤,将得到的信息存储在纹理中;第二个pass和接下来的N个pass对每个像素的网格执行单次遍历,并且查询被渲染像素和模板缓冲来避免处理空白区域;最后一个pass将法线贴图的像素转化到切线空间。该方法的限制是在纹理中存储临时变量的内存需求,可以通过tiled rendering来解决这个问题,即将渲染对象分割为tile使得纹理可以被重用来解决。
  • 反走样:有以下两种方式来反走样:1. 追踪更多的光线;2. 多次渲染法线贴图,每次对低模的顶点和包围盒位置进行jitter抖动

结果

b7b3f0a97a7815dd728e02ec09857a95.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值