[toc]
草地渲染的剔除流程
- 先剔除最大不可见距离外的草
- 剔除不在 NDC 空间内的草
- 剔除被遮挡的草 (HiZ 剔除)
# AABB 裁剪
一个最简单的裁剪方法,比如在使用 Gpu instance 进行渲染前可以通过 ComputeShader 对准备传入 GpuInstance 的 ConstantBuffer 进行数据的裁剪,在这个阶段可以用一个比较 Trick 的方法进行裁剪,即计算物体假的 BoundaryBox, 然后再计算这个 BB 是否在 NDC 空间的包围体内.
而这个过程只需要花费几个 if
判断,因为其具有极低的消耗,所以很适合用作在大量物体渲染流程中。
# Hi-Z Culling (遮挡剔除)
Hierarchy Z Hierarchy Z 裁剪需要生成 Depth Mip, 即深度图的 Mipmap, 生成 Mipmap 最简单的办法就是降采样。
假设原本的 Mipmap 是 1024*1024, 每次降采样时,长于宽降低为原来的 1/2
,而降采样后的新的贴图则使用原本贴图每个 2*2 格子中的最小值 (一种最简单的滤波法)
使用 ComputeShader 生成 Hiz Mipmap 的方法
裁剪算法:
如果被计算实例化物体的 最小深度
大于深度图的 最大深度
,则为不可见物体,不放入待渲染队列 解释:
固定每个草的高度为 0.2, 根据草的 Z坐标
和远裁剪平面的高度计算出 当前z坐标下的平面高度
,然后根据这个草和这个高度的比值以及 屏幕的实际像素高度
计算出 当前草占屏幕的像素数
.
之后根据这个像素数来判断使用哪个等级的 Mipmap 来进行遮挡性的判断