2011-01-02 1 views
1

Ist es möglich, Gerät/DirectX-Anwendung zu erstellen, wenn PC vgasave Modus verwendet?
Dies ist meine init-Funktion:D3D-Gerät in VGASAVE

d3d = Direct3DCreate9(D3D_SDK_VERSION); // create the Direct3D interface 

    D3DPRESENT_PARAMETERS d3dpp; // create a struct to hold various device information 

    ZeroMemory(&d3dpp, sizeof(d3dpp)); // clear out the struct for use 
    d3dpp.Windowed = TRUE; // program windowed, not fullscreen 
    d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; // discard old frames 
    d3dpp.hDeviceWindow = hWnd; // set the window to be used by Direct3D 


    // create a device class using this information and the info from the d3dpp stuct 
    d3d->CreateDevice(D3DADAPTER_DEFAULT, 
         D3DDEVTYPE_HAL, 
         hWnd, 
         D3DCREATE_SOFTWARE_VERTEXPROCESSING, 
         &d3dpp, 
         &d3ddev); 

jedoch, wenn ich später anrufen Abstürze

d3ddev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 40, 100), 1.0f, 0); 

Programm, um nicht behandelte Verletzung berichten. Oder vielleicht geht es nicht um VGA, nur mache ich etwas falsch?


Create kehrt D3DERR_NOTAVAILABLE

+0

Seltsame Frage. Eine Fehlerrückgabe bedeutet * nicht * "den Zeiger trotzdem verwenden". –

Antwort

2

Sie haben viel zu wenige Parameter in den D3DPRESENT_PARAMETERS ausgefüllt. Sie haben sicherlich schlechte Einstellungen für den Backbuffer und so. Wenn CreateDevice D3DERR_NOTAVAILABLE zurückgibt, ist der Zeiger d3ddev NULL, was zu der Zugriffsverletzung führt, wenn Sie versuchen, den zurück Puffer zu löschen, da kein Gerät vorhanden ist.

D3DDeviceParameters.Windowed = true; 
D3DDeviceParameters.BackBufferHeight = 0; 
D3DDeviceParameters.BackBufferWidth = 0; 
D3DDeviceParameters.BackBufferCount = 1; 
D3DDeviceParameters.BackBufferFormat = D3DFMT_X8R8G8B8; 
D3DDeviceParameters.MultiSampleQuality = 0; 
D3DDeviceParameters.MultiSampleType = D3DMULTISAMPLE_NONE; 
D3DDeviceParameters.SwapEffect = D3DSWAPEFFECT_DISCARD; 
D3DDeviceParameters.hDeviceWindow = OS->GetHWND(); 
D3DDeviceParameters.EnableAutoDepthStencil = true; 
D3DDeviceParameters.AutoDepthStencilFormat = D3DFMT_D24S8; 
D3DDeviceParameters.Flags = 0; 
D3DDeviceParameters.FullScreen_RefreshRateInHz = 0; 
D3DDeviceParameters.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE; // Vsync. 

Das ist mein D3DPRESENT_PARAMETERS.

+0

Mit ähnlich wie oben, es gibt immer noch nicht verfügbar. – Neomex

+1

@Nomex: Dann müssen Sie herausfinden, welche Geräte verfügbar sind. D3D9 kann sehr fummelig sein - Geräte müssen beispielsweise nicht alle Backbuffer-Formate unterstützen. Sie müssen die anderen Methoden in der IDirect3D9-Schnittstelle verwenden, um zu ermitteln, welche Geräte verfügbar sind. – Puppy

+0

Funktioniert auf D3DDEVTYPE_REF, danke! – Neomex