clipmap

## history
- SGI最早提出,用来在terrain上用超高精度贴图,不过要特殊hardware支持。


## 原理
- texture分2部分,能完整存下来的部分(一般是非常糙的几级mip)+ 不能完整存下来,只能存部分的
- 所以DX的实现就是用1个有mip的texture+一个只有1级mip的texture array
- 需要自己手动算mip,去采array中的某个


## 实现细节
- 存不下的mip的当前贴图碎片放在stack中,每层的碎片的大小stacksize是固定的
- toroidal addressing:更新的时候有进有出、用这种寻址方式可以让新进的pixel正好使用老pixel的位置
- 算实际需要sample的位置
    - 对于一个uv,如果在完整的mipmap上,就是直接用这个uv sample就对
    - 实际的sample的贴图是mipmap的一部分,所以uv需要scale(先不考虑是否要offset,其实不用),scale的大小是这部分占完整mipmap的比例的倒数
    - 对于stack里的每一块,像素尺寸是StackSize,对于miplevel的那层的完整大小应该是OriginalSize / pow(2, miplevel)
    - 实际计算的时候就是clipTexCoord = input.TexCoord * ((OriginalSize / pow(2, mipLevel)) / StackSize)
    - white paper上为了让采的时候能采在像素的中心,用的是
    ```
    float2 clipTexCoord = (input.texCoord) / pow(2, iMipLevel);
    clipTexCoord.x *= scaleFactor.x + 0.5f;
    clipTexCoord.y *= scaleFactor.y + 0.5f;
    ```
    这里为啥加上0.5f我想不通。。。考虑iMipLevel = 0, scaleFactor=(1,1)的情况,clipTexCoord就是input.texCoord*1.5f,这个是不是打错了,应该是乘完了scaleFactor再 + 0.5f


## resource
- nvidia white paper: http://developer.download.nvidia.com/SDK/10/direct3d/Source/Clipmaps/doc/Clipmaps.pdf
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值