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

1

04.10.2003, 12:12

Bildpuffer auf eine Textur schreiben

Hallo,

weiß jemand von euch, wie man den BildPuffer auf eine Textur schreibt, ohne ihn anzeigen zu lassen???(Also ohne Present()) Ich hab es schon mit der DirectX-Funktion GetBackBuffer versucht. Diese Funktion unterstüzt nur Oberflächen :crying: .

Danke, Chrissi

Tracert

Treue Seele

Beiträge: 108

Wohnort: Braunschweig

Beruf: Student

  • Private Nachricht senden

2

04.10.2003, 12:35

Sind Texturen nicht auch Oberflächen? ???

DarthB

Treue Seele

Beiträge: 265

Beruf: Schüler

  • Private Nachricht senden

3

04.10.2003, 12:38

Schau dir mal die Methode GetSurfaceLevel vom IDirect3D9Texture Interface an. (DXDoku)

Du erhälst einen Doppelpointer auf ne Surface, die die Textur beschreibt. Diese Surface kannst du dann verändern. Beispielsweiße Pixel für Pixel per Lock, was eher nicht sehr peformant sein sollte. Jedenfalls veränderst du somit auch die Textur.

[EDIT]
Texturen bestehen aus mehren Oberflächen wobei der erste Parameter der GetSurfaceLevel Methode die Ebene bezeichnet. 0 ist die erste usw.
[/EDIT]

Ciao DarthB :huhu:

4

05.10.2003, 15:36

Aha,

aber wie kann ich jetzt eine Oberfläche(in meinem fall mit GetBackBuffer() erstellt) mit tbDirect3D::SetTexture() ansprechen, bzw, damit laden?

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

5

05.10.2003, 15:50

Du kannst z.B. sowohl die Textur als auch die Back-Buffer-Surface sperren und die Daten manuell vom Back-Buffer in die Textur kopieren. Es geht auch mit IDirect3DDevice9::UpdateSurface. Das wäre wahrscheinlich besser. Die Methode erwartet zwei Surfaces. Einmal nimmst Du da die Back-Buffer-Surface und einmal die Surface der Textur. Die Textur sollte dabei nur einen einzigen MIP-Level haben.

6

06.10.2003, 13:58

Also,
jetzt noch einmal für ganz dumme. Ich kriege das einfach nicht hin...

In meiner Klasse steht:

Quellcode

1
2
3
    // Variablen
    LPDIRECT3DTEXTURE9  m_pBackgroundT; // Hintergrundbild (Textur)
    IDirect3DSurface9*  m_pBackgroundS; // Hintergrundbild (Oberfläche)


in meiner Load-Methode steht:

Quellcode

1
2
3
4
5
6
7
    // Surface anlegen
    tbDirect3D::GetDevice()->CreateOffscreenPlainSurface(
                                        tbDirect3D::GetScreenSize().x,tbDirect3D::GetScreenSize().y,
                                        D3DFMT_A8R8G8B8,
                                        D3DPOOL_DEFAULT,
                                        &m_pBackgroundS,
                                        0);


in meiner Unload-Methode steht:

Quellcode

1
2
3
4
5
6
7
8
9
    // Die Textur löschen
    tbTextureManager::ReleaseTexture(m_pBackgroundT);

    // DieoBerfläche löschen
    if(NULL != m_pBackgroundS)
    {
        m_pBackgroundS->Release();
        m_pBackgroundS = NULL;
    }


Und in meiner Render Methode steht:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    // Puffer leeren und Szene beginnen
    tbDirect3D::Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,
                      tbColor(0.7f, 0.7f, 0.7f), 1.0f, 0);

    tbDirect3D::BeginScene();
    
    g_pMissile->m_pFont1->Begin();
    g_pMissile->m_pFont1->DrawText(tbVector2(0.5f, 0.5f), "TEST",
                                                TB_FF_ALIGN_HCENTER | TB_FF_ALIGN_VCENTER |
                                                TB_FF_RELATIVE | TB_FF_RELATIVESCALING);
    
    g_pMissile->m_pFont1->End();
    
    tbDirect3D::EndScene();

    tbDirect3D::GetDevice()->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, &m_pBackgroundS);
    tbDirect3D::GetDevice()->UpdateSurface(m_pBackgroundS, NULL, , NULL);


Was kommt jetzt nun in diese Zeile? (tbDirect3D::GetDevice()->UpdateSurface(m_pBackgroundS, NULL, ... , NULL);)

Oder habe ich da etwas falsch verstanden. Texturen sind ganz viele Oberfläche, dabei ist eine Oberfläche einer Textur immer eine Mip-Map Ebene?

Danke,

Chrissi

DarthB

Treue Seele

Beiträge: 265

Beruf: Schüler

  • Private Nachricht senden

7

06.10.2003, 15:52

Quellcode

1
2
3
4
5
6
7
LPDIRECT3DTEXTURE9 m_pBackgroundT;
IDirect3DSurface9* m_pTemp;
IDirect3DSurface9* m_pBackgroundS;

m_pBackgroundT->GetSurfaceLevel(0, &m_pBackgroundS);

UpdateSurface(m_pTemp, NULL, m_pBackgroundS, NULL);


So sollte es klappen. Steh doch alles in der Doku! Falls du mal Probleme mit dem Englisch dadrin hast entpfehle ich dir die Google Sprachtools sind echt nett! ;)

Ciao DarthB :huhu:

8

06.10.2003, 19:29

Hallo,

jetzt funktioniert fast alles.

Ich habe meine Textur so erstellt:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
// Hintergrundtextur erstellen (nicht füllen)
    tbDirect3D::GetDevice()->CreateTexture(
                                        tbDirect3D::GetScreenSize().x,
                                        tbDirect3D::GetScreenSize().y,
                                        0,
                                        0,
                                        D3DFMT_A8R8G8B8,
                                        D3DPOOL_DEFAULT,
                                        &m_pBackgroundT,
                                        NULL);

    


wenn ich aber das Pogramm starte, meckert meine Grafikkarte. Es werden nur 2erpotenzen unterstützt. Es aber nicht immer klar, das die Bildschirmgröße einer zweiterpotenz ist. Gibt da auch einen Trick, wie ich das Problem lösen kann?
???
Danke,

Chrissi

[edit]Ach ja, ich nutze eine Geforce 2MX[/edit]

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

9

06.10.2003, 20:13

Dann nimmst Du eben die nächst passende Zweierpotenz. Siehe tbVideo.cpp für eine einfache Methode, um das zu erreichen (es gibt sicher noch einen Trick, damit es effizienter geht).
Dann passt Du beim Rendern die Texturkoordinaten entsprechend an, dass eben nur der wirklich genutzte Teil der Textur sichtbar wird.

DarthB

Treue Seele

Beiträge: 265

Beruf: Schüler

  • Private Nachricht senden

10

07.10.2003, 09:45

Ich mach sogar immer mehre Texturen und setze die nebeneinander (höchstens 256x256) weil ein guter Kollege von mir ne Voodoo Karte hat und die keine größeren Texturen unterstützt! ;)

Ciao DarthB :huhu:

Werbeanzeige