JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=45e762af2045551c6a892a8d9adb692dMedaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Backbuffer der Fenstergröße anpassen
Gehe zu Seite 1, 2, 3  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Fragen, Antworten und Kritik
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Otscho
Super JLI'ler


Alter: 36
Anmeldedatum: 31.08.2006
Beiträge: 338
Wohnort: Gummibären-Gasse
Medaillen: Keine

BeitragVerfasst am: 08.06.2007, 08:30    Titel: Backbuffer der Fenstergröße anpassen Antworten mit Zitat

Ich hab vor eine Tool im Fenstermodus zu proggen. Wenn der Benutzer die Größe des Fensters ändert bleibt ja normalerweiße der Backbuffer gleichgroß und der wird dann demänsprechend auf das Fenster scaliert. Da wird zwar das Fenster dann größer, aber man sieht dennoch nur ein verzerrtes Inneres.
Kann mir daher jemand sagen wie ich die aktuelle Größe meines Fenster bekomme und die Größe meines Backbuffers ändern kann ?

Danke schon mal im vorraus.
mfg Matthias
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Dr. Best
Senior JLI'ler


Alter: 34
Anmeldedatum: 17.06.2004
Beiträge: 269
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 08.06.2007, 10:29    Titel: Antworten mit Zitat

Backbuffergröße ändern geht afaik nur per Device neu erstellen. Mein Tipp: Backbuffer von Anfang an in Bildschirmgröße erstellen und GetClientRect(...) verwenden um dann die richtige Größe für den Viewport zu kriegen.
_________________

Ich bin da, wer noch?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen AIM-Name MSN Messenger
Otscho
Super JLI'ler


Alter: 36
Anmeldedatum: 31.08.2006
Beiträge: 338
Wohnort: Gummibären-Gasse
Medaillen: Keine

BeitragVerfasst am: 08.06.2007, 11:22    Titel: Antworten mit Zitat

Wenn ich ein Device neu erstelle muss ich dann auch die die ganzen Objekte die davon abhängig sind neu erstellen, wie Sprites, Texturen, usw. ?
Wenn ja wird das ziemlich aufwändig und die Performance misserabel, falls man da noch von Performance sprechen kann.
Bei den ganzen Direct3D Samples, die beim SDK dabei sind, haben die es auch hinbekommen, dass man das Fenster beliebig vergrößern bzw. verkleinern kann und alles an den Backbuffer angepasst wird Confused
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 08.06.2007, 15:21    Titel: Antworten mit Zitat

also. Am besten bearbeitest du die nachricht WM_SIZE, die kommt immer, wenn sich die Fenstergröße ändert. Performanceprobleme haste deshalb dann net, weil ja nur alles neu erstellt werden müsste, wenn sich die Fenstergröße ändert.
AFAIK kann man gegen die Verzerrungen aber auch schon ein bisschen was mit Matrizen regeln, ich meine ich hätte das mal so in der Art gemacht, das bei jedem WM_SIZE einfach einmal die Matrizen neu gesetzt werden mussten.
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Otscho
Super JLI'ler


Alter: 36
Anmeldedatum: 31.08.2006
Beiträge: 338
Wohnort: Gummibären-Gasse
Medaillen: Keine

BeitragVerfasst am: 08.06.2007, 16:37    Titel: Antworten mit Zitat

Ok ich check also mit WM_SIZE oder Vergleiche die Abmessung von GetClientRect() und Backbuffer ob sich die Fenstergröße verändert hat wenn ja kann ich mithilfe von Reset() den Backbuffer neu wählen.
OK muss ich mal ausprobieren Laughing
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 08.06.2007, 17:10    Titel: Antworten mit Zitat

Genau so wird es gemacht, das Device neu erstellen wäre ne üble Sache, ein Reset dagegen mitunter das einzig mögliche wenn es denn der 0/Hauptswapchain ist den du verändert haben möchtest.

Da du aber vom backbuffer sprichst gehe ich mal stark davon aus Smile

Andere SwapChains lasen sich dagegen einfach löschen und neu erstellen, das erfordert auch kein Reset und man braucht dementsprechend nicht allzusehr aufs Resourcenhandling achten.
_________________
"I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse."
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Otscho
Super JLI'ler


Alter: 36
Anmeldedatum: 31.08.2006
Beiträge: 338
Wohnort: Gummibären-Gasse
Medaillen: Keine

BeitragVerfasst am: 08.06.2007, 18:07    Titel: Antworten mit Zitat

Bei einem reset bleiben doch alle Sprites, Texturen usw erhalten, oder etwa nicht ?
PS Texturen müssen dazu im D3DPOOL_MANAGED sein
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 08.06.2007, 20:13    Titel: Antworten mit Zitat

Kommt drauf an in welchem Pool die Resourcen liegen. Sprites und andere D3DX Objekte überleben Reset AFAIK nicht, dazu haben die Objekte aber auch entsprechende Methoden, OnDeviceLost und OnDeviceReset:

CPP:
Sprite->OnDeviceLost();
Device->Reset();
Sprite->OnDeviceReset();


Ob die Schreibweise richtig ist weiss ich nicht.
_________________
"I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse."
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Otscho
Super JLI'ler


Alter: 36
Anmeldedatum: 31.08.2006
Beiträge: 338
Wohnort: Gummibären-Gasse
Medaillen: Keine

BeitragVerfasst am: 13.06.2007, 14:22    Titel: Antworten mit Zitat

Also ich hab das mit dem D3DDevice->Reset() mal ausprobiert, nur bekomme ich da immer ein D3DERR_INVALIDCALL wenn ich die Funktion aufrufe. Als Parameter nehm ich die gleich D3DPRESENT_PARAMETERS-Struktur wie beim erstellen des Devices nur, dass BackBufferWidth und BackBufferHeight der aktuellen Fenstergröße angepasst wurden. Kann es sein, dass man manchmal gar nicht ein Device reseten darf wenn man es möchte?
Oder macht ein D3DXCreateDevice9 eine D3DPRESENT_PARAMETERS ungültig?

PS Logbook
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 13.06.2007, 17:39    Titel: Antworten mit Zitat

Die PresentParams sollte eigentlich eher weniger dafür verantwortlich sein das es bei dir nicht mit dem Reset funktioniert. Hast du vorher wirklich alle non managed resourcen freigegeben? zB auch das was du mit D3DXCreateFontIndirect erstellt hast?

Wenn du wirklich nichts findest würde ich dir raten unter Systemsteuerung->DirectX die Debug Runtime zu aktivieren, in der Ausgabe in VS steht dann meist passend zum Fehler noch eine Begründung.
_________________
"I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse."
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Otscho
Super JLI'ler


Alter: 36
Anmeldedatum: 31.08.2006
Beiträge: 338
Wohnort: Gummibären-Gasse
Medaillen: Keine

BeitragVerfasst am: 13.06.2007, 19:33    Titel: Antworten mit Zitat

Hab ich gemacht. Dabei kam fogendes raus:

Zitat:
Direct3D9: (ERROR) :All user created D3DPOOL_DEFAULT surfaces must be freed before Reset can succeed. Reset Fails.
Direct3D9: (ERROR) :Reset failed and Reset/TestCooperativeLevel/Release are the only legal APIs to be called subsequently
Direct3D9: (ERROR) :Device is in an invalid state. Only Reset, TestCooperativeLevel or Release could be called


Leide sagt das mir wenig.
Kennst du dich da aus ?

Edit: ich hab noch gar keine resoucen geladen
folglich sollte es da eigentlich keine Probleme seitens D3DPOOL_DEFAULT geben.


Zuletzt bearbeitet von Otscho am 13.06.2007, 19:52, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Jones
Senior JLI'ler


