struct CUSTOMVERTEX { D3DXVECTOR3 position; D3DXVECTOR3 normal; };
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_NORMAL) //设置光照与材质 void setlighting() { D3DMATERIAL9 mtrl; //设置材质 mtrl.Ambient = D3DXCOLOR(1.0f, 1.0f, 1.0f, 1.0f);; mtrl.Diffuse = D3DXCOLOR(1.0f, 1.0f, 1.0f, 1.0f); mtrl.Specular = D3DXCOLOR(1.0f, 1.0f, 1.0f, 1.0f); mtrl.Emissive = D3DXCOLOR(0.0f, 0.0f, 0.0f, 1.0f); mtrl.Power = 1.0f;
g_pd3dDevice->SetMaterial( &mtrl); D3DLIGHT9 dir_light; //设置方向光照 ZeroMemory(&dir_light, sizeof(dir_light));
dir_light.Type = D3DLIGHT_DIRECTIONAL;
dir_light.Diffuse.r =dir_light.Diffuse.g=dir_light.Diffuse.b=1.0f; dir_light.Specular.r = dir_light.Specular.g=dir_light.Specular.b=0.3f; dir_light.Ambient.r = dir_light.Ambient.g=dir_light.Ambient.b=0.6f; dir_light.Direction = D3DXVECTOR3(-1.0f, 0.0f, 0.0f); dir_light.Range=1000; g_pd3dDevice->SetLight(0, &dir_light); g_pd3dDevice->LightEnable(0, TRUE); g_pd3dDevice->SetRenderState(D3DRS_NORMALIZENORMALS, TRUE); g_pd3dDevice->SetRenderState(D3DRS_SPECULARENABLE, TRUE); g_pd3dDevice->SetRenderState(D3DRS_LIGHTING, true); }
//----------------------------------------------------------------------------- // Desc: 设置观察矩阵和投影矩阵.设置观察矩阵和投影矩阵 //----------------------------------------------------------------------------- VOID SetupViewandProjMatrices() { //建立并设置观察矩阵 D3DXVECTOR3 vEyePt( 5.0f,5.0f,-5.0f ); D3DXVECTOR3 vLookatPt( 0.0f, 0.0f, 0.0f ); D3DXVECTOR3 vUpVec( 0.0f, 1.0f, 0.0f );
D3DXMATRIX matView; D3DXMatrixLookAtLH( &matView, &vEyePt, &vLookatPt, &vUpVec ); g_pd3dDevice->SetTransform( D3DTS_VIEW, &matView ); //建立并设置投影矩阵 D3DXMATRIX matProj; D3DXMatrixPerspectiveFovLH( &matProj, D3DX_PI/4, 1.0f, 1.0f, 1000.0f ); g_pd3dDevice->SetTransform( D3DTS_PROJECTION, &matProj ); }
//----------------------------------------------------------------------------- // Desc: 初始化Direct3D
//----------------------------------------------------------------------------- HRESULT InitD3D( HWND hWnd ) { //创建Direct3D对象, 该对象用于创建Direct3D设备对象 if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) ) return E_FAIL; //设置D3DPRESENT_PARAMETERS结构, 准备创建Direct3D设备对象 D3DPRESENT_PARAMETERS d3dpp; ZeroMemory( &d3dpp, sizeof(d3dpp) ); d3dpp.Windowed = TRUE; d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; d3dpp.BackBufferFormat = D3DFMT_UNKNOWN; //创建Direct3D设备对象 if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING,&d3dpp, &g_pd3dDevice ) ) ) { return E_FAIL; } //设置剔出模式为不剔出任何面(正面和反面) g_pd3dDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE ); //关闭光照处理, 默认情况下启用光照处理 g_pd3dDevice->SetRenderState( D3DRS_LIGHTING, FALSE ); //g_pd3dDevice->SetRenderState(D3DRS_SHADEMODE, D3DSHADE_GOURAUD); g_pd3dDevice->SetRenderState(D3DRS_SHADEMODE, D3DSHADE_FLAT); ////g_pd3dDevice->SetRenderState(D3DRS_FILLMODE, D3DFILL_WIREFRAME); //设置观察和投影矩阵 SetupViewandProjMatrices(); setlighting(); //设置视区
// SetupViewPort(); return S_OK;
}
//----------------------------------------------------------------------------- // Desc: 释放创建的对象.、结束处理
//----------------------------------------------------------------------------- VOID Cleanup() { //释放顶点缓冲区对象 if( g_pVB != NULL ) g_pVB->Release(); //释放Direct3D设备对象 if( g_pd3dDevice != NULL ) g_pd3dDevice->Release(); //释放Direct3D对象 if( g_pD3D != NULL ) g_pD3D->Release(); //释放索引缓冲区对象 if(g_pIB != NULL) g_pIB->Release(); }
//5.绘制图形
HRESULT InitGeometry() { //创顶点缓冲区 if( FAILED( g_pd3dDevice->CreateVertexBuffer(12*sizeof(CUSTOMVERTEX), 0, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &g_pVB, NULL ) ) ) { return E_FAIL; } //填充顶点缓冲区 CUSTOMVERTEX* pVertices; if( FAILED( g_pVB->Lock( 0, 0, (void**)&pVertices, 0 ) ) ) return E_FAIL; // memcpy( pVertices, vertices, sizeof(vertices) );
D3DXVECTOR3 u,v,nor; //前面 pVertices[0].position=D3DXVECTOR3(-1.0f, 0.0f, -1.0f); pVertices[1].position=D3DXVECTOR3(0.0f, 1.0f, 0.0f); pVertices[2].position=D3DXVECTOR3(1.0f, 0.0f, -1.0f);
v=pVertices[0].position-pVertices[1].position; u=pVertices[2].position-pVertices[1].position; D3DXVec3Cross(&nor,&u,&v); D3DXVec3Normalize(&nor,&nor); pVertices[0].normal=pVertices[1].normal=pVertices[2].normal=nor; //左边
pVertices[3].position=D3DXVECTOR3(-1.0f, 0.0f, 1.0f); pVertices[4].position=D3DXVECTOR3(0.0f, 1.0f, 0.0f); pVertices[5].position=D3DXVECTOR3(-1.0f, 0.0f, -1.0f);; v=pVertices[3].position-pVertices[4].position; u=pVertices[5].position-pVertices[4].position; D3DXVec3Cross(&nor,&u,&v); D3DXVec3Normalize(&nor,&nor); pVertices[3].normal=pVertices[4].normal=pVertices[5].normal=nor; //右边 pVertices[6].position=D3DXVECTOR3(1.0f, 0.0f, -1.0f); pVertices[7].position=D3DXVECTOR3(0.0f, 1.0f, 0.0f); pVertices[8].position=D3DXVECTOR3(1.0f, 0.0f, 1.0f); v=pVertices[6].position-pVertices[7].position; u=pVertices[8].position-pVertices[7].position; D3DXVec3Cross(&nor,&u,&v); D3DXVec3Normalize(&nor,&nor); pVertices[6].normal=pVertices[7].normal=pVertices[8].normal=nor; //后面 pVertices[9].position=D3DXVECTOR3(1.0f, 0.0f, 1.0f); pVertices[10].position=D3DXVECTOR3(0.0f, 1.0f, 0.0f); pVertices[11].position=D3DXVECTOR3(-1.0f, 0.0f, 1.0f); v=pVertices[9].position-pVertices[10].position; u=pVertices[11].position-pVertices[10].position; D3DXVec3Cross(&nor,&u,&v); D3DXVec3Normalize(&nor,&nor); pVertices[9].normal=pVertices[10].normal=pVertices[11].normal=nor; g_pVB->Unlock(); return S_OK; }
//----------------------------------------------------------------------------- // Desc: 渲染图形.渲染函数
//----------------------------------------------------------------------------- VOID Render() { //清空后台缓冲区
g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(45, 50,255), 1.0f, 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 ); //设置索引缓冲区 //D3DXMATRIX Ry; //D3DXMatrixRotationY(&Ry,::timeGetTime()/1000.0f); //g_pd3dDevice->SetTransform(D3DTS_WORLD,&Ry); g_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0,4 ); //结束在后台缓冲区渲染图形 g_pd3dDevice->EndScene(); } //将在后台缓冲区绘制的图形提交到前台缓冲区显示 g_pd3dDevice->Present( NULL, NULL, NULL, NULL ); }
//----------------------------------------------------------------------------- // Desc: 消息处理.消息处理
//-----------------------------------------------------------------------------
LRESULT WINAPI MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam ) { switch( msg ) { case WM_DESTROY: Cleanup(); PostQuitMessage( 0 ); return 0; } return DefWindowProc( hWnd, msg, wParam, lParam ); }
//----------------------------------------------------------------------------- // Desc: 入口函数.程序入口
//-----------------------------------------------------------------------------
INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR, INT ) { //注册窗口类 WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC , MsgProc, 0L, 0L,