GPU Gems1 - 24 高质量的过滤
在一些應(yīng)用中,高質(zhì)量的過濾是至關(guān)重要的,可以用像素shader代碼執(zhí)行任何過濾。GPU著色程序不用于CPU的主要之處在于:一般來說,CPU數(shù)學(xué)操作比紋理訪問更快,而在GPU中恰恰相反。圖像過濾的目的很簡單:對于給你的輸入圖像A,我們想要?jiǎng)?chuàng)建新的圖像B。把源圖像A變換到目標(biāo)圖像B的操作就是圖像濾波。最一般的變換是調(diào)整圖像大小,銳化,變化顏色,模糊圖像等。
源像素的圖案和它們對圖像B像素的相對貢獻(xiàn),就稱為過濾核心(kernel)。把核心應(yīng)用到源圖像的過程叫做卷積。如果核心只是把像素簡單的進(jìn)行平均,我們稱這個(gè)模型為盒式濾波器。
我們可以把kernel作為參數(shù)直接代入shader,如下圖所示及代碼所示。
中心在W11的3x3過濾核心?
float4 convolve3x3PS(vertexOutput IN,uniform sampler2D ColorMap,uniform float W00, uniform float W01, uniform float W02,uniform float W10, uniform float W11, uniform float W12,uniform float W20, uniform float W21, uniform float W22,uniform float Sum,uniform float StepHoriz,uniform float StepVert) : COLOR {float2 ox = float2(StepHoriz, 0.0);float2 oy = float2(0.0, StepVert);float2 PP = IN.UV.xy - oy;float4 C00 = tex2D(ColorMap, PP - ox);float4 C01 = tex2D(ColorMap, PP);float4 C02 = tex2D(ColorMap, PP + ox);PP = IN.UV.xy;float4 C10 = tex2D(ColorMap, PP - ox);float4 C11 = tex2D(ColorMap, PP);float4 C12 = tex2D(ColorMap, PP + ox);PP = IN.UV.xy + oy;float4 C20 = tex2D(ColorMap, PP - ox);float4 C21 = tex2D(ColorMap, PP);float4 C22 = tex2D(ColorMap, PP + ox);float4 Ci = C00 * W00;Ci += C01 * W01;Ci += C02 * W02;Ci += C10 * W10;Ci += C11 * W11;Ci += C12 * W12;Ci += C20 * W20;Ci += C21 * W21;Ci += C22 * W22;return (Ci/Sum); }通過輔助圖像,我們可以進(jìn)行優(yōu)化。充分利用紋理中的rgba通道,可以調(diào)用一個(gè)tex2D函數(shù)訪問四個(gè)相鄰像素而不必調(diào)整紋理索引?,F(xiàn)在的卷積shader變得很短:
float4 convolve3x3GrayHPS(vertexOutput IN,uniform sampler2D GrayMap,uniform sampler2D NeighborMap,uniform sampler2D CornerMap,uniform float W00, uniform float W01, uniform float W02,uniform float W10, uniform float W11, uniform float W12,uniform float W20, uniform float W21, uniform float W22,uniform float Sum) : COLOR {float gray = tex2D(GrayMap, IN.UV).x;float4 ntex = tex2D(NeighborMap, IN.UV);float4 ctex = tex2D(CornerMap, IN.UV);float Ci = ctex.x * W00;Ci += ntex.z * W01;Ci += ctex.y * W02;Ci += ntex.x * W10;Ci += gray * W11;Ci += ntex.y * W12;Ci += ctex.z * W20;Ci += ntex.w * W21;Ci += ctex.w * W22;return (Ci/Sum).xxxx; }本文隨后介紹了雙立方過濾等其他過濾技術(shù)以及反走樣的理論,這里就不細(xì)講了。
?
雙立方過濾的核心函數(shù)可以寫一個(gè)函數(shù)為每個(gè)采樣像素計(jì)算過濾值,但是因?yàn)樵谶^濾范圍中不需要高頻精度,所以查詢表就能工作得很好,可以簡單地把這些數(shù)值寫進(jìn)小的浮點(diǎn)紋理,不但精度適當(dāng),而且查詢速度快(典型的空間換時(shí)間)。
?
?
?
總結(jié)
以上是生活随笔為你收集整理的GPU Gems1 - 24 高质量的过滤的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 拓扑分析的专有名词——拓扑容差和要素等级
- 下一篇: GPU Gems1 - 26 OpenE