[directX]Init-Problem -> Zugriffsfehler

MSAB

Mitglied
Moin,
nachdem ich seit längerem mit wxwidgets gearbeitet hatte wollte ich mich mal etwas näher mit DirectX9 beschäftigen und hab mich mal ein bischen an einem Tutorial ausgetobt.

Dummerweise hapert es nun schon bei der Initalisierung, denn bei der Funktion D3DXMatrixPerspectiveFovLH(...) schmeißt mir mein DEV-Cpp nur einen Zugriffsfehler ("Segmentation Fault") an den Kopf. Genaugenommen kommt er dort sogar 2mal mit der Meldung...

Also ich hab erlich gesagt keine Idee mehr woran das liegen könnte...aber ihr kennt euch mit DirectX ja sicherlich etwas besser aus als ich =P

Meine init-Funktion sieht momentan so aus:
Code:
    d3d::d3d = Direct3DCreate9(D3D_SDK_VERSION);  

    D3DPRESENT_PARAMETERS d3dpp;  

    ZeroMemory(&d3dpp, sizeof(d3dpp));  
    d3dpp.Windowed = false;  
    d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;    
    d3dpp.hDeviceWindow = hWnd;    
    d3dpp.BackBufferFormat = D3DFMT_X8R8G8B8;  
    d3dpp.BackBufferWidth = graphics->w;    
    d3dpp.BackBufferHeight = graphics->h;    
    d3dpp.EnableAutoDepthStencil = true;
    d3dpp.AutoDepthStencilFormat = D3DFMT_D16;

    d3d::d3d->CreateDevice(D3DADAPTER_DEFAULT,
                      D3DDEVTYPE_HAL,
                      hWnd,
                      D3DCREATE_HARDWARE_VERTEXPROCESSING,
                      &d3dpp,
                      &d3d::dev);
                     
     D3DXMATRIX xmat;
     d3d::dev->SetRenderState(D3DRS_AMBIENT,D3DCOLOR_XRGB(255,255,255));
     D3DXMatrixPerspectiveFovLH(&xmat, 0.8f, graphics->w/graphics->h, 0.5f, 1000.0f);
     d3d::dev->SetTransform(D3DTS_PROJECTION, &xmat);


Hat jemand nen Lösungsvorschlag?

MfG
MSAB
 
Wirklich niemand ne Idee? Ich kann das Ding schreiben wie ich will, immer erhalte ich einen Zugriffsfehler... =(
 
C++:
if ((d3d::d3d = ::Direct3DCreate9(D3D_SDK_VERSION)) == NULL)
{
    ::MessageBoxW(hWnd, L"Direct3D konnte nicht initialisiert werden!", NULL, MB_OK | MB_ICONERROR);
    return false;
}
... und das selbe für den Device. Welche MessageBox kommt? ;)
 
Na gar keine^^ Weder beim d3d noch beim Device...

Hätte mich aber auch gewundert wenn's daran liegen würde, denn die Funktion D3DXMatrixPerspectiveFovLH(...) hat ja weder d3d noch den Device als Parameter...
 
Hmm sorry hab das überlesen. Ehm dann aber ka ... musst dir an anderer Stelle mitn Zeiger was vermurkst haben. Dann graphics nutzt de ja kurz vorher noch, und da klappt es.
 
Hmm sorry hab das überlesen. Ehm dann aber ka ... musst dir an anderer Stelle mitn Zeiger was vermurkst haben. Dann graphics nutzt de ja kurz vorher noch, und da klappt es.
Hmm....komisch...

Also ich hab jetzt einfach mal ein Minimal-Beispiel geschrieben, wo bei mir eben dieser Fehler auftritt. Wäre wirklich nett wenn sich das jemand mal etwas genauer ansehen könnte...
Code:
#include <windowsx.h>
#include <d3d9.h>
#include <d3dx9.h>

#define KEY_DOWN(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0)
#define KEY_UP(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 0 : 1)

