Новичок
Профиль
Группа: Участник
Сообщений: 8
Регистрация: 6.7.2012
Репутация: нет Всего: нет
|
Всем доброго времени суток! Начал немного программировать графику на DirectX по книге "Горнакова Уроки программирования на DirectX" так вот нарисовал куб, заставил его вращяться как в книге но когда начал использовать Z буфер куб отрисовывается паршиво некоторые грани не видно если убрать Z буфер то всё нормально. В чем может быть проблемма? Помогите разобраться пожалуйста? вот код программы | Код | #include <Windows.h> #include <tchar.h> #include <d3d9.h> #include <d3dx9.h> #include <MMSystem.h>
#pragma comment(lib, "d3d9.lib") #pragma comment(lib, "d3dx9.lib") #pragma comment(lib, "winmm.lib")
#include "resource.h"
#define SAFE_RELEASE(p) {\ if (p != NULL)\ {\ p->Release();\ p = NULL;\ }\ }
TCHAR szWindowClass[] = _T("Direct3DApplicationClass"); TCHAR szWindowTitle[] = _T("Direct 3D Application");
IDirect3D9 *g_pDirect = NULL; IDirect3DDevice9 *g_pDevice = NULL; IDirect3DVertexBuffer9 *g_pVertex = NULL; IDirect3DIndexBuffer9 *g_pIndex = NULL;
struct CUSTOMVERTEX { FLOAT x, y, z; DWORD color; };
#define FVF_CUSTOMVERTEX (D3DFVF_XYZ | D3DFVF_DIFFUSE)
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE, LPTSTR, int nCmdShow) { WNDCLASS wc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_MAIN)); wc.hInstance = hInstance; wc.lpfnWndProc = WndProc; wc.lpszClassName = szWindowClass; wc.lpszMenuName = NULL; wc.style = CS_DBLCLKS | CS_OWNDC | CS_VREDRAW | CS_HREDRAW; if (!RegisterClass(&wc)) { return 0; }
HWND hWnd = CreateWindow(szWindowClass, szWindowTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, HWND_DESKTOP, NULL, hInstance, NULL); if (!hWnd) { return 0; }
ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd);
g_pDirect = Direct3DCreate9(D3D_SDK_VERSION); if (g_pDirect == NULL) { return 0; }
D3DDISPLAYMODE dMode; HRESULT hr = g_pDirect->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &dMode); if (FAILED(hr)) { return 0; }
D3DPRESENT_PARAMETERS pParameters; ZeroMemory(&pParameters, sizeof(pParameters)); pParameters.AutoDepthStencilFormat = D3DFMT_D16; pParameters.BackBufferFormat = dMode.Format; pParameters.EnableAutoDepthStencil = TRUE; pParameters.SwapEffect = D3DSWAPEFFECT_DISCARD; pParameters.Windowed = TRUE; hr = g_pDirect->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &pParameters, &g_pDevice); if (FAILED(hr)) { return 0; }
g_pDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CW); g_pDevice->SetRenderState(D3DRS_LIGHTING, FALSE); g_pDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE);
CUSTOMVERTEX Vertex[] = { {1.0f, -1.0f, -1.0f, 0x00000fff}, {-1.0f, -1.0f, -1.0f, 0x00000fff}, {-1.0f, 1.0f, -1.0f, 0x00000fff}, {1.0f, 1.0f, -1.0f, 0x00000fff},
{-1.0f, -1.0f, 1.0f, 0x00000fff}, {-1.0f, -1.0f, -1.0f, 0x00000fff}, {-1.0f, 1.0f, -1.0f, 0x00000fff}, {-1.0f, 1.0f, 1.0f, 0x00000fff},
{1.0f, -1.0f, 1.0f, 0x00000fff}, {-1.0f, -1.0f, 1.0f, 0x00000fff}, {-1.0f, 1.0f, 1.0f, 0x00000fff}, {1.0f, 1.0f, 1.0f, 0x00000fff},
{1.0f, -1.0f, -1.0f, 0x00000fff}, {1.0f, -1.0f, 1.0f, 0x00000fff}, {1.0f, 1.0f, 1.0f, 0x00000fff}, {1.0f, 1.0f, -1.0f, 0x00000fff},
{1.0f, 1.0f, 1.0f, 0x00000fff}, {-1.0f, 1.0f, 1.0f, 0x00000fff}, {-1.0f, 1.0f, -1.0f, 0x00000fff}, {1.0f, 1.0f, -1.0f, 0x00000fff},
{1.0f, -1.0f, 1.0f, 0x00000fff}, {-1.0f, -1.0f, 1.0f, 0x00000fff}, {-1.0f, -1.0f, -1.0f, 0x00000fff}, {1.0f, -1.0f, -1.0f, 0x00000fff} };
hr = g_pDevice->CreateVertexBuffer(sizeof(Vertex), 0, FVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &g_pVertex, NULL); if (FAILED(hr)) { return 0; }
void *pVB; hr = g_pVertex->Lock(0, 0, (void**)&pVB, 0); if (FAILED(hr)) { return 0; }
CopyMemory(pVB, Vertex, sizeof(Vertex)); hr = g_pVertex->Unlock(); if (FAILED(hr)) { return 0; }
unsigned short Index[] = { 0, 1, 2, 2, 3, 0, 4, 5, 6, 6, 7, 4, 8, 9, 10, 10, 11, 8, 12, 13, 14, 14, 15, 12, 16, 17, 18, 18, 19, 16, 20, 21, 22, 22, 23, 20 };
hr = g_pDevice->CreateIndexBuffer(sizeof(Index), 0, D3DFMT_INDEX16, D3DPOOL_DEFAULT, &g_pIndex, NULL); if (FAILED(hr)) { return 0; }
void *pIB; hr = g_pIndex->Lock(0, 0, (void**)&pIB, 0); if (FAILED(hr)) { return 0; }
CopyMemory(pIB, Index, sizeof(Index));
hr = g_pIndex->Unlock(); if (FAILED(hr)) { return 0; }
MSG msg; ZeroMemory(&msg, sizeof(msg)); while (msg.message != WM_QUIT) { if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { TranslateMessage(&msg); DispatchMessage(&msg); } else { g_pDevice->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0); g_pDevice->BeginScene();
D3DXMATRIX mWorld, mWorldX, mWorldY, mWorldZ; UINT uTime = timeGetTime() % 5000; FLOAT fAngle = uTime * (2.0f * D3DX_PI) / 5000.0f; D3DXMatrixRotationX(&mWorldX, fAngle); D3DXMatrixRotationY(&mWorldY, fAngle); D3DXMatrixMultiply(&mWorld, &mWorldX, &mWorldY); g_pDevice->SetTransform(D3DTS_WORLD, &mWorld);
D3DXMATRIX mView; D3DXMatrixLookAtLH(&mView, &D3DXVECTOR3(0.0f, 0.0f, -8.0f), &D3DXVECTOR3(0.0f, 0.0f, 0.0f), &D3DXVECTOR3(0.0f, 1.0f, 0.0f)); g_pDevice->SetTransform(D3DTS_VIEW, &mView);
D3DXMATRIX mProjection; D3DXMatrixPerspectiveFovLH(&mProjection, D3DX_PI / 4, 1.0f, 1.0f, 100.0f); g_pDevice->SetTransform(D3DTS_PROJECTION, &mProjection);
g_pDevice->SetStreamSource(0, g_pVertex, 0, sizeof(CUSTOMVERTEX)); g_pDevice->SetFVF(FVF_CUSTOMVERTEX); g_pDevice->SetIndices(g_pIndex); g_pDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, ARRAYSIZE(Index), 0, 12); g_pDevice->EndScene(); g_pDevice->Present(NULL, NULL, NULL, NULL); } }
SAFE_RELEASE(g_pIndex); SAFE_RELEASE(g_pVertex); SAFE_RELEASE(g_pDevice); SAFE_RELEASE(g_pDirect); return (int)msg.wParam; }
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_CREATE: break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hWnd, uMsg, wParam, lParam); } return 0; }
|
|