|
JLI Spieleprogrammierung
|
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
|
Verfasst am: 08.06.2007, 08:30 Titel: Backbuffer der Fenstergröße anpassen |
|
|
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 |
|
|
Dr. Best Senior JLI'ler
Alter: 34 Anmeldedatum: 17.06.2004 Beiträge: 269 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 08.06.2007, 10:29 Titel: |
|
|
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 |
|
|
Otscho Super JLI'ler
Alter: 36 Anmeldedatum: 31.08.2006 Beiträge: 338 Wohnort: Gummibären-Gasse Medaillen: Keine
|
Verfasst am: 08.06.2007, 11:22 Titel: |
|
|
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 |
|
Nach oben |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 08.06.2007, 15:21 Titel: |
|
|
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 |
|
|
Otscho Super JLI'ler
Alter: 36 Anmeldedatum: 31.08.2006 Beiträge: 338 Wohnort: Gummibären-Gasse Medaillen: Keine
|
Verfasst am: 08.06.2007, 16:37 Titel: |
|
|
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 |
|
Nach oben |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 08.06.2007, 17:10 Titel: |
|
|
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
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 |
|
|
Otscho Super JLI'ler
Alter: 36 Anmeldedatum: 31.08.2006 Beiträge: 338 Wohnort: Gummibären-Gasse Medaillen: Keine
|
Verfasst am: 08.06.2007, 18:07 Titel: |
|
|
Bei einem reset bleiben doch alle Sprites, Texturen usw erhalten, oder etwa nicht ?
PS Texturen müssen dazu im D3DPOOL_MANAGED sein |
|
Nach oben |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 08.06.2007, 20:13 Titel: |
|
|
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 |
|
|
Otscho Super JLI'ler
Alter: 36 Anmeldedatum: 31.08.2006 Beiträge: 338 Wohnort: Gummibären-Gasse Medaillen: Keine
|
Verfasst am: 13.06.2007, 14:22 Titel: |
|
|
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 |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 13.06.2007, 17:39 Titel: |
|
|
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 |
|
|
Otscho Super JLI'ler
Alter: 36 Anmeldedatum: 31.08.2006 Beiträge: 338 Wohnort: Gummibären-Gasse Medaillen: Keine
|
Verfasst am: 13.06.2007, 19:33 Titel: |
|
|
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 |
|
|
Jones Senior JLI'ler
Alter: 33 Anmeldedatum: 03.03.2005 Beiträge: 208 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 13.06.2007, 19:36 Titel: |
|
|
doppelpost? |
|
Nach oben |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 13.06.2007, 20:45 Titel: |
|
|
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 |
|
|
Otscho Super JLI'ler
Alter: 36 Anmeldedatum: 31.08.2006 Beiträge: 338 Wohnort: Gummibären-Gasse Medaillen: Keine
|
Verfasst am: 14.06.2007, 13:15 Titel: |
|
|
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 |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 14.06.2007, 18:41 Titel: |
|
|
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 _________________ "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 |
|
|
|
|
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
|