您的位置:首页 > 编程语言

DX编程(3) —— 使用索引缓冲 创建2个三角形

2011-05-21 15:32 471 查看
#include <d3d9.h>
#include <d3dx9effect.h>
#include <math.h>

#pragma comment(lib,"d3d9.lib")

#pragma warning(disable : 4996)
#include <strsafe.h>
#pragma warning(default : 4996)

LPDIRECT3D9       g_pD3D = NULL;
LPDIRECT3DDEVICE9 g_pd3dDevice = NULL;
LPDIRECT3DVERTEXBUFFER9 g_pVB = NULL;
LPDIRECT3DINDEXBUFFER9  g_pIB = NULL; //索引缓冲区

HRESULT InitD3D(HWND hWnd)
{
if(NULL == (g_pD3D = Direct3DCreate9(D3D_SDK_VERSION)))
return E_FAIL;

D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory(&d3dpp,sizeof(d3dpp));
d3dpp.Windowed = TRUE;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;
if(FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hWnd,D3DCREATE_SOFTWARE_VERTEXPROCESSING,&d3dpp,&g_pd3dDevice)))
return E_FAIL;

return S_OK;
}

void Cleanup()
{
if(NULL != g_pVB)
g_pVB->Release();

if(NULL != g_pIB)
g_pIB->Release();

if(NULL != g_pd3dDevice)
g_pd3dDevice->Release();

if(NULL != g_pD3D)
g_pD3D->Release();
}

/*****************************************************************************/

struct CUSTOMVERTEX
{
FLOAT x,y,z,rhw;
DWORD color;
};

#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW | D3DFVF_DIFFUSE)

HRESULT InitVB()
{
CUSTOMVERTEX Vertices[] =
{
{200.0f, 150.0f,   0.5f, 1.0f, 0xffff0000,},
{400.0f, 0.0f,     0.5f, 1.0f, 0xff00ff00,},
{400.0f, 100.0f,   0.5f, 1.0f, 0xff0000ff,},
{400.0f, 200.0f,   0.5f, 1.0f, 0xffff0000,},
{400.0f, 300.0f,   0.5f, 1.0f, 0xff00ff00,},
};

if(FAILED(g_pd3dDevice->CreateVertexBuffer(5*sizeof(CUSTOMVERTEX),0,D3DFVF_CUSTOMVERTEX,D3DPOOL_DEFAULT,&g_pVB,NULL)))
return E_FAIL;

void *pVertices;
if(FAILED(g_pVB->Lock(0,sizeof(Vertices),&pVertices,0)))
return E_FAIL;
memcpy(pVertices,Vertices,sizeof(Vertices));
g_pVB->Unlock();

//创建索引缓冲区
WORD Indices[] = {0,1,2, 0,3,4};
if(FAILED(g_pd3dDevice->CreateIndexBuffer(sizeof(Indices),0,D3DFMT_INDEX16,D3DPOOL_DEFAULT,&g_pIB,NULL)))
return E_FAIL;

//填充索引缓冲
void* pi;
if(FAILED(g_pIB->Lock(0,sizeof(Indices),&pi,0)))
return E_FAIL;
memcpy(pi,Indices,sizeof(Indices));
g_pIB->Unlock();

return S_OK;
}

void Render()
{
if(NULL == g_pd3dDevice)
return;

g_pd3dDevice->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,0,0),1.0,0);

if(SUCCEEDED(g_pd3dDevice->BeginScene()))
{

g_pd3dDevice->SetStreamSource(0,g_pVB,0,sizeof(CUSTOMVERTEX));
g_pd3dDevice->SetFVF(D3DFVF_CUSTOMVERTEX);
//指定索引缓冲区
g_pd3dDevice->SetIndices(g_pIB);
//渲染 与上次不同
g_pd3dDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,0,0,5,0,2);

g_pd3dDevice->EndScene();
}

g_pd3dDevice->Present(NULL,NULL,NULL,NULL);
}

/*****************************************************************************/

LRESULT CALLBACK WndProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
switch(uMsg)
{
case WM_PAINT:
Render();
ValidateRect(hWnd,NULL);
break;
case WM_DESTROY:
Cleanup();
PostQuitMessage(0);
break;
default:
break;
}

return DefWindowProc(hWnd,uMsg,wParam,lParam);
}

int WINAPI wWinMain( __in HINSTANCE hInstance, __in_opt HINSTANCE hPrevInstance, __in_opt LPWSTR lpCmdLine, __in int nShowCmd )
{
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hbrBackground = NULL;
wcex.hCursor = NULL;
wcex.hIcon = NULL;
wcex.hIconSm = NULL;
wcex.hInstance = GetModuleHandle(NULL);
wcex.lpfnWndProc = WndProc;
wcex.lpszClassName = L"First D3D Window";
wcex.lpszMenuName = NULL;
wcex.style = CS_CLASSDC | CS_HREDRAW | CS_VREDRAW;

RegisterClassEx(&wcex);

HWND hWnd = CreateWindow(L"First D3D Window",L"第一个D3D窗口",WS_OVERLAPPEDWINDOW,0,0,600,400,GetDesktopWindow(),NULL,
wcex.hInstance,NULL);

if(SUCCEEDED(InitD3D(hWnd)) && SUCCEEDED(InitVB()))
{
ShowWindow(hWnd,SW_SHOWDEFAULT);
UpdateWindow(hWnd);

MSG msg;
while (GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}

}

UnregisterClass(L"First D3D Window",wcex.hInstance);

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息