GPUPro360 Virtual Texture 101总结

#brief
- 东西多了,一般来说要加载的texture自然多,然后一屏下来真正用到的texture量其实有限(不谈半透明的话就是看到的那一层opaque),所以理想情况是只有看到的那部分texture碎片加载
- 由于硬件不直接支持这个,所以texture sample变复杂,先算出实际要sample的texture page在那里,然后去那个texture page上sample
- 另外需要知道那些texture碎片要load进来,这个就要把场景用简单的shader渲染一遍了(在preclip pass里搞)
- 一些细节,比如如何filter(小块边界点上sample,这里使用边界加boarder解决)
- 感觉后续的硬件和API可以支持一下

# 4.2 Virtual Texture Mapping
- 数据结构
- indirection texture: downscaled version of the complete texture, each texel 包含
- offset in tilecache(big physical texture)
- actual resolution(加载来不及的时候用糙mip来fallback,不然就要loop了)
- tile cache: one large texture on gpu, 所有用到的mip的块都放在里面
# 4.2.1 Page Fault Generation
- larrabee 说是有native的page fault
- 这里是只能每帧自己算visible tile了:用特殊shader render scene来render tileid
- 可以低分辨率
- 可以顺便处理occlusion。
- FOV可以搞大一点来prefetch

# 4.2.2 Page Handler
- 每帧update tile数量设置limit,配合总是加载很糙的等级,保证不会有完全黑的部分

# 4.2.3 Rendering
- 用了virtual texture后UV就不是简单的UV,而且是全局那一个大virtual texture上的UV了(不知道浮点精度有无问题)
- 要从UV里算出tile cache中的page position,mipmap的resolution,还有采tilecache时的uv

# 4.3 implementation detail
- page fault generation:需要算mip,要用gradient来算x和y方向的uv像素数向量的最大值的log
- page fault handling(都是策略性的)
- disk上存JPEG,运行时换成DXTC
- tutorial上时把每个tile搞成了jpeg,小文件可以合并
- 可以隔着级存mip,用的时候生成(觉得无所谓,省不了太多)
- cache saturation,可能cache还是不够用,就要想其他替换策略
- tile upload,不同版本方法不同,不太了解
- indirect texture update, 这个不是部分更新了,而是每次整个更新
- top就是fallback
- 其他的层:把parent copy下来,然后把实际有的给replace,没有的block就用parent对应的
- rendering
- 主要时本来相邻的东西变得不相邻所带来的问题
- texture gradiant,边界处算gradiant出问题,所以要手工算gradiant(我猜就是说ddx ddy这种不能直接搞,要自己sample多次来搞了)
- tile boarder,filter是无论如何必须有的,解决办法是加boarder,前后+4的boarder,这样一个块就是136=128+8
- DXTC boader和block。加了border会导致tile的boarder可能在不同dxtc block里,从而导致texture space里的同一个值被放在不同的block里,不同的压缩方式导致了有不同的值。这个总之会导致color bleeding。用了4pixel boarder后没这个问题(用1pixel的boarder就有这个问题)。

# 疑问
- 感觉书上给的shader代码中有个错误,sample的时候,算那个offset的时候不应该是乘TileSize,而应该是乘以(TileSize/VirtualTextureResotion),这样才会把page中的offset转换成VirtualTexture中的offset)

# related

猜你喜欢

转载自blog.csdn.net/killer4747/article/details/80793135