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?