索引缓存创建的立方体
#include "windows.h"
#include "windowsx.h"
#include "d3d9.h"
#include "d3dx9.h"
#include "tchar.h"
HWND g_hwnd;
LPDIRECT3D9 g_d3d9=NULL;
LPDIRECT3DDEVICE9 g_d3d9Device=NULL;
LPDIRECT3DVERTEXBUFFER9 g_vb=NULL;
LPDIRECT3DINDEXBUFFER9 g_id=NULL;
struct CustomVertex{
float x,y,z;
DWORD color;
};
#define CustomFVF (D3DFVF_XYZ|D3DFVF_DIFFUSE)
bool fillmode=true;
LRESULT CALLBACK wndproc(HWND hwnd,UINT message,WPARAM wpara,LPARAM lparam)
{
switch(message)
{
case WM_DESTROY:
{
PostQuitMessage(0);
break;
}
case WM_LBUTTONDOWN:
{
fillmode=!fillmode;
if (fillmode==true)
{
g_d3d9Device->SetRenderState(D3DRS_FILLMODE,D3DFILL_WIREFRAME);//多边形填充模式为线框
}
else
{
g_d3d9Device->SetRenderState(D3DRS_FILLMODE,D3DFILL_SOLID);//多边形填充模式为实体
}
break;
}
default:
break;
}
return DefWindowProc(hwnd,message,wpara,lparam);
}
LRESULT Render()
{
g_d3d9Device->Clear(0,NULL,D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,D3DCOLOR_XRGB(255,255,255),1.0f,0);
g_d3d9Device->SetRenderState(D3DRS_CULLMODE,D3DCULL_CCW);//只渲染多边形正面,默认为CCW
g_d3d9Device->SetRenderState( D3DRS_LIGHTING, FALSE );//关闭灯光,用顶点颜色来渲染
g_d3d9Device->SetRenderState( D3DRS_ZENABLE, TRUE );
D3DXMATRIX dm_world;
D3DXMATRIX dm_1;
D3DXMATRIX dm_2;
D3DXMatrixTranslation(&dm_1,0,0,-1);
D3DXMatrixTranslation(&dm_2,0,0, 1);
D3DXMatrixRotationY(&dm_world,GetTickCount()/500.0f);
dm_world=dm_1*dm_world*dm_2;
g_d3d9Device->SetTransform(D3DTS_WORLD,&dm_world);
D3DXVECTOR3 eye(0.0f,4.0f,-6.0f);
D3DXVECTOR3 lookat(0.0f,0.0f,0.0f);
D3DXVECTOR3 up(0.0f,1.0f,0.0f);
D3DXMATRIX dm_view;
D3DXMatrixLookAtLH(&dm_view,&eye,&lookat,&up);
g_d3d9Device->SetTransform(D3DTS_VIEW,&dm_view);
D3DXMATRIXA16 dm_proj;
D3DXMatrixPerspectiveFovLH(&dm_proj,D3DX_PI/4,1.0f,1.0f,100.0f);
g_d3d9Device->SetTransform(D3DTS_PROJECTION,&dm_proj);
g_d3d9Device->BeginScene();
g_d3d9Device->SetStreamSource(0,g_vb,0,sizeof(CustomVertex));
g_d3d9Device->SetFVF( CustomFVF );
g_d3d9Device->SetIndices(g_id);
g_d3d9Device->DrawIndexedPrimitive( D3DPT_TRIANGLELIST, 0, 0, 8, 0, 12 );
g_d3d9Device->EndScene();
g_d3d9Device->Present(NULL,NULL,NULL,NULL);
return S_OK;
}
LRESULT InitGame()
{
D3DCAPS9 d3dcaps9;
D3DPRESENT_PARAMETERS pa;
ZeroMemory(&pa,sizeof(pa));
pa.Windowed=true;
pa.AutoDepthStencilFormat=D3DFMT_D16;
pa.EnableAutoDepthStencil=true;
pa.SwapEffect=D3DSWAPEFFECT_DISCARD;
pa.BackBufferCount=1;
pa.BackBufferFormat=D3DFMT_A8R8G8B8;
g_d3d9= Direct3DCreate9(D3D_SDK_VERSION);
long devtype;
g_d3d9->GetDeviceCaps(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,&d3dcaps9);
if (d3dcaps9.DevCaps&D3DDEVCAPS_HWTRANSFORMANDLIGHT)
{
devtype=D3DCREATE_HARDWARE_VERTEXPROCESSING;
}
else
{
devtype=D3DCREATE_SOFTWARE_VERTEXPROCESSING;
}
if FAILED(g_d3d9->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,g_hwnd,devtype,&pa,&g_d3d9Device))
return E_FAIL;
CustomVertex cv[] =
{
//正面四个顶点
{ -1.0f , 1.0f, 0.0f ,D3DCOLOR_XRGB(255,0,0)},
{ 1.0f , 1.0f, 0.0f ,D3DCOLOR_XRGB(0,255,0)},
{ 1.0f , -1.0f, 0.0f ,D3DCOLOR_XRGB(0,0,255)},
{ -1.0f , -1.0f, 0.0f ,D3DCOLOR_XRGB(255,255,0)},
//背面四个顶点
{ 1.0f , 1.0f, 2.0f ,D3DCOLOR_XRGB(255,0,0)},
{ -1.0f , 1.0f, 2.0f ,D3DCOLOR_XRGB(0,255,0)},
{ -1.0f , -1.0f, 2.0f ,D3DCOLOR_XRGB(0,0,255)},
{ 1.0f , -1.0f, 2.0f ,D3DCOLOR_XRGB(255,255,0)},
};
WORD ib[] = { 3,0,1,3,1,2,1,4,2,4,7,2,4,5,7,5,6,7,5,0,6,0,3,6,0,5,4,0,4,1,3,2,6,6,2,7 };
if FAILED(g_d3d9Device->CreateVertexBuffer(sizeof(cv),0,CustomFVF,D3DPOOL_DEFAULT,&g_vb,NULL))
return E_FAIL;
void * p;
g_vb->Lock(0,sizeof(cv),(void **)&p,0);
memcpy(p,cv,sizeof(cv));
g_vb->Unlock();
if FAILED(g_d3d9Device->CreateIndexBuffer(sizeof(ib),0,D3DFMT_INDEX16,D3DPOOL_DEFAULT,&g_id,NULL))
return E_FAIL;
void *b;
g_id->Lock(0,sizeof(ib),(void **)&b,0);
memcpy(b,ib,sizeof(ib));
g_id->Unlock();
return S_OK;
}
int WINAPI WinMain( __in HINSTANCE hInstance, __in_opt HINSTANCE hPrevInstance, __in_opt LPSTR lpCmdLine, __in int nShowCmd )
{
WNDCLASSEX wndclassex;
ZeroMemory(&wndclassex,sizeof(wndclassex));
wndclassex.cbSize=sizeof(wndclassex);
wndclassex.hCursor=LoadCursor(hInstance,IDC_ARROW);
wndclassex.hInstance=hInstance;
wndclassex.lpszClassName=_T("game");
wndclassex.style=CS_HREDRAW|CS_VREDRAW;
wndclassex.hbrBackground=GetStockBrush(RGB(0,0,0));
wndclassex.lpfnWndProc=wndproc;
RegisterClassEx(&wndclassex);
g_hwnd=CreateWindow(_T("game"),_T("direct"),WS_OVERLAPPEDWINDOW,100,100,600,400,NULL,NULL,hInstance,NULL);
ShowWindow(g_hwnd,SW_SHOW);
UpdateWindow(g_hwnd);
InitGame();
MSG msg;
ZeroMemory(&msg,sizeof(msg));
while(msg.message!=WM_QUIT)
{
if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
Render();
}
return 0;
}