namespace d3d{
    LPDIRECT3D9              d3d;
    LPDIRECT3DDEVICE9        dev;
  
    void RenderFrame();
    void Clean();                          
};

int graphicsw = 1280;
int graphicsh = 1024;
HWND                     hWnd;
                 
LRESULT CALLBACK WindowProc(HWND hWnd,
                            UINT message,
                            WPARAM wParam,
                            LPARAM lParam);                       

///////////////////////////////
//WinMain
///////////////////////////////
int WINAPI WinMain(HINSTANCE hInstance,
                   HINSTANCE hPrevInstance,
                   LPSTR lpCmdLine,
                   int nCmdShow)
{        
    WNDCLASSEX wc;
    ZeroMemory(&wc, sizeof(WNDCLASSEX));
    wc.cbSize = sizeof(WNDCLASSEX);
    wc.style = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc = (WNDPROC)WindowProc;
    wc.hInstance = hInstance;
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.lpszClassName = "WindowClass1";
    RegisterClassEx(&wc);

    hWnd = CreateWindowEx(0,
                          "WindowClass1",
                          "Monopoly",    
                          WS_EX_TOPMOST | WS_POPUP,    
                          0,0,    
                          graphicsw,graphicsh,  
                          NULL,    
                          NULL,  
                          hInstance,  
                          NULL);
    ShowWindow(hWnd, nCmdShow);    
    
    d3d::d3d = Direct3DCreate9(D3D_SDK_VERSION);
  
    D3DPRESENT_PARAMETERS d3dpp;   

    ZeroMemory(&d3dpp, sizeof(d3dpp));   
    d3dpp.Windowed = false;  
    d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;    
    d3dpp.hDeviceWindow = hWnd;    
    d3dpp.BackBufferFormat = D3DFMT_X8R8G8B8;  
    d3dpp.BackBufferWidth = graphicsw;    
    d3dpp.BackBufferHeight = graphicsh;    
    d3dpp.EnableAutoDepthStencil = true;
    d3dpp.AutoDepthStencilFormat = D3DFMT_D16;

    d3d::d3d->CreateDevice(D3DADAPTER_DEFAULT,
                      D3DDEVTYPE_HAL,
                      hWnd,
                      D3DCREATE_HARDWARE_VERTEXPROCESSING,
                      &d3dpp,
                      &d3d::dev);                 
                   
     D3DXMATRIX xmat;
     d3d::dev->SetRenderState(D3DRS_AMBIENT,D3DCOLOR_XRGB(255,255,255));
     D3DXMatrixPerspectiveFovLH(&xmat, 0.8f, graphicsw/graphicsh, 0.5f, 1000.0f);  //<-zack, und dir hier der Zugriffsfehler
     d3d::dev->SetTransform(D3DTS_PROJECTION, &xmat);

     MSG msg;
     while(TRUE)
     {
          DWORD starting_time = GetTickCount();

          if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
          {
              if (msg.message == WM_QUIT)
                  break;

              TranslateMessage(&msg);
              DispatchMessage(&msg);
          }

          d3d::RenderFrame();
          
          if(KEY_DOWN(VK_ESCAPE))
             PostMessage(hWnd, WM_DESTROY, 0, 0);

          while ((GetTickCount() - starting_time) < 25);
     } 

     d3d::Clean();
     return msg.wParam;
}

void d3d::RenderFrame()
{
    d3d::dev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 40, 100), 1.0f, 0);
    d3d::dev->BeginScene(); 
    //...//  
    d3d::dev->EndScene();   
    d3d::dev->Present(NULL, NULL, NULL, NULL);  
    return;
}

LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch(message)
    { case WM_DESTROY:
      {
         PostQuitMessage(0);
         return 0;
       } break;
    }
    return DefWindowProc (hWnd, message, wParam, lParam);
}
         
void d3d::Clean()
{
    d3d::dev->Release();    
    d3d::d3d->Release();    
}
 
Zurück