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