2013-09-01 23 views
0

我對這個模糊的Shader HLSL:GLSL着色器閥塊從HLSL工作不

struct VS_INPUT 
    { 
     float4 Position : POSITION0; 
     float2 TexCoord : TEXCOORD0; 
     float4 Color  : TEXCOORD1; 
    }; 
    struct VS_OUTPUT 
    { 
     float4 Position : POSITION0; 
     float4 Color  : COLOR0; 
     float2 TexCoord : TEXCOORD0; 
    }; 

    float4x4 al_projview_matrix; 

    VS_OUTPUT vs_main(VS_INPUT Input) 
    { 
     VS_OUTPUT Output; 
     Output.Position = mul(Input.Position, al_projview_matrix); 
     Output.Color = Input.Color; 
     Output.TexCoord = Input.TexCoord; 
     return Output; 
    } 

破片

texture al_tex; 
    sampler2D s = sampler_state { 
     texture = <al_tex>; 
    }; 

    int tWidth; 
    int tHeight; 
    float blurSize = 5.0; 
    float4 ps_main(VS_OUTPUT Input) : COLOR0 
    { 
     float2 pxSz = float2(1.0/tWidth,1.0/tHeight); 
     float4 outC = 0; 
     float outA = 0; 
     outA += Input.Color.a * tex2D(s, Input.TexCoord.xy + float2(0,-4.0 * pxSz.y * blurSize)).a * 0.05; 
     outA += Input.Color.a * tex2D(s, Input.TexCoord.xy + float2(0,-3.0 * pxSz.y * blurSize)).a * 0.09; 
     outA += Input.Color.a * tex2D(s, Input.TexCoord.xy + float2(0,-2.0 * pxSz.y * blurSize)).a * 0.12; 
     outA += Input.Color.a * tex2D(s, Input.TexCoord.xy + float2(0,-pxSz.y * blurSize)).a * 0.15; 
     outA += Input.Color.a * tex2D(s, Input.TexCoord.xy + float2(0,0)).a * 0.16; 
     outA += Input.Color.a * tex2D(s, Input.TexCoord.xy + float2(0,pxSz.y * blurSize)).a * 0.15; 
     outA += Input.Color.a * tex2D(s, Input.TexCoord.xy + float2(0,2.0 * pxSz.y * blurSize)).a * 0.12; 
     outA += Input.Color.a * tex2D(s, Input.TexCoord.xy + float2(0,3.0 * pxSz.y * blurSize)).a * 0.09; 
     outA += Input.Color.a * tex2D(s, Input.TexCoord.xy + float2(0,4.0 * pxSz.y * blurSize)).a * 0.05; 

    outC.a = outA; 
     return outC; 
    } 

有一個類似的水平...

的想法是,我爲紋理提供了寬度,高度和高度,並使用它來獲取像素相對於UV座標的「大小」。

然後,我通過對鄰居進行加權平均來使用它來執行正常模糊。

我移植這GLSL:

attribute vec4 al_pos; 
attribute vec4 al_color; 
attribute vec2 al_texcoord; 
uniform mat4 al_projview_matrix; 
varying vec4 varying_color; 
varying vec2 varying_texcoord; 
void main() 
{ 
    varying_color = al_color; 
    varying_texcoord = al_texcoord; 
    gl_Position = al_projview_matrix * al_pos; 
} 

破片

uniform sampler2D al_tex; 
varying float blurSize; 
varying float tWidth; 
varying float tHeight; 
varying vec2 varying_texcoord; 
varying vec4 varying_color; 
void main() 
{ 
    vec4 sum = vec4(0.0); 
    vec2 pxSz = vec2(1.0/tWidth,1.0/tHeight); 
    // blur in x 
    // take nine samples, with the distance blurSize between them 
    sum += texture2D(al_tex, varying_texcoord.xy + vec2(0,-4.0 * pxSz.y * blurSize))* 0.05; 
    sum += texture2D(al_tex, varying_texcoord.xy + vec2(0,-3.0 * pxSz.y * blurSize))* 0.09; 
    sum += texture2D(al_tex, varying_texcoord.xy + vec2(0,-2.0 * pxSz.y * blurSize))* 0.12; 
    sum += texture2D(al_tex, varying_texcoord.xy + vec2(0,-pxSz.y * blurSize))* 0.15; 
    sum += texture2D(al_tex, varying_texcoord.xy + vec2(0,0))* 0.16; 
    sum += texture2D(al_tex, varying_texcoord.xy + vec2(0,pxSz.y * blurSize))* 0.15; 
    sum += texture2D(al_tex, varying_texcoord.xy + vec2(0,2.0 * pxSz.y * blurSize))* 0.12; 
    sum += texture2D(al_tex, varying_texcoord.xy + vec2(0,3.0 * pxSz.y * blurSize))* 0.09; 
    sum += texture2D(al_tex, varying_texcoord.xy + vec2(0,4.0 * pxSz.y * blurSize))* 0.05; 
    gl_FragColor = varying_color * sum; 
} 

這是一個有點不同,但它是相同的邏輯。我將像素座標轉換爲UV座標,並乘以模糊因子,與hlsl因子相同。然而,這個glsl給了我一個原始的,沒有瑕疵的,稍微透明的版本。

這是什麼原因造成的?

回答

1

在你的片段着色器,你必須:

varying vec4 varying_color; 
[...] 
    gl_FragColor = varying_color; 

因此所有的紋理拾取和計算你沒有最終着色器輸出(任何影響,並有可能被編譯器完全去除)。您可能要輸出sum或對其進行修改,例如與gl_FragColor = varying_color * sum;或任何你想達到的效果。

另一件事:在碎片着色器中,您定義了紋理大小的變化,但是您不會從頂點着色器中傳遞它們。那些應該是制服(或者,在現代GLSL中,也有GLSL功能,它允許你直接處理這些值而不明確地傳遞它們)。

+0

對不起,我已經像你說過的那樣,我不小心張貼了一個測試用例。但是,它仍然是這樣。 – jmasterx

+0

vary_color是純rgba白色的頂點顏色。 – jmasterx

+0

@Milo:anothier的東西:在碎片着色器中,你定義了紋理大小的變化,但是你不會從頂點着色器中傳遞它們。這應該是制服(或者,在現代GLSL中,也有textureSize()GLSL函數,它允許你直接處理這些值而不會明確地傳遞它們) – derhass