GPU Gems1 - 25 用纹理贴图进行快速过滤宽度的计算
這章介紹在片元shader中計算導(dǎo)數(shù)近似值的技術(shù)。這個技術(shù)把特別的值載入紋理mipmap的每個級別,以特殊的方式使用紋理映射硬件,計算出導(dǎo)數(shù)的結(jié)果,給出在屏幕上的像素間某個量的變化率。
Cg標(biāo)準(zhǔn)程序庫提供ddx和ddy函數(shù),計算任意關(guān)于x和y像素的導(dǎo)數(shù),但是有些硬件不支持這些導(dǎo)數(shù)的計算(至少在寫這本書的時候),本文提供了一個解決方案,可以基于紋理映射功能解決這個問題。
在程序紋理中需要特別注意shader的反走樣,大致來說,不應(yīng)該在單個點上計算程序函數(shù)的值,而是在面積上計算函數(shù)的平均值,更準(zhǔn)確的說,就是要計算函數(shù)在當(dāng)前像素和鄰近像素之間的平均值。
a沒有反走樣,不能表現(xiàn)水平方向上的高頻細(xì)節(jié)。b把過于高頻的細(xì)節(jié)圖案中移走消除失真,計算出正確的過濾寬度是關(guān)鍵?用導(dǎo)數(shù)函數(shù)計算過濾寬度:
float filterwidth(float2 v) {float2 fw = max(abs(ddx(v)), abs(ddy(v)));return max(fw.x, fw.y); }用紋理計算過濾寬度:用函數(shù)tex2D()所做的紋理貼圖查詢,可以自動地對紋理查詢進(jìn)行反走樣,即使真實紋理坐標(biāo)的像素異常地變化,適當(dāng)過濾的紋理值還是能在每個像素的地方返回?;谠谙噜徬袼厣纤嬎愕募y理坐標(biāo),硬件可以為每個查詢決定過濾的紋理面積。我們以這樣一種方式進(jìn)行紋理查詢:(1)為特定的紋理坐標(biāo)租選擇mipmap級別(2)利用這一點決定過濾寬度
先將寬度信息寫入紋理中
再從根據(jù)輸入的uv信息讀出寬度信息
uniform sampler2D filterMap;float filterwidth(float2 uv) {float log2width = (255./16.) * tex2D(filterMap, uv).x;return exp2(-log2width); }?
?
?
總結(jié)
以上是生活随笔為你收集整理的GPU Gems1 - 25 用纹理贴图进行快速过滤宽度的计算的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【转】android电池(四):电池 电
- 下一篇: 拓扑分析的专有名词——拓扑容差和要素等级