}
GetModuleHandle(NULL), NULL, NULL, NULL, NULL, L\, NULL }; RegisterClassEx( &wc ); //创建窗口
HWND hWnd = CreateWindow( L\,L\坐标变换\, WS_OVERLAPPEDWINDOW, 200, 100, 500,500, GetDesktopWindow(), NULL, wc.hInstance, NULL ); //初始化Direct3D
if( SUCCEEDED( InitD3D( hWnd ) ) ) { //创建场景图形 if( SUCCEEDED( InitGeometry()) ) { //显示窗口 ShowWindow( hWnd, SW_SHOWDEFAULT ); UpdateWindow( hWnd ); //进入消息循环 MSG msg; ZeroMemory( &msg, sizeof(msg) ); while( msg.message!=WM_QUIT ) { if( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) ) { TranslateMessage( &msg ); DispatchMessage( &msg ); } else { Render(); //渲染图形 } } } }
UnregisterClass( L\, wc.hInstance ); return 0;
实例2:
void setlighting() { D3DMATERIAL9 mtrl; mtrl.Ambient = D3DXCOLOR(1.0f, 1.0f, 0.0f, 1.0f);; mtrl.Diffuse = D3DXCOLOR(1.0f, 1.0f, 0.0f, 1.0f); mtrl.Specular = D3DXCOLOR(1.0f, 1.0f, 0.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; D3DXVECTOR3 dir_vec;
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_vec=D3DXVECTOR3 (cos(::timeGetTime()/1000.0f),0,sin(::timeGetTime()/1000.0f)); D3DXVec3Normalize((D3DXVECTOR3*)&dir_light.Direction,&dir_vec); 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); }
//5.绘制图形
HRESULT InitGeometry() {
//创顶点缓冲区
if( FAILED( g_pd3dDevice->CreateVertexBuffer(50*2*sizeof(CUSTOMVERTEX), { }
//填充顶点缓冲区
CUSTOMVERTEX* pVertices;
if( FAILED( g_pVB->Lock( 0, 0, (void**)&pVertices, 0 ) ) )
return E_FAIL;
return E_FAIL;
0, D3DFVF_CUSTOMVERTEX,
D3DPOOL_DEFAULT, &g_pVB, NULL ) ) )
for( DWORD i=0; i<50; i++ ) {
FLOAT theta = (2*D3DX_PI*i)/(50-1);
pVertices[2*i+0].position = D3DXVECTOR3( sinf(theta),-1.0f, cosf(theta) );
pVertices[2*i+0].normal=D3DXVECTOR3( sinf(theta),0, cosf(theta) ); pVertices[2*i+1].position = D3DXVECTOR3( sinf(theta), 1.0f, cosf(theta) ); pVertices[2*i+1].normal=D3DXVECTOR3( sinf(theta),0, cosf(theta) );
} }
g_pVB->Unlock(); return S_OK;
//----------------------------------------------------------------------------- // Desc: 渲染图形.渲染函数
//----------------------------------------------------------------------------- VOID Render() { }
//清空后台缓冲区
g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(45, 50,255), 1.0f, 0 );
setlighting();
//开始在后台缓冲区绘制图形
if( SUCCEEDED( g_pd3dDevice->BeginScene() ) ) {
g_pd3dDevice->SetStreamSource( 0, g_pVB, 0, sizeof(CUSTOMVERTEX) );
g_pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEX );
g_pd3dDevice->DrawPrimitive( D3DPT_TRI IP, 0, 2*50-2 );
//结束在后台缓冲区渲染图形 g_pd3dDevice->EndScene();
}
//将在后台缓冲区绘制的图形提交到前台缓冲区显示 g_pd3dDevice->Present( NULL, NULL, NULL, NULL );
试一试使用聚光灯的效果:
D3DLIGHT9 dir_light1;
D3DXVECTOR3 dir_vec1;
ZeroMemory(&dir_light1, sizeof(dir_light1)); dir_light1.Type = D3DLIGHT_SPOT; dir_light1.Specular.r = dir_light1.Specular.g=0.8f;
g_pd3dDevice->SetLight(1, &dir_light1); dir_light1.Specular.b=0.0f;
dir_light1.Position= D3DXVECTOR3(5.0f, 0.0f, 0.0f); dir_light1.Range=100;
dir_light1.Falloff=1.0f;// 辐射系数 dir_light1.Attenuation0 = 1.0f; dir_light1.Theta dir_light1.Phi
= 0.4f; = 0.6f;
// 衰减系数
// 内锥体大小 // 外锥体大小
dir_light1.Direction = D3DXVECTOR3(-1,0,0);
g_pd3dDevice->LightEnable(1, TRUE);