Guybrush Threepwood Geschrieben 13. Juli 2005 Geschrieben 13. Juli 2005 Ich hab folgenden Code der später einen Würfel darstellen soll um den sich gedreht wird. Im Moment werden nur 2 Seiten gezeigt. #include <windows.h> #include <d3dx9.h> #define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_DIFFUSE) #pragma comment(lib,"d3d9.lib") #pragma comment(lib,"d3dx9.lib") #pragma comment(lib,"winmm.lib") LRESULT CALLBACK MainProc(HWND, UINT, WPARAM, LPARAM); HRESULT InitD3D(); HRESULT Render(); HRESULT Cleanup(); HRESULT SetupMatrices(); HRESULT InitVB(); struct GLOBALS { HWND hMainWindow; HINSTANCE hInst; IDirect3D9* pD3D; IDirect3DDevice9* pD3DDevice; IDirect3DVertexBuffer9* pD3DVB; }g_={0,0,0,0,0}; struct CUSTOMVERTEX { FLOAT x, y, z; // The transformed position for the vertex. DWORD color; // The vertex color. }; APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR lpCmdLine, int nCmdShow) { MSG Msg; WNDCLASS wc; g_.hInst = hInstance; memset(&wc,0,sizeof(wc)); wc.hCursor = LoadCursor(0,IDC_ARROW); wc.hInstance = hInstance; wc.lpfnWndProc = MainProc; wc.lpszClassName = "D3D Test 1"; wc.style = CS_CLASSDC; if (!RegisterClass(&wc)) return FALSE; g_.hMainWindow = CreateWindow("D3D Test 1","Bla", WS_OVERLAPPEDWINDOW, 100,100, 300,300, GetDesktopWindow(),0, hInstance,0); if (!InitD3D()) return FALSE; if (!InitVB()) { Cleanup(); return FALSE; } ShowWindow(g_.hMainWindow,nCmdShow); UpdateWindow(g_.hMainWindow); while(Msg.message != WM_QUIT) { if(PeekMessage(&Msg,0,0,0,PM_REMOVE)) { TranslateMessage(&Msg); DispatchMessage(&Msg); } else Render(); } return Msg.wParam; } LRESULT CALLBACK MainProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) { switch(Msg) { case WM_PAINT: { Render(); ValidateRect(hWnd,NULL); return 0; } case WM_DESTROY: { Cleanup(); PostQuitMessage(0); return 0; } default: return DefWindowProc(hWnd,Msg,wParam,lParam); } } HRESULT InitD3D() { if (NULL == (g_.pD3D = Direct3DCreate9(D3D_SDK_VERSION))) return 0; D3DPRESENT_PARAMETERS d3dpp; memset(&d3dpp,0,sizeof(d3dpp)); d3dpp.Windowed = TRUE; d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; d3dpp.BackBufferFormat = D3DFMT_UNKNOWN; if (D3D_OK != g_.pD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,g_.hMainWindow, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &g_.pD3DDevice)) return 0; g_.pD3DDevice->SetRenderState(D3DRS_CULLMODE,D3DCULL_NONE); g_.pD3DDevice->SetRenderState(D3DRS_LIGHTING,FALSE); return 1; } HRESULT Render() { if (NULL == g_.pD3DDevice) return 0; g_.pD3DDevice->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,0,255),1.0,0); if (SUCCEEDED(g_.pD3DDevice->BeginScene())) { SetupMatrices(); g_.pD3DDevice->SetStreamSource(0,g_.pD3DVB,0,sizeof(CUSTOMVERTEX)); g_.pD3DDevice->SetFVF( D3DFVF_CUSTOMVERTEX ); g_.pD3DDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, 4 ); } g_.pD3DDevice->EndScene(); g_.pD3DDevice->Present(NULL,NULL,NULL,NULL); return 1; } HRESULT Cleanup() { if (g_.pD3D != NULL) g_.pD3D->Release(); if (g_.pD3DDevice != NULL) g_.pD3DDevice->Release(); if (g_.pD3D != NULL) g_.pD3D->Release(); return 0; } HRESULT InitVB() { DWORD dwOben =0xffffaaaa, dwUnten =0xaa33aa33, dwLinks =0xff00ff00, dwRechts =0xff00ffff, dwVorne =0x12345678, dwHinten =0x00000000; CUSTOMVERTEX vertices[] = { //hinten { -1.0f,-1.0f, 1.0f, dwHinten }, { 1.0f,-1.0f, 1.0f, dwHinten }, { 1.0f, 1.0f, 1.0f, dwHinten }, { -1.0f,-1.0f, 1.0f, dwHinten }, { -1.0f, 1.0f, 1.0f, dwHinten }, { 1.0f, 1.0f, 1.0f, dwHinten }, //vorne { -1.0f,-1.0f, -1.0f, dwVorne, }, { 1.0f,-1.0f, -1.0f, dwVorne, }, { 1.0f, 1.0f, -1.0f, dwVorne, }, { -1.0f,-1.0f, -1.0f, dwVorne, }, { -1.0f, 1.0f, -1.0f, dwVorne, }, { 1.0f, 1.0f, -1.0f, dwVorne, }, /* //links { -1.0f,-1.0f, -1.0f, dwLinks, }, { -1.0f,-1.0f, 1.0f, dwLinks, }, { -1.0f, 1.0f, -1.0f, dwLinks, }, { -1.0f,-1.0f, 1.0f, dwLinks, }, { -1.0f, 1.0f, 1.0f, dwLinks, }, { -1.0f, 1.0f, -1.0f, dwLinks, }, //rechts { 1.0f,-1.0f, -1.0f, dwRechts, }, { 1.0f,-1.0f, 1.0f, dwRechts, }, { 1.0f, 1.0f, -1.0f, dwRechts, }, { 1.0f,-1.0f, 1.0f, dwRechts, }, { 1.0f, 1.0f, 1.0f, dwRechts, }, { 1.0f, 1.0f, -1.0f, dwRechts, }, //oben { -1.0f, 1.0f, -1.0f, dwOben, }, { -1.0f, 1.0f, 1.0f, dwOben, }, { 1.0f, 1.0f, -1.0f, dwOben, }, { -1.0f, 1.0f, 1.0f, dwOben, }, { 1.0f, 1.0f, 1.0f, dwOben, }, { 1.0f, 1.0f, -1.0f, dwOben, }, //unten { -1.0f, -1.0f, -1.0f, dwUnten, }, { -1.0f, -1.0f, 1.0f, dwUnten, }, { 1.0f, -1.0f, -1.0f, dwUnten, }, { -1.0f, -1.0f, 1.0f, dwUnten, }, { 1.0f, -1.0f, 1.0f, dwUnten, }, { 1.0f, -1.0f, -1.0f, dwUnten, }, */ }; if( FAILED( g_.pD3DDevice->CreateVertexBuffer( 12 *sizeof(CUSTOMVERTEX), 0, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &g_.pD3DVB, NULL ) ) ) return 0; // Fill the vertex buffer. VOID* pVertices; if( FAILED( g_.pD3DVB->Lock( 0, sizeof(vertices), (void**)&pVertices, 0 ) ) ) return 0; memcpy( pVertices, vertices, sizeof(vertices) ); g_.pD3DVB->Unlock(); return 1; } HRESULT SetupMatrices() { D3DXMATRIXA16 matWorld; UINT iTime = timeGetTime() % 1000; FLOAT fAngle = iTime * (2.0f * D3DX_PI) / 1000.0f; D3DXMatrixRotationY( &matWorld, fAngle ); g_.pD3DDevice->SetTransform( D3DTS_WORLD, &matWorld ); D3DXVECTOR3 vEyePt( 0.0f, 3.0f,-5.0f ); D3DXVECTOR3 vLookatPt( 0.0f, 0.0f, 0.0f ); D3DXVECTOR3 vUpVec( 0.0f, 1.0f, 0.0f ); D3DXMATRIXA16 matView; D3DXMatrixLookAtLH( &matView, &vEyePt, &vLookatPt, &vUpVec ); g_.pD3DDevice->SetTransform( D3DTS_VIEW, &matView ); D3DXMATRIXA16 matProj; D3DXMatrixPerspectiveFovLH( &matProj, D3DX_PI/4, 1.0f, 1.0f, 100.0f ); g_.pD3DDevice->SetTransform( D3DTS_PROJECTION, &matProj ); return 1; } [/PHP] Das Problem ist das die vordere Seite die Hintere bei der Drehung überlappt. Wenn ich die beiden Seiten in der Customvertex Struktur vertausche dann überlappt die Hintere Seite. DirectX scheint da irgendeine Priorität zu vergeben. Ich hab mal 2 Bilder angehängt um das Problem zu verdeutlichen. Beim Bild 2 sollte die schwarze Seite vorne sein. Wie bekomme ich es hin das die Seiten sich nicht überlappen, sondern immer die gezeigt wird die gerade vorne ist? Zitieren
Bubble Geschrieben 13. Juli 2005 Geschrieben 13. Juli 2005 Du initialisiertst D3D nicht richtig, Du musst einen Z-Buffer aktivieren. Probiere einmal folgende Angaben in Deiner Funktion InitD3D(): D3DPRESENT_PARAMETERS d3dpp = { 0, 0, D3DFMT_UNKNOWN, 1, D3DMULTISAMPLE_NONE, 0, D3DSWAPEFFECT_DISCARD, NULL, TRUE, TRUE, D3DFMT_D16, 0, D3DPRESENT_RATE_DEFAULT, D3DPRESENT_INTERVAL_DEFAULT }; Je nach Grafikkarte kannst Du auch einmal D3DFMT_D24X8 und D3DFMT_D32 ausprobieren. Zitieren
Guybrush Threepwood Geschrieben 14. Juli 2005 Autor Geschrieben 14. Juli 2005 Nee klappt leider nicht, dann siehts so aus: Zitieren
Bubble Geschrieben 14. Juli 2005 Geschrieben 14. Juli 2005 Klar klappt es, Du musst aber natürlich auch den Z-Buffer vor dem Zeichnen löschen! Ändere Deine Zeile g_.pD3DDevice->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,0,255 ),1.0,0); in g_.pD3DDevice->Clear(0,NULL,D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,D3DCOLOR_XRGB(0,0,255 ),1.0,0); Dein Programm enthält aber noch weitere Unsauberkeiten, z.B. wird Msg.Message nie initialisiert, aber verwendet. Zitieren
Guybrush Threepwood Geschrieben 14. Juli 2005 Autor Geschrieben 14. Juli 2005 Klar klappt es, Du musst aber natürlich auch den Z-Buffer vor dem Zeichnen löschen! Cool so klappts. Dein Programm enthält aber noch weitere Unsauberkeiten, z.B. wird Msg.Message nie initialisiert, aber verwendet. Stimmt das hab ich vergessen, weil meine Nachrichtenschleife zuerst anders aussah. Danke! Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.