Zum Inhalt springen

Directx9: Texturen überlappen


Empfohlene Beiträge

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?

post-16898-14430447184508_thumb.jpg

post-16898-14430447184675_thumb.jpg

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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!:)

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...