实验十、D3D光照应用
1、 实验目的
1、 掌握D3D的光照模型
2、 实验步骤
1、 打开vs.net2005,打开ftp上的3Ddemo9项目,将顶点缓冲的长度从18改为24,执行并观看结果。
if(FAILED(g_pD3DDevice->CreateVertexBuffer( 24* sizeof(CUSTOMVERTEX),
0,
D3DFVF_CUSTOMVERTEX,
D3DPOOL_DEFAULT,
&g_pVertexBuffer,
NULL)))
2、 修改物体的材质
void InitMaterial()
{
D3DCOLORVALUE rgbaDiffuse = {1.0, 1.0, 1.0, 1.0,};//漫射光的反射率
D3DCOLORVALUE rgbaAmbient = {1.0, 1.0, 1.0, 1.0,};//环境光的反射率
D3DCOLORVALUE rgbaSpecular = {1.0 ,1.0, 1.0, 1.0,};//镜面光的反射率
D3DCOLORVALUE rgbaEmissive = {0.0, 0.0, 0.0, 1.0,};//物体本身的亮度
matMaterial.Diffuse = rgbaDiffuse;
matMaterial.Ambient = rgbaAmbient;
matMaterial.Specular = rgbaSpecular;
matMaterial.Power = 100.0f;//高光点的锐度
matMaterial.Emissive = rgbaEmissive;
}
2.1 将上述代码中的漫射光的反射率改为{1.0, 0.0, 0.0, 1.0,}后执行并观看效果。
2.2 将高光点的锐度改为1.0f执行并观看效果。
2.3 将物体本身亮度Emissive改为{1.0, 1.0, 1.0, 1.0,}后执行并观看效果。
2.4 将代码复原,做下面的灯光实验。
3、 修改灯光
//初始化灯光
HRESULT InitLight()
{
D3DLIGHT9 d3dLight;
D3DXVECTOR3 vDir;
//初始化灯光结构
ZeroMemory(&d3dLight, sizeof(D3DLIGHT9));
//
d3dLight.Type = D3DLIGHT_POINT;//点光源
d3dLight.Type = D3DLIGHT_DIRECTIONAL;//方向光
//
d3dLight.Type = D3DLIGHT_SPOT ;//聚光灯
//漫射光
d3dLight.Diffuse.r = 1.0f;
d3dLight.Diffuse.g = 1.0f;
d3dLight.Diffuse.b = 1.0f;
//环境光
d3dLight.Ambient.r = 0.0f;
d3dLight.Ambient.g = 0.0f;
d3dLight.Ambient.b = 0.0f;
//镜面光
d3dLight.Specular.r
= 1.0f;
d3dLight.Specular.g
= 1.0f;
d3dLight.Specular.b
= 1.0f;
//光源位置
d3dLight.Position.x
= 0.0f;
d3dLight.Position.y
=0.0f;
d3dLight.Position.z
= -6.0f;
//距离的衰减变量
d3dLight.Attenuation0 = 0.0f;
d3dLight.Attenuation1 = 0.4f;
d3dLight.Attenuation2 = 0.2f;
//聚光灯的内外圆锥角
d3dLight.Theta = 0.1f;
d3dLight.Phi = 1.0f;
//聚光灯的从内向外衰减方式
d3dLight.Falloff = 1.0f;
//光传播的方向
d3dLight.Direction = D3DXVECTOR3(1.0f,0.0f, 1.0f );
//光的范围
d3dLight.Range = 1000.0f;
//注册光源,参数分别为光源在光源列表的序号和光源的结构体地址
if(FAILED(g_pD3DDevice->SetLight(0, &d3dLight)))
{
return E_FAIL;
}
//打开TRUE(或关闭FALSE)指定序号的光源
if(FAILED(g_pD3DDevice->LightEnable(0, TRUE)))
{
return E_FAIL;
}
//打开灯光
if(FAILED(g_pD3DDevice->SetRenderState(D3DRS_LIGHTING, TRUE)))
{
return E_FAIL;
}
//设置环境光
if(FAILED(g_pD3DDevice->SetRenderState(D3DRS_AMBIENT, D3DCOLOR_XRGB(0, 0,0))))
{
return E_FAIL;
}
//启用镜面高光
g_pD3DDevice->SetRenderState( D3DRS_SPECULARENABLE, TRUE );
//重新规划化法向量
g_pD3DDevice->SetRenderState( D3DRS_NORMALIZENORMALS, TRUE );
return D3D_OK;
}
3.1 修改灯光中的漫射光的值,改为
d3dLight.Diffuse.r = 1.0f;
d3dLight.Diffuse.g = 0.0f;
d3dLight.Diffuse.b = 0.0f;
执行并观看效果。
3.2 修改灯光中环境光的值,改为
d3dLight.Ambient.r = 0.0f;
d3dLight.Ambient.g = 0.0f;
d3dLight.Ambient.b = 1.0f;
执行并观看效果。
3.3 修改灯光中镜面光的值,改为:
d3dLight.Specular.r = 1.0f;
d3dLight.Specular.g = 1.0f;
d3dLight.Specular.b = 1.0f;
执行并观看效果,小心转动立方体,直到看见镜面反光为止。
3.4 修改灯光的传播方向,改为
d3dLight.Direction = D3DXVECTOR3(0.0f,-1.0f, 1.0f );
执行并观看效果。
--------------------------------------------------------------------------------------------------------------
本文档为【三维编程实验十、d3d光照应用】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。