Ich habe ein Problem bei der 3D Programmierung



  • Bei diesem Programm will ich ein einfaches Dreicek darstellen.
    Leider bleibt main bildschirm schwarz.

    #define WINDOW_CLASS_NAME "freestyle-games"
    #define WIN32_LEAN_AND_MEAN  
    
    #include <windows.h>  
    #include <d3d9.h>
    
    LPDIRECT3D9 lp3D = NULL;
    LPDIRECT3DDEVICE9 lp3DD = NULL;
    
    #define KEYDOWN(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0)
    #define KEYUP(vk_code)   ((GetAsyncKeyState(vk_code) & 0x8000) ? 0 : 1)
    
    HWND      main_window_handle = NULL; 
    HINSTANCE hinstance_app      = NULL; 
    
    void Init_3D();
    void Render();
    
    LPDIRECT3DVERTEXBUFFER9 VB_Triangle = NULL;
    
    // Definition des Vektorformats
    #define D3D_CUSTOMVERTEX (D3DFVF_XYZRHW|D3DFVF_DIFFUSE)
    
    struct CustomVertex{
        FLOAT x, y, z, rhw; // die transformierte Position des Knoten (Vertex)
        DWORD color;        // die Farbe an diesem Knoten
    };
    
    // die Vertices des Dreiecks
    CustomVertex TriangleVertices[] =
    {
        { 400.0f, 330.0f, 0.0f, 1.0f, 0xFFFF0000 },
        { 240.0f, 330.0f, 0.0f, 1.0f, 0xFF00FF00 },
        { 320.0f, 150.0f, 0.0f, 1.0f, 0xFF0000FF }
    };
    
    LRESULT CALLBACK WindowProc(HWND hwnd, 
    						    UINT msg, 
                                WPARAM wparam, 
                                LPARAM lparam)
    {
    
        PAINTSTRUCT		ps;		
        HDC				hdc;	
    
        switch(msg)
    	{       
    	    case WM_CREATE: 
            {
    		    return(0);
    		} 
            break;
    
    	    case WM_PAINT: 
    		{		   
       	        hdc = BeginPaint(hwnd,&ps);	           
                EndPaint(hwnd,&ps);          
    		    return(0);
       		}
            break;
    
    	    case WM_DESTROY: 
    		{		   
    		    PostQuitMessage(0);          
    		    return(0);
    		} 
            break;
    
    	    default:
            break;
    
        } 
        return (DefWindowProc(hwnd, msg, wparam, lparam));
    
    } 
    
    int WINAPI WinMain(	HINSTANCE hinstance,
    					HINSTANCE hprevinstance,
    					LPSTR lpcmdline,
    					int ncmdshow)
    {
    
        WNDCLASSEX winclass; 
        HWND	   hwnd;	 
        MSG		   msg;	
    
        winclass.cbSize         = sizeof(WNDCLASSEX);
        winclass.style			= CS_HREDRAW | CS_VREDRAW;
        winclass.lpfnWndProc	= WindowProc;
        winclass.cbClsExtra		= 0;
        winclass.cbWndExtra		= 0;
        winclass.hInstance		= hinstance;
        winclass.hIcon			= LoadIcon(NULL, IDI_APPLICATION);
        winclass.hCursor		= LoadCursor(NULL, IDC_ARROW); 
        winclass.hbrBackground	= (HBRUSH)GetStockObject(BLACK_BRUSH);
        winclass.lpszMenuName	= NULL;
        winclass.lpszClassName	= WINDOW_CLASS_NAME;
        winclass.hIconSm        = LoadIcon(NULL, IDI_APPLICATION);
    
        hinstance_app = hinstance;
    
        if (!RegisterClassEx(&winclass))
    	    return(0);
    
        if (!(hwnd = CreateWindowEx(NULL,                  
                                    WINDOW_CLASS_NAME,     
    						        "freestyle-games", 
    						        WS_OVERLAPPEDWINDOW | WS_VISIBLE,
    					 	        0,0,	  
    						        1680,1050,  
    						        NULL,	  
    						        NULL,	  
    						        hinstance,
    						        NULL)))	
        return(0);
    
        main_window_handle = hwnd;
    
        Init_3D();
        while(TRUE)
    	{
    
    		if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
    	    { 
    
               if (msg.message == WM_QUIT)
                   break;
    
    	       TranslateMessage(&msg);	       
    	       DispatchMessage(&msg);
    		   if(KEYDOWN(VK_ESCAPE))
    		   {
    			   SendMessage(hwnd,WM_CLOSE,0,0);
    		   }
    		   Render();
    
    	    } 
    
        } 
    
        return(msg.wParam);
    
    } 
    void Init_3D()
    {
        	lp3D = Direct3DCreate9(D3D_SDK_VERSION);
    
        D3DPRESENT_PARAMETERS D3DPParams;
        ZeroMemory(&D3DPParams,sizeof(D3DPParams));
    
        D3DPParams.SwapEffect        = D3DSWAPEFFECT_DISCARD; 
        D3DPParams.hDeviceWindow     = main_window_handle;  
        D3DPParams.BackBufferCount   = 1;  
    
        D3DPParams.Windowed          = FALSE;
        D3DPParams.BackBufferWidth   = 1680;
        D3DPParams.BackBufferHeight  = 1050;
        D3DPParams.BackBufferFormat  = D3DFMT_X8R8G8B8;
    
        lp3D->CreateDevice(D3DADAPTER_DEFAULT, 
                                      D3DDEVTYPE_HAL,
                                      main_window_handle,
                                      D3DCREATE_SOFTWARE_VERTEXPROCESSING,  
                                      &D3DPParams,
                                      &lp3DD);
    
    	//Szene initialisieren
        BYTE* VertexBufferStart;
    
        lp3DD->CreateVertexBuffer(
                                 sizeof(TriangleVertices),
                                 D3DUSAGE_WRITEONLY, 
                                 D3D_CUSTOMVERTEX, 
                                 D3DPOOL_MANAGED,
                                 &VB_Triangle,NULL);
    
        VB_Triangle->Lock(0,0,(void**)&VertexBufferStart,0);
    
        // Daten des Dreiecks in der Buffer kopieren
        memcpy(VertexBufferStart,TriangleVertices,
               sizeof(TriangleVertices));
    
        // Vertex Buffer wieder freigeben
        VB_Triangle->Unlock();
    
    	lp3DD->SetVertexShader(NULL);
    
    }
    
    void Render()
    {
    
    lp3DD->Clear(0,NULL,D3DCLEAR_TARGET,
                           D3DCOLOR_XRGB(0,0,255),1.0f,0);
    
        // Beginn der Szene
        lp3DD->BeginScene();
    
        // Den Datenstrom setzen
        lp3DD->SetStreamSource(0,VB_Triangle,
                                     sizeof(CustomVertex),NULL);
    
        // Das Dreieck ist das erste Element im Buffer und
        // es wird ein Objekt gezeichnet
        lp3DD->DrawPrimitive(D3DPT_TRIANGLELIST,0,1);
    
        // Die Szene ist beendet
        lp3DD->EndScene();
    
        // und kann angezeigt werden
        lp3DD->Present(NULL,NULL,NULL,NULL);
    }
    

    [edit="rapso"]cpp tags eingebaut[/edit]



  • ohne deinen code angeschaut zu haben: Versuche mal die Clear Color auf Rot oder auf etwas anderes wie schwarz zu setzen - funktiniert das?



  • Nutze die CPP-Tags, um deinen Code vernünftig formatiert darzustellen. 90% der Leser werden ihn sonst nicht lesen.



  • Vertexwahn schrieb:

    ohne deinen code angeschaut zu haben: Versuche mal die Clear Color auf Rot oder auf etwas anderes wie schwarz zu setzen - funktiniert das?

    lp3DD->Clear(0,NULL,D3DCLEAR_TARGET,
                           D3DCOLOR_XRGB(0,0,255),1.0f,0);
    

    Er cleart auf blau. Kann aber so auf Anhieb auch nichts feststellen.
    Vllt Grafikkarte nicht kompatibel?
    rya.



  • Hallo,

    ob in Zeile 214 das passiert, was es machen soll kann ich nicht genau sagen. Mal prüfen was sizeof(TriangleVertices) liefer, evtl durch 3*sizeof(CustomVertex) ersetzen.

    Des Weiteren fehlen noch einiger Renderstates. Keine Ahnung was die Standardeinstellungen sind, aber:
    Licht aus,
    Z-Buffer, Z-Test aus
    Textur(1) auf NULL
    ...

    Hoffe das hilft Dir weiter.


Anmelden zum Antworten