点光源-镜面反射[整理版]

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

点光源-镜面反射[整理版]
点光源-镜面反射
//本程序演示一个带镜面反射的游泳圈 #include<d3d9.h>
#include<d3dx9.h>
#include<windows.h>
//动态链接库
#pragma comment(lib,"d3d9.lib") #pragma comment(lib,"d3dx9.lib")
#pragma comment(lib,"winmm.lib")
//全局变量
LPDIRECT3D9 g_pD3D = NULL; LPDIRECT3DDEVICE9 g_pD3DDevice = NULL; //创建ID3DXMESH接口指针
LPD3DXMESH Torus=NULL;
#define D3DFVF_CUSTOMVERTEX (D3DFVF_NORMAL)
//初始化D3D
HRESULT InitD3D( HWND hWnd )
{
//获取D3D接口指针
if(NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION )))
return E_FAIL;
//设置显示器
D3DDISPLAYMODE d3ddm;
ZeroMemory( &d3ddm,sizeof(d3ddm ) );
if( FAILED( g_pD3D->GetAdapterDisplayMode( D3DADAPTER_DE
FAULT,&d3ddm )))
return E_FAIL;
//设置显卡
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory(&d3dpp,sizeof(D3DPRESENT_PARAMETERS));
d3dpp.BackBufferWidth=d3ddm.Width;
d3dpp.BackBufferHeight=d3ddm.Height;
d3dpp.SwapEffect=D3DSWAPEFFECT_DISCARD;
d3dpp.Windowed=TRUE;
d3dpp.BackBufferFormat=d3ddm.Format;
//创建设备
if(FAILED(g_pD3D-
>CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hWnd,D3DCREATE_SOFTWARE_ VERTEXPROCESSING,&d3dpp,&g_pD3DDevice)))
return E_FAIL;
//开启光照
g_pD3DDevice->SetRenderState( D3DRS_LIGHTING, true);
//设置填充模式
g_pD3DDevice->SetRenderState( D3DRS_FILLMODE, 3 );
//设置剔除模式为不剔除任何面
g_pD3DDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE);
//打开环境光
g_pD3DDevice->SetRenderState(D3DRS_AMBIENT,0xffffffff);
return S_OK;
}
//设置材质和光照
void InitMaterialAndLight()
{
//设置材质
D3DMATERIAL9 matl;
ZeroMemory(&matl,sizeof(matl));
matl.Ambient.r=1.0f; //环境光颜色
matl.Ambient.g=1.0f;
matl.Specular.b=1.0f; //镜面光颜色
matl.Power = 5.0f; //高亮
//获得材质属性
g_pD3DDevice->SetMaterial(&matl);
//设置灯光
D3DLIGHT9 light1;
ZeroMemory(&light1,sizeof(light1));
//点光源不用考虑光线的方向,要考虑位置,衰弱,距离,颜色
light1.Type=D3DLIGHT_POINT; //点光源
light1.Position=D3DXVECTOR3(0,0,-10) ;//光源在3D世界中的位置light1.Ambient.g=1.0f; //光源发出来的环境光的颜色(绿色)
light1.Specular.b=1.0f;//光源发出来的镜面光的颜色
light1.Ambient.r=1.0f;
light1.Range=100.0f; //光源达到的最大距离
light1.Attenuation0=1.0f; //光源的衰弱速度
//在Direct3D管理的内部光源列表中注册该光源
g_pD3DDevice->SetLight(0,&light1); //参数(光源在列表中的
位置,D3DLIGHT9结构的地址)
//开启光照
g_pD3DDevice->LightEnable(0,true);
//标准化定点法线向量
g_pD3DDevice->SetRenderState(D3DRS_NORMALIZENORMALS,
true);
//打开镜面光
g_pD3DDevice->SetRenderState(D3DRS_SPECULARENABLE, true);
}
//设置矩阵
VOID SetTransform()
{
D3DXMATRIX matWorld,matView,matProj;
D3DXMATRIX matRotationX,matRotationY,matRotationZ;
//世界矩阵
D3DXMatrixRotationX(&matRotationX, (float)timeGetTime()/1000); D3DXMatrixRotationY(&matRotationY,
(float)timeGetTime()/900);
D3DXMatrixRotationZ(&matRotationZ,
(float)timeGetTime()/800);
D3DXMatrixMultiply(&matWorld,&matRotationX,&matRotationY);
D3DXMatrixMultiply(&matWorld,&matWorld,&matRotationZ);
g_pD3DDevice->SetTransform(D3DTS_WORLD,&matWorld);
//视图矩阵
D3DXMatrixLookAtLH(&matView,&D3DXVECTOR3(20,0,-
50),&D3DXVECTOR3(0,0,0),&D3DXVECTOR3(0,1,0));
g_pD3DDevice->SetTransform(D3DTS_VIEW,&matView);
//投影矩阵
D3DXMatrixPerspectiveFovLH(&matProj,(float)D3DX_PI/4,(float)800/640, 0,300);
g_pD3DDevice->SetTransform(D3DTS_PROJECTION,&matProj);
}
//绘制图元
void Render()
{
//清空后台缓冲区
g_pD3DDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);
//开始绘制图元
if( SUCCEEDED(g_pD3DDevice->BeginScene()))
{
//设置材质和光照
InitMaterialAndLight();
//绘制一个游泳圈
Torus->DrawSubset(0);
g_pD3DDevice->EndScene();
}
//进行翻页显示
g_pD3DDevice->Present(NULL, NULL, NULL, NULL);
}
//释放资源
VOID Cleanup()
{
if( g_pD3DDevice != NULL )
g_pD3DDevice->Release();
if( g_pD3D != NULL )
g_pD3D->Release(); }
//消息函数
LRESULT CALLBACK WndProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
switch(msg)
{
case WM_DESTROY:
PostQuitMessage(0);
return 0;
case WM_KEYUP:
switch(wParam)
{
case VK_ESCAPE:
PostQuitMessage(0);
return 0;
}
break;
default:
return DefWindowProc(hWnd,msg,wParam,lParam);
}
return 1;
}
//主函数
int WINAPI WinMain( HINSTANCE hInstance,HINSTANCE,LPTSTR lpCmdLine,int nCmdShow)
{
//用于保存窗体信息的结构体
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW|CS_VREDRAW;
wcex.lpfnWndProc = (WNDPROC)WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = NULL;
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = NULL;
wcex.lpszClassName = "演示程序";
wcex.hIconSm = NULL;
//注册窗体类
RegisterClassEx(&wcex);
//创建窗体
HWND hWnd = CreateWindowEx(0,"演示程序", "主窗口标题",
WS_OVERLAPPEDWINDOW,100, 100, 800, 640, HWND_DESKTOP, NULL, hInstance, NULL);
if (!hWnd) return FALSE;
if( SUCCEEDED(InitD3D(hWnd) ))
{
if( SUCCEEDED(D3DXCreateTorus(g_pD3DDevice,5,10,80,80,&T orus,0)))
{
//显示窗口并更新窗口
ShowWindow(hWnd,nCmdShow);
UpdateWindow(hWnd);
//用于保存windows消息信息的结构体
MSG msg;
ZeroMemory( &msg, sizeof(msg) );
//未受到退出消息的情况下,程序一直执行
while(msg.message != WM_QUIT)
{
//获取消息
if(PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE)) {
//翻译并发送消息
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
//设置transhform转换
SetTransform();
Render();
}
}
}
}
//注销窗体类
UnregisterClass("演示程序",hInstance);
//释放资源
Cleanup();
return 1;
}。

相关文档
最新文档