超大地形纹理系统总结

近期学习了虚拟贴图的基本原理,希望能够对之前学的知识点做一个总结,因此使用DX12实现了一个超大地形的纹理系统。经过思考与验证个人觉得传统的虚拟贴图技术并不适合地形系统,原因如下:

1.为了提高地形的像素密度,以及降低磁盘的IO读取,地形的纹理贴图是通过CS实时计算获得的。计算的思想基于clipmap,以相机所在位置为中心渲染多张地形纹理,离相机越近的位置像素密度越高,反之越低。使用clipmap就无需feedback过程,以及indirect map索引。

2.可以很好的支持各种贴图采样,包括各向异性纹理采样。

当然实现该系统的时候也遇到了一个问题,因为每一张clipmap也是需要mipmap的,在clipmap边界处就会遇到一个问题,如果使用clipmap的uv坐标做为mipmap的判断条件,就会出现mipmap突变,因为ddx的时候一个像素点采样的uv坐标是1,另一个像素点是0。解决的办法是直接使用地形的uv坐标乘以一个系数做为mipmap的判断条件。因为透视相机近大远小的原因,地形的uv坐标也可以表示mipmap的走势,但是需要乘以一个系数做为调整。

另外,根描述符的管理已经迫在眉睫,做完lod会整理一下demo,准备加入描述符管理以及贴图资源的管理(dx12 api不支持生成mipmap)。

地形贴图最底层的clipmap需要驻留到显存中,dx12自己管理显存的需求已经开始向我招手了。。。

这次实现没有实现decal,目前的思路是在cs中对每个decal进行光栅化,然后渲染到地形贴图中。这样做可以实现,但是性能还没考虑清楚,因为decal的实现不影响大的方向,只是该分支中的一个细化问题,所以等到做完地形lod以及光影后进行补充。(其实是心里对这块已经厌烦了,想快点学习新的领域...)

PS:之前遇到的在cs中贴图无法使用根描述符传入的问题,这次又遇到了,翻看龙书发现里面已经写的很清楚了,根描述符不能传递贴图,当时看到了,没有注意。其实仔细思考一下就会理解为什么会这样,只传递一个地址指针是无法描述贴图的,因为贴图有mipmap,纹理数组,cubemap等等,而对于数组形式的缓存一个指针就可以了。所以显卡需要更详细的描述信息来解析贴图,因此必须使用根描述符表获取贴图的描述符。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值