Alter: 33
Anmeldedatum: 03.03.2005
Beiträge: 208
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 13.06.2007, 19:36    Titel: Antworten mit Zitat

doppelpost?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 13.06.2007, 20:45    Titel: Antworten mit Zitat

Hab den Doppelpost gelöscht.

Also du musst irgendwo mindestens eine Resource erstellt haben, hast du mit D3DX gearbeitet wenn ja, diese teile sind nicht managed wenn man dies nicht explizit angeben konnte.

Du musst diese also löschen/freigeben vor dem Reset.

Ansonsten kannst du ja mal Code posten wenn das zulässig ist.
_________________
"I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse."
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Otscho
Super JLI'ler


Alter: 36
Anmeldedatum: 31.08.2006
Beiträge: 338
Wohnort: Gummibären-Gasse
Medaillen: Keine

BeitragVerfasst am: 14.06.2007, 13:15    Titel: Antworten mit Zitat

Also ich hab bisher nur ein Direct3DCreate9, CreateDevice und CreateFont erzeugt. Hier mal die Direct3D Klasse

CPP:
#include "Direct3D.h"

CDirect3D::CDirect3D() {
   wHeight = 240;
   wWidth = 400;
   lpD3D = NULL;
   m_lpD3DDevice = NULL;
}

CDirect3D::~CDirect3D() {
   
}

void CDirect3D::DeInitComponents() {
   if(m_lpD3DDevice != NULL){
      m_lpD3DDevice->Release();
      m_lpD3DDevice = NULL;
      Logbook::GetSingletonPtr()->Succed(L"IDIRECT3DDEVICE9::Release()");
   } else {
      Logbook::GetSingletonPtr()->Warning(L"IDIRECT3DDEVICE9::Release()", L"IDIRECT3DDEVICE9 is already released", 10008 );
   }
   if(lpD3D != NULL) {
      lpD3D->Release();
      lpD3D = NULL;
      Logbook::GetSingletonPtr()->Succed(L"IDIRECT3D9::Release()");
   }  else {
      Logbook::GetSingletonPtr()->Warning(L"IDIRECT3D9::Release()", L"IDIRECT3D9 is already released", 10009 );
   }
   Logbook::GetSingletonPtr()->Succed(L"Direct3D destructed");
}

void CDirect3D::CreateDirect3DDevice(void) {
   // Creating a Direct3D-Object
   if(NULL == (lpD3D = Direct3DCreate9(D3D_SDK_VERSION))) {
      Logbook::GetSingletonPtr()->Error(L"CreateDirect3D", L"No Reason known", 10002 );
   } else {
      Logbook::GetSingletonPtr()->Succed(L"CreateDirect3D");
   }

   // Settings for the Device
   ZeroMemory(&PParam, sizeof(PParam));
   PParam.SwapEffect = D3DSWAPEFFECT_DISCARD;
   PParam.hDeviceWindow = m_hWnd;
   PParam.Windowed =TRUE;
   PParam.BackBufferWidth = wWidth;
   PParam.BackBufferHeight = wHeight;
   PParam.BackBufferFormat = D3DFMT_X8R8G8B8;
   PParam.AutoDepthStencilFormat = D3DFMT_D16;
    PParam.EnableAutoDepthStencil = TRUE;

   // Creating a Device
   HRESULT hr = lpD3D->CreateDevice(D3DADAPTER_DEFAULT,
                     D3DDEVTYPE_HAL,
                     m_hWnd,
                     D3DCREATE_HARDWARE_VERTEXPROCESSING,
                     &PParam,
                     &m_lpD3DDevice);
   switch(hr) {
      case D3D_OK:
         Logbook::GetSingletonPtr()->Succed(L"CreateDevice (Hardwareprocessing)");
         break;
      case D3DERR_NOTAVAILABLE:
         Logbook::GetSingletonPtr()->Error(L"CreateDevice", L"HARDWARE_VERTEXPROCESSING not available", 10005 );
         if(D3D_OK == lpD3D->CreateDevice(D3DADAPTER_DEFAULT,
                     D3DDEVTYPE_HAL,
                     m_hWnd,
                     D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                     &PParam,
                     &m_lpD3DDevice)) {
            Logbook::GetSingletonPtr()->Succed(L"CreateDevice (Softwareprocessing)");
         }else Logbook::GetSingletonPtr()->Error(L"CreateDevice", L"No available Settings found", 10006 );
         break;
      default:
         Logbook::GetSingletonPtr()->Error(L"CreateDevice", hr, 10007 );
         return;
         break;
   }
   m_lpD3DDevice->GetBackBuffer(0, 0,
                                 D3DBACKBUFFER_TYPE_MONO,
                                 &m_lpBackBuffer);

    m_lpD3DDevice->SetRenderState(D3DRS_ZENABLE, TRUE);
}

