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:
4410597
Jetzt (Chat):
12 (0)
Mitglieder:
5239
Themen:
24223
Nachrichten:
234554
Neuestes Mitglied:
-insane-

ZFX
Coding-Foren
DirectX API
Render2Texture + Antialiasing
Normal
AutorThema
Kimmi Offline
ZFX'ler


Registriert seit:
10.10.2002

Schleswig-Holstein
93425079
Render2Texture + AntialiasingNach oben.
Hallo ZFX'ler,
ich habe gerade ein Problem mit Render-to-Tetxure und Antialiasing. Ich erstelle mir eine Textur, definiere diese als RenderTarget. Nun rendere ich dort hinein, danach rendere ich die Textur auf den Screen, alles schön.
Nun habe ich allerdings Altialiasing angeschaltet, dementsprechend der RenderTexur einen StencilDepthBuffer mit den selben Parametern wie dem Backbuffer erzeugt und setzte die RenderTexur wie folgt als Target:
Code:
if ( pd3dTexture->isRenderTarget() )
    {
        assert( !m_DepthBuffers.empty() );
        hr = m_pd3dDevice->SetRenderTarget( 0, pd3dTexture->getRenderSurface() );
        if ( S_OK == hr )
            m_pRenderTarget = pd3dTexture;
        else
            return hr;
        
        SurfaceD3D9 *pSurfaceD3D9 = pd3dTexture->getDepthStencilSurface();
        assert( NULL != pSurfaceD3D9 );
        hr = m_pd3dDevice->SetDepthStencilSurface( pSurfaceD3D9->getSurface() );

        return ( hr == S_OK );
    }


Als Fehler kommt von Direct3D9:
Code:
D3D9 Helper: IDirect3DDevice9::DrawPrimitive failed: D3DERR_INVALIDCALL
Direct3D9: (ERROR) :MultiSampleType between DepthStencil Buffer and RenderTarget must match.
First-chance exception at 0x7c81eb33 (kernel32.dll) in DXDrawingTest.exe: Microsoft C++ exception: long @ 0x0012f9cc.
Direct3D9: (ERROR) :Clear failed.


Den DepthStencilBuffer erzeuge ich mit den Parametern des BackBuffers meines Renderdevices, MultiSampleType ist der gleiche:
Code:
HRESULT hr;
    IDirect3DSurface9 *pStencil( NULL );
    m_pd3dDevice->GetDepthStencilSurface( &pStencil );
    if ( NULL != pStencil )
    {
        D3DSURFACE_DESC desc;
        pStencil->GetDesc( &desc );
        IDirect3DSurface9 *pSurface( NULL );
        hr = m_pd3dDevice->CreateDepthStencilSurface( desc.Width,
            desc.Height, 
            desc.Format,
            m_d3dParameter.MultiSampleType,
            m_d3dParameter.MultiSampleQuality,
            TRUE,         
            &pSurface, 
            NULL );
        pStencil->Release();

        SurfaceD3D9 *pSurfaceD3D9 = new SurfaceD3D9( pTexture->getDimension(), pSurface );
        m_DepthBuffers.push_back( pSurfaceD3D9 );
        pTexture->setDepthStencilSurface( pSurfaceD3D9 );
    }


Und nun bin ich etwas ratlos, was ich falsch mache. Irgendwer eine Idee?

Gruß Kimmi

1 Mal gendert, zuletzt am 25.02.2009, 15:43:50 Uhr von Kimmi.
25.02.2009, 15:39:17 Uhr
Kurzer Weblog
Jörg Offline
ZFX'ler


Registriert seit:
03.12.2005

Nordrhein-Westfalen
133916438
Re: Render2Texture + AntialiasingNach oben.
Was hindert dich daran, die neu erstellte DepthStencil-Surface ohne Multisampling zu erzeugen?


2 Mal gendert, zuletzt am 25.02.2009, 16:53:14 Uhr von Jörg.
25.02.2009, 16:52:08 Uhr
Kimmi Offline
ZFX'ler


Registriert seit:
10.10.2002

Schleswig-Holstein
93425079
Re: Render2Texture + AntialiasingNach oben.
Daß es ein Requirement ist, daß das gerenderte in der Textur antialiaisiert sein muß .

Und ich versteh nicht, warum trotz gleicher Parameter diese als unterschiedlich angesehen werden.

gruß Kimmi
25.02.2009, 17:05:56 Uhr
Kurzer Weblog
Jörg Offline
ZFX'ler


Registriert seit:
03.12.2005

Nordrhein-Westfalen
133916438
Re: Render2Texture + AntialiasingNach oben.
Ah, du willst es andersrum als ich verstanden habe.
Ja dann musst du die Texture (besser das Rendertarget) entsprechend erstellen. CreateRenderTarget bietet doch die Parameter an. Nur musst du danach alles noch ein eine normale Texture kopieren...

PS: Dann wird dein Code nicht mehr so funktionieren, wie oben gepostet. Eine Texture selbst kann unter DX9 nicht multisampled sein, nur ein RenderTarget-Surface.

1 Mal gendert, zuletzt am 25.02.2009, 17:17:05 Uhr von Jörg.
25.02.2009, 17:15:55 Uhr
Kimmi Offline
ZFX'ler


Registriert seit:
10.10.2002

Schleswig-Holstein
93425079
Re: Render2Texture + AntialiasingNach oben.
Ah, ok. Ich hatte es genau anders herum gemacht und scheinbar liegt da das Problem. Danke dir, probiere ich gleich mal aus .

Gruß Kimmi

P.S.: Meine erste DX-Erfahrung ...
25.02.2009, 17:17:42 Uhr
Kurzer Weblog
Kimmi Offline
ZFX'ler


Registriert seit:
10.10.2002

Schleswig-Holstein
93425079
Re: Render2Texture + AntialiasingNach oben.
Wenn das eine ganz dumme Frage ist: ignorieren. Ich kann das doch auch nachträglich per Pixelshader machen, oder?

Gruß Kimmi

P.S.: Wir können auch auf das neue Board ausweichen: http://new.zfx.info/
26.02.2009, 11:08:42 Uhr
Kurzer Weblog
Schrompf Offline
ZFX'ler


Registriert seit:
04.04.2006

Sachsen
Re: Render2Texture + AntialiasingNach oben.
Was im Nachhinein machen? Antialiasing im Ganzen ist kein Thema: einfach ein Rendertarget doppelter Größe erzeugen und nachher kleinfiltern. Allerdings vermeidet man auf die Art die ganzen Optimierungen und Tricks, die Grafikkarten heute in Bezug auf Antialiasing draufhaben, weswegen das wirklich nahezu die xfache Rechenzeit kostet.

Aus einem AntiAliased Rendertarget zu lesen geht unter DX9 gar nicht. Da gibt es nur den reichlich kryptischen Weg, den Inhalt des Rendertargets nach dem Rendern in eine normale Textur umzukopieren. Mit StretchBlit(), glaube ich. Die Funktion macht dann auch das AA Resolve. Unter DX10 soll es dann gehen, sicher weiß ich das aber nur von DX10.1, wo man im Shader über die einzelnen Samples jedes Pixels iterieren kann.
26.02.2009, 13:07:52 Uhr
Dreamworlds Development
Normal


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