Direct3D基础——光照的组成、材质、顶点法线、光源

为了增强所绘制的场景的真实感,我们会为场景增加光照,使用光照来描物体的立体感。使用光照的时候,我们就无需描述顶点的颜色,Direct3D会将顶点送入光照计算引擎,然后引擎根据光源类型,材质以及物体表面和相对于光源的朝向等等,计算出内个顶点的颜色值。基于某种光照模型然后计算出顶点的颜色,效果更nice。

光照的组成

环境光

这种类型的光经过其他物体表面反射到达所观察物体,并且照亮场景。比如:某一个物体的一部分被照亮,但是该物体并没有处在光源的直接照射下,之所以被照亮,是因为有其他物体反射光源的光,然后到达自己身上,再被照亮的。这类光叫做环境光。

漫射光

这种类型的光沿着特定的方向传播。当漫射光到达一定表面的时候,沿着物体表面的所有方向均匀反射,所以无论从哪一个方向观察,表面的亮度都是相同的,所以采用漫射光的模型的时候,不需要考虑观察者的位置。所以漫射光方程中只需要考虑光的传播方向以及表面的朝向。从一个光源发出的光,大多就是这种类型的光。

镜面光

这类光沿着特定的方向传播,当光线到达表面之后,然后严格的按照另外一个方向进行,从而形成只能在一定角度才能观察到的高亮度照射,所以在镜面光方程中我们不仅要光照的入射方向和物体的表面朝向,还要考虑观察者的方向,镜面光可以模拟物体中的高光点,例如:当光线照射到物体表面所形成的的比较亮的照射

镜面光的计算量比环境光和漫射光的计算量要大得多,所以Direct3D专门为其设置了开关选项,默认情况下,Direct3D是不计算镜面光的反射的。

使用状态机将有关状态设置为true,就会将镜面光照打开:

Device->SetRenderState(D3DRS_SOECULARENABLE,true);

材质

在现实世界中,物体的颜色是由其反射的光的颜色决定的。一个物体反射所有的红色光,吸收所有的非红色光,那么这个物体就呈现于红色光。Direct3D中允许我们通过定义物体的材质来模拟同样的现象。材质允许我们定义物体的表面对各种光的反射比例,在代码中使用D3DMATERIAL9来表示:

typedef struct D3DMATERIAL9
{
	D3DCOLORVALUE Diffuse;	//指定材质对漫射光的反射率
	D3DCOLORVALUE Ambient;	//指定材质对环境光的反射率
	D3DCOLORVALUE Specular;	//指定材质对镜面光的反射率
	D3DCOLORVALUE Emissive;	//该分量用于增强物体的亮度,使之看起来可以自己发光
	float Power;			//指定镜面高光的锐度,该值越大,高光点的锐度越大
}D3DMATERIAL9,*LPD3DMATERIAL9;

假如现在有一个红色的球体,我们想让他只去反射红色的光,应该向下面这样定义:

D3DMATERIAL9 red;
::ZeroMemory(&red, sizeof(red));
red.Diffuse  = D3DXCOLOR(1.0f, 0.0f, 0.0f, 1.0f
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值