Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Frogy

Frischling

  • »Frogy« ist der Autor dieses Themas

Beiträge: 43

Wohnort: Weimar

Beruf: Schüler (Klasse 9; Spezi)

  • Private Nachricht senden

1

02.02.2007, 21:41

Rendern auf Texturen

Ich habe mir überlegt, dass das Rendern auf Texturen eine interessante Sache ist. Deshalb habe ich mir den ganzen Kram im Doc von DirectX angeschaut. Alles funktioniert außer das Leeren des Z- und des Backbuffers (ohne sie zu Leeren sieht man nur Müll).

So erstelle ich die Renderoberfläche:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
    // Textur

    g_pD3DDevice->CreateTexture(256,256,1,D3DUSAGE_RENDERTARGET,D3DFMT_X8R8G8B8,
                                D3DPOOL_DEFAULT,&g_pRenderTexture,0);

    // Oberfläche für Textur, auf die gerendert wird

    D3DXCreateRenderToSurface(g_pD3DDevice,
                            256,
                            256,
                            D3DFMT_X8R8G8B8,
                            FALSE,
                            D3DFMT_D24S8,
                            &g_pRenderSurface);

    g_pRenderTexture->GetSurfaceLevel(0,&g_pRenderTarget);


Und so leere ich den Z- und den Backbuffer:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
    g_pRenderSurface->BeginScene(g_pRenderTarget, &g_pViewport);

        // Den Bildpuffer und den Z-Buffer leeren

        if(FAILED(hResult = g_pD3DDevice->Clear(0,
                                                NULL,
                                                D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,
                                                D3DCOLOR_XRGB(0, 0, 0),
                                                1.0f,
                                                0)))
        {
            // Fehler beim Leeren!

            TB_ERROR_DIRECTX("g_pD3DDevice->Clear", hResult, TB_STOP);
        }


Hier noch der Viewport:

C-/C++-Quelltext

1
D3DVIEWPORT9            g_pViewport = {0,0,256,256,0.0f,1.0f};  // Viewport


Wo ist der Fehler?

2

03.02.2007, 01:07

Is tschon lange her das ich mir das mal angesehen hab aber fehlt da nicht noch ein 'SetRenderTarget'

Chase

Alter Hase

Beiträge: 753

Wohnort: Nagaoka / Darmstadt / Düsseldorf

Beruf: fauler Studi

  • Private Nachricht senden

3

03.02.2007, 08:50

Du brauchst 2 Texturen, eine auf die gerenderet wird und eine fuer den Tiefenpuffer. Wenn die Textur die gleiche Aufloesung wie Back- und Z-Buffer hat kannst du evtl auf 2 Texturen verzichten, da es der normale Z-Buffer auch tut; muesste man mal ausprobieren

Jedenfalls:
Erstell noch eine Texture mit dem D3DUSAGE_DEPTHSTENCIL Flag und mit irgendeinem Z-Buffer-tauglichen Format (D3DFMT_16, D3DFMT_32 oder sowas)
Dann setzt du das RenderTarget (die Oberflaeche der Texture) das du eben so schoen ermittelt hast

C-/C++-Quelltext

1
SetRenderTarget(0,g_pRenderTarget);

und das Tiefenpuffer-RenderTarget:

C-/C++-Quelltext

1
SetDepthStencilSurface(0,g_pDepthTarget);
"Have you tried turning it off and on again?"

Frogy

Frischling

  • »Frogy« ist der Autor dieses Themas

Beiträge: 43

Wohnort: Weimar

Beruf: Schüler (Klasse 9; Spezi)

  • Private Nachricht senden

4

03.02.2007, 09:49

Im Doc von DX steht aber, dass es den Z-Buffer selst erzeugt. Ich probiers natürlich trozdem mal aus.

Danke für den Tip, ich hätte mich auf DX verlassen ;)

Frogy

Frischling

  • »Frogy« ist der Autor dieses Themas

Beiträge: 43

Wohnort: Weimar

Beruf: Schüler (Klasse 9; Spezi)

  • Private Nachricht senden

5

03.02.2007, 09:59

Für chriss:
Für das SetRenderTarget sorgt DX bei dem Aufruf von

C-/C++-Quelltext

1
g_pRenderSurface->BeginScene(g_pRenderTarget, &g_pViewport);

selbst. Genau wie es mit dem erstellen des Rendersurface auch für den Z-Buffer sorgen sollte.
Fortune, fame
Mirror, vain
Gone insane
But the memory remains

Metallica

Frogy

Frischling

  • »Frogy« ist der Autor dieses Themas

Beiträge: 43

Wohnort: Weimar

Beruf: Schüler (Klasse 9; Spezi)

  • Private Nachricht senden

6

03.02.2007, 10:03

Außerdem sehe ich ja wie gesagt (ohne den Befehl zum Leeren) auch etwas, nur dass man deutliche Anzeichen für einen ungeleerten z-Buffer erkennt.

Die Fehlerausgebe lautet übrigens "Invalid Call" ;)
Fortune, fame
Mirror, vain
Gone insane
But the memory remains

Metallica

Chase

Alter Hase

Beiträge: 753

Wohnort: Nagaoka / Darmstadt / Düsseldorf

Beruf: fauler Studi

  • Private Nachricht senden

7

03.02.2007, 10:25

Zitat von »"Frogy"«

Außerdem sehe ich ja wie gesagt (ohne den Befehl zum Leeren) auch etwas, nur dass man deutliche Anzeichen für einen ungeleerten z-Buffer erkennt.

Die Fehlerausgebe lautet übrigens "Invalid Call" ;)

Ja, wahrscheinlich weil deine Textur eine Aufloesung von 256*256 hat, der Tiefenpuffer aber nicht. Waehrend auf die Textur gerendert wird, schreibt DX einfach in den "normalen" Tiefenpuffer. Ich kann mich aber auch irren :|
"Have you tried turning it off and on again?"

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

8

03.02.2007, 10:57

Zitat

IDirect3DDevice9::Clear will fail if you:

Try to clear either the depth buffer or the stencil buffer of a render target that does not have an attached depth buffer.
Try to clear the stencil buffer when the depth buffer does not contain stencil data.

Zitat

Note In the past, this API was used to set the depth stencil as well. In Direct3D 9 however, this API has been split up as documented in the IDirect3DDevice9::SetRenderTarget and IDirect3DDevice9::SetDepthStencilSurface sections.

Zitat

Restrictions for using this method include the following:

The multisample type must be the same for the render target and the depth stencil surface.
The formats must be compatible for the render target and the depth stencil surface. See IDirect3D9::CheckDepthStencilMatch.
The size of the depth stencil surface must be greater than or equal to the size of the render target.


Die Doku ist was feines ;)

Versuch mal testweise nur D3DCLEAR_TARGET.
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

Frogy

Frischling

  • »Frogy« ist der Autor dieses Themas

Beiträge: 43

Wohnort: Weimar

Beruf: Schüler (Klasse 9; Spezi)

  • Private Nachricht senden

9

03.02.2007, 11:12

Dankeschön :) , es klappt, und sieht wie gewünscht aus :D !!

Aber was mache ich nun, wenn ich trotzdem den Z-Buffer leeren muss (mir könnte ja auch noch anderer Kram einfallen ;) )?
Fortune, fame
Mirror, vain
Gone insane
But the memory remains

Metallica

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

10

03.02.2007, 12:52

siehe Doku Quotes
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

Werbeanzeige