第04讲 光照与材质(3)

2019-03-28 08:10

}

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);


第04讲 光照与材质(3).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:2016美赛E题参考答案

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: