參考來源:
TA百人計劃/GAMES101
螢屏光柵化后對采樣后,如果不是1:1對應,會出現兩種情況
像素解析度>紋理解析度
一個texel對應多個pixel,頂點的uv映射到紋理上不是整數值
(紋理被拉伸)
1.取最近鄰方法時,相鄰的pixel會對應到相同的texel上
2.雙線性插值時,會計算映射到紋理中上下左右四個texel進行混合
無論如何,都不能得到11對應的關系,即像素會出現模糊(blur)

像素解析度<紋理解析度
一個pixel對應多個texel
1.取最近鄰時,pixel中會是紋理中離散的texel
2.雙線性插值時,取紋理中的4個texel混合
無論如何,都會出現紋理顏色的突變

注意:這兩種情況并不取決于紋理的絕對解析度,而是映射到螢屏之后根據視角等因素產生的問題,所以就算紋理這張圖的解析度很小,光柵化后也會出現紋理解析度>像素解析度的情況
這里省略mipmap的原理,詳情參考b站GAMES101中的紋理章節
以下兩種情況為mipmap映射完全正常的情況,即pixel:texel=1:1,每個像素都能在mipmap對應層數中找到11對應的紋理進行采樣

當pixel:texel不為1:1時,傳統的mipmap做法:
以長邊為基準選擇mipmap層數,此處因為豎直方向上pixel:texel=1:2所以選擇第1層
豎直方向上第0層mipmap為1:2,第1層mipmap為1:1,正確采樣
水平方向上第0層mipmap為1:1,第1層為2:1,一個pixel對應2個texel,所以采樣到了紋理中對應位置更遠的texel,而這個texel可能也同時被與2相鄰的pixel也采樣到了,所以pixel2和其他pixel可能共同對應同一個texel.就造成了過度模糊(overblur)

針對mipmap只能解決正方形映射的解決方法1:
各向異性過濾
在橫豎各壓縮2倍的mipmap的基礎上,額外生成橫豎壓縮比不同的圖
uv長度不同時查詢到對應的map就能實作1:1映射

缺點:
1.mipmap只占用額外1/3記憶體開銷,但是ripmap會占用額外3倍記憶體開銷,用不起
2.只能解決水平和豎直方向上比例不等的問題,如果出現映射到斜角上的紋理無法解決

解決方法2:通過額外存盤一張SAT紋理表
SAT紋理上記錄了紋理某位置(u,v)距離原點(0,0)所包圍的矩形中覆寫了多少texel
計算時通過取4個頂點的uv值在SAT圖中查詢就可以得知4個頂點所包圍的任意矩形內的texel數量,從而在插值時精確的計算出1:1的結果

缺點:記憶體開銷過大
對于各向異性過濾中不能采樣有角度的矩形的解決方法1:

解決辦法2:
現代GPU會在MipMap的基礎上通過多次采樣近似RipMap的效果,而不是存一張ripmap的紋理圖
所以在解決各向異性過濾的同時仍然只占用mipmap額外空間的大小(1/3)而不是3倍
具體如下圖

上面提到了傳統的mipmap中以映射到紋理中的最長邊來選擇mipmap層數

導致的問題是雖然長邊方向能夠做到1:1映射,但是短邊方向會出現過度模糊
而現代ripmap會根據最短邊來選擇mipmap層數,然后沿著長邊作為各向異性線,沿著線的方向多次采樣并合成,例如u:v為1:2,則采樣數量為1:1的兩倍
具體程序:

優點:各向異性線無方向性,無論任何角度的矩形都能夠1:1采樣
缺點:采樣(計算量大),并且因為采用三線性插值,如果為16x各向異性,則最大的計算量可能需要128次采樣
(三線性插值,如果1:1需要采樣8個紋理值
16x時,u:v=16(ripmap中最左下角和右上角的紋理圖)
8*16=128
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/523912.html
標籤:其他
上一篇:GIT入門與Gitee的使用
