索引缓存创建的立方体

#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;
}

posted @ 2009-06-02 01:41  I-Jie  阅读(360)  评论(1编辑  收藏  举报