DirectX bereich in C++/CLI panel



  • HI! Versuche gerade in einem Panel einen DirectX Fenster zu erstellen. Dafür habe ich die funktionen init, render, clean. Anscheinend wird die init Funktion fehlerfrei durchlaufen, jedoch in der render und clean funktion gibt er mir eine Null Reference Exception zurück. Hier mal der Code:
    Form1.h

    private: System::Void Form1_Load(System::Object^  sender, System::EventArgs^  e) {
    				 d3ddev = new d3ddevice();
    				 d3ddev->init_D3D(reinterpret_cast<HWND>(panel1->Handle.ToPointer()));
    
    			 }
    private: System::Void Form1_FormClosing(System::Object^  sender, System::Windows::Forms::FormClosingEventArgs^  e) {
    				 d3ddev->clean_D3D();
    			 }
    	private: System::Void panel1_Paint(System::Object^  sender, System::Windows::Forms::PaintEventArgs^  e) {
    				 d3ddev->render_frame();
    				  panel1->Refresh();
    
    			 }
    

    und die d3ddevice class

    void d3ddevice::init_D3D(HWND hWnd)
    {
    	int screen_width = GetSystemMetrics(SM_CXSCREEN);
    	int screen_height = GetSystemMetrics(SM_CYSCREEN);
        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 = false;    // program windowed, not fullscreen
        d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;    // discard old frames
        d3dpp.hDeviceWindow = hWnd;    // set the window to be used by Direct3D
    	d3dpp.BackBufferFormat = D3DFMT_X8R8G8B8;    // set the back buffer format to 32-bit
        d3dpp.BackBufferWidth = screen_width;    // set the width of the buffer
        d3dpp.BackBufferHeight = screen_height;    // set the height of the buffer
        // create a device class using this information and the info from the d3dpp struct
        d3d->CreateDevice(D3DADAPTER_DEFAULT,
                          D3DDEVTYPE_HAL,
                          hWnd,
                          D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                          &d3dpp,
                          &d3ddev);
    }
    void d3ddevice::render_frame(void)
    {
        // clear the window to a deep blue
        d3ddev->Clear(0, 0, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 40, 100), 1.0f, 0);
    	// Begin the scene
        if( SUCCEEDED( d3ddev->BeginScene()  ) )
    	   // begins the 3D scene
    
        //todo : fill in rendering stuff 
    
        d3ddev->EndScene();    // ends the 3D scene
    
        d3ddev->Present(NULL, NULL, NULL, NULL);   // displays the created frame on the screen
    }
    
    // clean up Direct3D and COM
    void d3ddevice::clean_D3D(void)
    {
        d3ddev->Release();    // close and release the 3D device
        d3d->Release();    // close and release Direct3D
    }
    

    Jemand eine Ahnung woran das liegt? Oder einen tipp was ich anders machen sollte????
    Gruss
    Littles



  • Ich vermute mal dein d3ddev wird null sein, wahrscheinlich weil CreateDevice() fehlschlägt...


Anmelden zum Antworten