Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

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

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.

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.

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

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.