D3DDEVTYPE und ADAPTER
-
Hallo zusammen !
Wie kann ich nächträglich, also nachdem das IDirect3DDevice9 - Object bereits instanziert ist, den D3DDEVTYPE (Hal / Ref) und den Adapter ändern ???Mit Reset geht das ja nicht, da kann ich nur die D3DPRESENT_PARAMETER ändern...
Ich habs folgendermassen versucht:
bool K2D_Graphics::setup(void){
if(this->pDev){
this->pDev->SetTexture(0,0x00);
this->pDev->Release();
this->pDev = 0x00;
}D3DPRESENT_PARAMETERS d3dpp = {0};
d3dpp. //uswthis->pD3D->CreateDevice( // usw.
Ich rufe danach einfach setup auf, nachdem ich eine Einstellung geändert habe,
doch das Scheissteil stürzt dann jedesmal ohne Warnung ab, was soll denn das ???Bitte helft mir, ich bin mit den Nerven am Ende !!
Gruss Ishilur[ Dieser Beitrag wurde am 20.05.2003 um 22:35 Uhr von Ishildur editiert. ]
[ Dieser Beitrag wurde am 20.05.2003 um 22:37 Uhr von Ishildur editiert. ]
-
Es geht nicht.
Wozu brauchst Du das?
-
Hallo Thomas, was soll das heisse, es geht nicht ???
Bei allen 3D - Spielen die ich so auf dem Markt sehe, geht das doch auch ?!Kannst du mir sagen, wieso es nicht funktioniert, wenn ich das IDirect3DDevice9 - Objekt komplett Release und dann ein neues erstelle ???
Gruss Ishildur
-
Original erstellt von Ishildur:
nachdem das IDirect3DDevice9 - Object bereits instanziert ist, den D3DDEVTYPE (Hal / Ref) und den Adapter ändern ???Genau das geht eben nicht! Ein IDirect3DDevice9-Objekt ist fest an einen Adapter und an einen Gerätetyp (HAL oder REF) gebunden. Ich dachte jetzt, Du wolltest z.B. während eines Frames auf REF umschalten, um irgendwas zu rendern, was die Grafikkarte nicht unterstützt.
Aber Du meinst wohl was anderes. Wann genau machst Du das? Wenn der Benutzer zu einer anderen Anwendung wechselt? Achte darauf, dass Du es erst dann machst, wenn er wieder zurück zu Deiner Anwendung schaltet. Und was sagen die Fehlercodes? Und was sagt die Debug-Ausgabe von Direct3D (zuvor auf Debug schalten)?[ Dieser Beitrag wurde am 20.05.2003 um 23:03 Uhr von TomasRiker editiert. ]
-
@Tomas
Ja das dachte ich mir schon, doch ist eben anscheinend nicht mehr möglich, nachträglich ein neues IDirect3DDevice9 - Interface zu erstellen:Einfach den nachträglichen Code copy & pasten, compilieren und dann die linke Pfeiltaste drücken...
#include <windows.h> #include <d3d9.h> #define WIN32_LEAN_AND_MEAN IDirect3D9 *g_pD3D = 0x00; IDirect3DDevice9 *g_pDev = 0x00; IDirect3DVertexBuffer9 *g_pVB = 0x00; long __stdcall WndProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam){ static D3DPRESENT_PARAMETERS d3dpp = {0}; static D3DDEVTYPE dt = D3DDEVTYPE_HAL; switch(uMsg){ case WM_CREATE: d3dpp.Windowed = false; d3dpp.hDeviceWindow = hWnd; d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT; d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_ONE; d3dpp.BackBufferCount = 1; d3dpp.BackBufferWidth = 640; d3dpp.BackBufferHeight = 480; d3dpp.BackBufferFormat = D3DFMT_X8R8G8B8; d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; g_pD3D = Direct3DCreate9(D3D_SDK_VERSION); g_pD3D->CreateDevice(D3DADAPTER_DEFAULT,dt,hWnd,D3DCREATE_SOFTWARE_VERTEXPROCESSING,&d3dpp,&g_pDev); g_pDev->CreateVertexBuffer(12,D3DUSAGE_WRITEONLY,D3DFVF_XYZ,D3DPOOL_MANAGED,&g_pVB,0x00); return 0; case WM_KEYDOWN: switch(LOWORD(wParam)){ case VK_LEFT: g_pDev->Release(); g_pDev = 0x00; if(FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT,dt == D3DDEVTYPE_HAL ? D3DDEVTYPE_REF : D3DDEVTYPE_HAL,hWnd,D3DCREATE_SOFTWARE_VERTEXPROCESSING,&d3dpp,&g_pDev))){ MessageBox(hWnd,"Scheisse","Scheisse",MB_OK); DestroyWindow(hWnd); } return 0; case VK_ESCAPE: DestroyWindow(hWnd); return 0; } return 0; case WM_DESTROY: if(g_pVB) g_pVB->Release(); if(g_pDev) g_pDev->Release(); if(g_pD3D) g_pD3D->Release(); PostQuitMessage(0); return 0; default: return DefWindowProc(hWnd,uMsg,wParam,lParam); } } int __stdcall WinMain(HINSTANCE hInst,HINSTANCE hPrevInst,LPSTR lpCmdLine,int nShowCmd){ MSG msg; WNDCLASSEX wc = {0}; wc.cbSize = sizeof(WNDCLASSEX); wc.lpszClassName = "sample"; wc.hInstance = hInst; wc.lpfnWndProc = &WndProc; wc.style = CS_HREDRAW|CS_VREDRAW; wc.hbrBackground = static_cast<HBRUSH>(GetStockObject(BLACK_BRUSH)); RegisterClassEx(&wc); HWND hWnd = CreateWindowEx(0,"sample","Sample",WS_SYSMENU|WS_VISIBLE|WS_POPUP,CW_USEDEFAULT,CW_USEDEFAULT,640,480,0,0,hInst,0); ShowWindow(hWnd,SW_SHOW); UpdateWindow(hWnd); while(GetMessage(&msg,0,0,0)){ TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; }
Kann mir jeman sagen, was diese Scheisse soll ??
Gruss Ishildur[ Dieser Beitrag wurde am 25.05.2003 um 18:55 Uhr von Ishildur editiert. ]
-
Ich hatte auch mal ein solches Problem. Versuche mal, nicht nur Direct3D, sondern auch das Fenster neu zu initialisieren.
-
Ja aber wenn ich das Fenster zerstöre (um es anschliessend neu zu initialisiere) dann stoppt ja meine Nachrichtenschleife while(GetMessage(&msg,0,0,0) und das Programm ist beendet ??
-
Dann startest Du sie eben neu! Ist doch kein Problem.
-
Natürlich nicht, aber dann ist es eben sehr schnell passiert, dass dann irgendeine Objekt - Instanz noch das alte Window - Handle hat und dann gute Nacht !!! Das Projekt umfasst inzwischen mehere tausend Zeilen Code. Ich habe nicht damit gerechnet, dass das Fensterhandle dynamisch sein muss, also habe ich für alle Objekte einfach das Handle kopiert, wegen den Gültigkeitsbereichen und so ...