void CDirect3D::BeginScene(){
   
   CheckForWindowSizeChange();
      
   if(D3DERR_DEVICELOST == m_lpD3DDevice->TestCooperativeLevel()){
      m_lpD3DDevice->Reset(&PParam);
      Logbook::GetSingletonPtr()->Succed(L"ResetDevice");
   }

   m_lpD3DDevice->Clear(0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0x00, 0x00, 0xef), 1.0f, 0);
   m_lpD3DDevice->BeginScene();

   RECT r = {0, 0, 0, 0};
   r.right = PParam.BackBufferWidth;
   r.bottom = PParam.BackBufferHeight;
   ppTestFont->DrawText(NULL, L"Test", -1, &r, DT_CENTER, 0xffff0000);
}

void CDirect3D::EndScene(){
   m_lpD3DDevice->EndScene();

    m_lpD3DDevice->Present(0, 0, 0, 0);
   
   
}


//---------------------------------------------------------------------------------------------------------
//  Checks the current size of the client-window and resets the device if it is neccesary
//---------------------------------------------------------------------------------------------------------

void CDirect3D::CheckForWindowSizeChange(){
   RECT rcCurrentClient;
   GetClientRect( m_hWnd, &rcCurrentClient );

   if(((UINT)rcCurrentClient.right != PParam.BackBufferWidth) ||
      ((UINT)rcCurrentClient.bottom != PParam.BackBufferHeight)) {

         PParam.BackBufferWidth = (UINT)rcCurrentClient.right;
         PParam.BackBufferHeight = (UINT)rcCurrentClient.bottom;
         
         HRESULT hr = m_lpD3DDevice->Reset(&PParam);

         if(D3D_OK == hr) Logbook::GetSingletonPtr()->Succed(L"Device->Reset() (Resized)");
         else Logbook::GetSingletonPtr()->Error(L"Device->Reset()", hr, 10011);
   }
}


//---------------------------------------------------------------------------------------------------------
//          This function creates a Font, which is used to test other finctions
//---------------------------------------------------------------------------------------------------------

void CDirect3D::CreateFont(){
   D3DXFONT_DESC FontDesc = { 0 };
   wcscpy_s(FontDesc.FaceName, L"Arial");

   HRESULT hr = D3DXCreateFontIndirect(m_lpD3DDevice, &FontDesc, &ppTestFont);

   if(D3D_OK == hr) Logbook::GetSingletonPtr()->Succed(L"D3DXCreateFontIndirect");
   else Logbook::GetSingletonPtr()->Error(L"D3DXCreateFontIndirect", hr, 10010);
   
}
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 14.06.2007, 18:41    Titel: Antworten mit Zitat

Und wo genau entfernst du zb den Font bevor du Resset aufrufst, bzw wo genau wird dem Font gesagt das er gleich sterben soll?

Denn genau daher wird dein Fehler kommen Smile
_________________
"I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse."
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Fragen, Antworten und Kritik Alle Zeiten sind GMT
Gehe zu Seite 1, 2, 3  Weiter
Seite 1 von 3

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum