ZFX
ZFX Neu
Home
Community
Neueste Posts
Chat
FAQ
IOTW
Tutorials
Bücher
zfxCON
ZFXCE
Mathlib
ASSIMP
NES
Wir über uns
Impressum
Regeln
Suchen
Mitgliederliste
Membername:
Passwort:
Besucher:
4381352
Jetzt (Chat):
19 (0)
Mitglieder:
5239
Themen:
24223
Nachrichten:
234554
Neuestes Mitglied:
-insane-

ZFX
Coding-Foren
DirectX API
Re: Postprocess Gauss Filter Darstellungsfehler
Normal
AutorThema
Sven K. Offline
ZFX'ler


Registriert seit:
25.09.2004

Nordrhein-Westfalen
231112635
Postprocess Gauss Filter DarstellungsfehlerNach oben.
Hallo,

ich arbeite im Moment an einem Effekt zur Darstellung einer Sonne und benutze einen Gauss Filter via Pixelshader. Ich habe den Shader mit genau den selben Samplereinstellungen schon in RenderMonkey getestet und hatte keine Probleme. Jedoch wenn ich es in meinem Programm einbinde erscheinen Darstellungsfehler sobald farbige Pixel den Rand des RenderTargets erreichen.

http://img24.imageshack.us/img24/4411/gaussproblemq.jpg

Hat jemand auf Anhieb eine Vermutung, woran es liegen könnte? Was mir auch auffiel ist, dass irgendwie nur in Richtung der unteren rechten Ecke geblurt wird.

Hier der Rendercode zum blurren der einzelnen Mipmaps:
Code:
for(int iTex = 0; iTex<5; iTex++)
    {
        g_Device.GetD3DDevice()->SetRenderTarget(0, g_PPSurfDownSun[iTex]);
        g_Device.GetD3DDevice()->Clear(0,0,D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,0x000000,1,0);
        g_Device.GetD3DDevice()->BeginScene();
        g_PPGaussianFilter.SetFloat(g_PPTexResolution / pow(2.0f,iTex),\"g_TextureRes\");
        g_PPGaussianFilter.GetEffect()->SetTexture(\"textureSrc\", g_PPTempSun[iTex]);
        g_PPGaussianFilter.GetEffect()->SetTechnique(\"Quality3x3\");
        g_PPGaussianFilter.BeginScene();
            g_PPGaussianFilter.BeginPass();
                g_Device.DrawPrimitiveUp(XDPT_TriangleStrip,2,&vertex[iTex],sizeof(postfxVertex));
            g_PPGaussianFilter.EndPass();
        g_PPGaussianFilter.EndScene();
        g_Device.GetD3DDevice()->EndScene();
    }


und hier der Gauss Shader:

Code:
Texture textureSrc;

sampler2D samplerSrc = sampler_state
{
    Texture = ;
    AddressU = Clamp;
        AddressV = Clamp;
        MinFilter = Anisotropic;
        MagFilter = Linear;
        MipFilter = None;
};

float g_ScreenRes;
float gScaleFactor = 1.5;

float gWeights7x7[7][7] = {
    { 0.00000067, 0.00002292, 0.00019117, 
      0.00038771, 0.00019117, 0.00002292, 0.00000067 }, 
    { 0.00002292, 0.00078633, 0.00655965, 
      0.01330373, 0.00655965, 0.00078633, 0.00002292 },
    { 0.00019117, 0.00655965, 0.05472157, 
      0.11098164, 0.05472157, 0.00655965, 0.00019117 },
    { 0.00038771, 0.01330373, 0.11098164, 
      0.22508352, 0.11098164, 0.01330373, 0.00038771 },
    { 0.00019117, 0.00655965, 0.05472157, 
      0.11098164, 0.05472157, 0.00655965, 0.00019117 },
    { 0.00002292, 0.00078633, 0.00655965, 
      0.01330373, 0.00655965, 0.00078633, 0.00002292 },
    { 0.00000067, 0.00002292, 0.00019117, 
      0.00038771, 0.00019117, 0.00002292, 0.00000067 }
    };

float gWeights5x5[5][5] = {
        { 0.003, 0.013, 0.022, 0.013, 0.003 },
        { 0.013, 0.059, 0.097, 0.059, 0.013 },
        { 0.022, 0.097, 0.159, 0.097, 0.022 },
        { 0.013, 0.059, 0.097, 0.059, 0.013 },
        { 0.003, 0.013, 0.022, 0.013, 0.003 }
    };
    
float gWeights3x3[3][3] = {
        { 0.0625, 0.1250, 0.0625 },
        { 0.1250, 0.2500, 0.1250 },
        { 0.0625, 0.1250, 0.0625 }
    };
    
// -----------------------------------------------------------------
float4 PixelShader7x7(float2 UV: TEXCOORD0) : COLOR0
{
    float OffX = ( 1.0 / g_ScreenRes ) * gScaleFactor;
    float OffY = ( 1.0 / g_ScreenRes ) * gScaleFactor;
    float4 Color = ( float4 )0;
    float2 Pos;    
    for( int y = 0; y < 7; ++y )
    {
        for( int x = 0; x < 7; ++x )
        {
            Pos.x = UV.x + ( x - 3 ) * OffX;
            Pos.y = UV.y + ( y - 3 ) * OffY;
            Color += tex2D( samplerSrc, Pos ) * gWeights7x7[ x ][ y ];
        } 
    }     
    return float4( Color.rgb, 1.0 );
}
// -----------------------------------------------------------------
float4 PixelShader5x5(float2 UV: TEXCOORD0) : COLOR0
{
    float OffX = ( 1.0 / g_ScreenRes ) * gScaleFactor;
    float OffY = ( 1.0 / g_ScreenRes ) * gScaleFactor;
    float4 Color = ( float4 )0;
    float2 Pos;
    for( int y = 0; y < 5; ++y )
    {
        for( int x = 0; x < 5; ++x )
        {
            Pos.x = UV.x + ( x - 2 ) * OffX;
            Pos.y = UV.y + ( y - 2 ) * OffY;
            Color += tex2D( samplerSrc, Pos ) * gWeights5x5[ x ][ y ];
        } 
    } 
    return float4( Color.rgb, 1.0 );
}
// -----------------------------------------------------------------
float4 PixelShader3x3(float2 UV: TEXCOORD0) : COLOR0
{
    float OffX = ( 1.0 / g_ScreenRes ) * gScaleFactor;
    float OffY = ( 1.0 / g_ScreenRes ) * gScaleFactor;
    float4 Color = ( float4 )0;
    float2 Pos;    
    for( int y = 0; y < 3; ++y )
    {
        for( int x = 0; x < 3; ++x )
        {
            Pos.x = UV.x + ( x - 1 ) * OffX;
            Pos.y = UV.y + ( y - 1 ) * OffY;
            Color += tex2D( samplerSrc, Pos ) * gWeights3x3[ x ][ y ];
        } 
    } 
    return float4( Color.rgb, 1.0 );
}
// -----------------------------------------------------------------
technique Quality7x7
{
    pass p0
    {
        VertexShader = null;
        PixelShader = compile ps_3_0 PixelShader7x7();
    }
}
// -----------------------------------------------------------------
technique Quality5x5
{
    pass p0
    {
        VertexShader = null;
        PixelShader = compile ps_3_0 PixelShader5x5();
    }
}
// -----------------------------------------------------------------
technique Quality3x3
{
    pass p0
    {
        VertexShader = null;
        PixelShader = compile ps_2_0 PixelShader3x3();
    }
}


MfG Sven
15.03.2009, 15:01:02 Uhr
Trevo-Project
Schrompf Offline
ZFX'ler


Registriert seit:
04.04.2006

Sachsen
Re: Postprocess Gauss Filter DarstellungsfehlerNach oben.
Sieht für mich danach aus, als ob der PixelShader für jeden beliebigen Bildschirmpixel die Farben am rechten bzw. unteren Rand mit einberechnen würde. Kann das evtl. sein, dass Du vergessen hast, die Texkoord-Offsets beim Zugriff mit der Texturauflösung zu skalieren? Wenn Du dann noch das Texturkoord-Verhalten auf CLAMP gesetzt hast, müsste das genau diesen Effekt ergeben.

Wenn Du das dann mal zum Laufen bekommen hast: Du könntest *eine Menge* Shaderperformance sparen, wenn Du den Blur auf zwei separate Passes für vertikal und horizontal aufspaltest. Im Falle des 7x7-Filters wären das dann nämlich nur noch 7+7 Samples anstatt 7*7-Samples.
15.03.2009, 16:06:02 Uhr
Dreamworlds Development
Sven K. Offline
ZFX'ler


Registriert seit:
25.09.2004

Nordrhein-Westfalen
231112635
Re: Postprocess Gauss Filter DarstellungsfehlerNach oben.
Klappt nun, danke. Hatte die Texturgröße in die falsche Variable gesteckt.

Edit: Würde gerne nochmal auf die "Richtung" des Blurs eingehen. Sollte ein Gauss nicht quasi wie in einem Box Model bluren, also von rechts/links/oben/unten? Hier sieht man aber recht deutlich das bei mir das ganze sich nach unten rechts verlagert.

http://img6.imageshack.us/img6/7/gaussrichtungl.jpg

3 Mal gendert, zuletzt am 15.03.2009, 16:41:03 Uhr von Sven K..
15.03.2009, 16:31:28 Uhr
Trevo-Project
Schrompf Offline
ZFX'ler


Registriert seit:
04.04.2006

Sachsen
Re: Postprocess Gauss Filter DarstellungsfehlerNach oben.
Das kann an vielem liegen. Lies Dir dazu mal den Artikel "Directly mapping texel to pixel" aus der Direct3D9-Doku durch. Da steht unter anderem, dass man (nur für D3D9) ein pixelgenau wirkendes Rechteck 0.5 Pixel nach links oben verschieben muss. Mag nur ein halber Pixel Unterschied sein, aber da man Weichzeichner ja eigentlich nie auf das vollaufgelöste Bild, sondern auf kleinskalierte Varianten davon anwendet, addiert sich das über mehrere Passes und die kleinen Auflösungen schnell.

Ansonsten: Die Offsets scheinen bei Dir ja zu stimmen: für 7 Samples gehst Du korrekt von -3 bis +3. Bleibt evtl. noch die Renderzielgröße... wenn Dein Rechteck z.B. für eine 1024er Größe nur von 0.0f bis 1023.0f geht, wird das Bild sachte nach rechts unten gestreckt. Links oben passt alles, rechts unten erscheint alles mit einem kleinen Offset.

Was ich damit sagen will: das kann an allem möglichen liegen. Man muss da einfach aufpassen wie Sau. Wenn man dann noch Support für alte NonPOW2-unfähigen Grafikkarten haben will oder Rendertargets teilweise wiederverwenden will, wird die Geschichte schnell beliebig undurchsichtig. Geduld, Ausdauer, ein scharfes Auge, und PIX... mehr kann ich dazu nicht empfehlen.
15.03.2009, 17:20:50 Uhr
Dreamworlds Development
Sven K. Offline
ZFX'ler


Registriert seit:
25.09.2004

Nordrhein-Westfalen
231112635
Re: Postprocess Gauss Filter DarstellungsfehlerNach oben.
Erstaunlich was ein halber Pixel ausmacht. Hab das nun übernommen und es funktioniert super. Klar bei einem 5-fachem runterrechnen macht sich das schon sehr bemerkbar. Dank dir für deine Hilfe

MfG
Sven
15.03.2009, 17:48:19 Uhr
Trevo-Project
Normal


ZFX Community Software, Version 0.9.1
Copyright 2002-2003 by Steffen Engel