DX灯光与材质
来源:互联网 发布:流程图软件visio2016 编辑:程序博客网 时间:2024/04/28 22:24
因为灯光与材质经常在一起使用,所以一起讲。
一 基本概念
在前面的例程中,通过对顶点颜色进行插值来获取实体表面的颜色,这种简化的计算模型无法如实地反映真实世界。在自然界中,我们所看到的一切都是由光线产生的:光由光源出发,沿直线传播;当光线遇到物体时,一部分被吸收,剩余的被反射,该过程反复进行,直至光线能量耗尽,或者被人眼接收从而产生视觉。
在Direct3D中,用灯光和材质来模拟这个过程。灯光用于照亮实体,可分为环境光(Ambient Light)和直射光(Direct Light):前者均匀充满整个场景,为所有实体提供一个恒定的照明,没有方向性;后者一般由光源产生,具有方向性。材质则定义了实体表面对光线的反射属性。
Direct3D用结构D3DCOLORVALUE描述直射光和材质的颜色,它有4个浮点分量,分别代表红、绿、蓝、Alpha混合,正常取值范围0.0-1.0。其中Alpha混合用来产生透明效果,仅用于材质:0.0表示完全透明;1.0为不透明。
环境光颜色用一个4字节的整数D3DCOLOR描述,每个字节依次代表红、绿、蓝、Alpha混合,取值范围0-255,可以借助宏D3DCOLOR_RGBA来简化计算。和直射光一样,环境光也不使用Alpha混合。
虽然灯光和材质都有颜色,但其含义并不相同。灯光的颜色定义了光线中三原色的“数量”,红=绿=蓝=1.0为白光,都取0.0表示没有光。材质的颜色代表了在光线发生反射时,三原色被反射的“数量”,红=绿=蓝=Alpha=1.0表示所有光线都被反射,也就是说,材质看上去为白色,而红=绿=0.0,蓝=Alpha=1.0则表示只有蓝光被反射,即材质为蓝色。
二 灯光
1 光照计算模型
环境光(Ambient Light):没有方向和光源,但有强度和颜色,且充满整个场景。开启方法:g_pd3dDevice->SetRenderState( D3DRS_AMBIENT, 0x00202020 );
漫反射(Diffuse Light):漫反射是分散的,但又方向
镜面反射(Specular Light ):它是相对于漫射光来说的,它根本不会分散,你可以用它在对象上创建高亮
2 光的类型
点光源:电光源的一个很好的例子就是灯泡,它没有方向(因为向全部方向发出),但是有颜色、范围和衰减
平行光:直射光具有颜色,没有位置。举个例子应该是太阳,场景里的所有对象都会从同样的方向接收到同样的光,直射光也没有范围和衰减。
聚和光:手电筒是聚光灯的好例子,它具有位置、方向、范围、发光内径和发光外径属性,光照强度还会随距离而衰减
注意:光照计算模型和光的类型是不同的两个概念
3 设置灯光
- typedef struct _D3DLIGHT9 {
- D3DLIGHTTYPE Type; //类型:只能是点光源、平行光或聚光灯
- D3DCOLORVALUE Diffuse; //灯光的漫反射颜色
- D3DCOLORVALUE Specular; //灯光的镜面反射颜色
- D3DCOLORVALUE Ambient; //灯光的环境光颜色
- D3DVECTOR Position; //光源在世界坐标系的位置
- D3DVECTOR Direction; //灯光的方向,建议使用单位矢量
- float Range; //灯光的作用范围
- float Falloff; //聚光灯内核到外核的衰减系数,通常取1.0,表示均匀过渡
- float Attenuation0; //距离衰减系数之一:通常取0.0
- float Attenuation1; //距离衰减系数之二:通常取一个大于0的常数
- float Attenuation2; //距离衰减系数之三:通常取0.0
- float Theta; //聚光灯的内核大小
- float Phi; //聚光灯的外核大小
- } D3DLIGHT9;
例:
- D3DXVECTOR3 vecDir;
- D3DLIGHT9 light;
- ZeroMemory( &light, sizeof(D3DLIGHT9) );
- light.Type = D3DLIGHT_DIRECTIONAL;
- light.Diffuse.r = 1.0f;
- light.Diffuse.g = 1.0f;
- light.Diffuse.b = 1.0f;
- vecDir = D3DXVECTOR3(cosf(timeGetTime()/350.0f),
- 1.0f,
- sinf(timeGetTime()/350.0f) );
- D3DXVec3Normalize( (D3DXVECTOR3*)&light.Direction, &vecDir );
- light.Range = 1000.0f;
- g_pd3dDevice->SetLight( 0, &light );
- g_pd3dDevice->LightEnable( 0, TRUE );
三 材质
前面已经提过,材质用于描述实体的反光性能,Direct3D使用结构D3DMATERIAL9保存材质,它有如下成员:
typedef struct _D3DMATERIAL9 {
D3DCOLORVALUE Diffuse; //材质的漫反射颜色
D3DCOLORVALUE Ambient; //材质的环境光颜色
D3DCOLORVALUE Specular; //材质的镜面反射颜色
D3DCOLORVALUE Emissive; //材质的发射颜色
float Power; //材质的镜面反射强度
} D3DMATERIAL9;
漫反射颜色定义了材质对灯光中漫反射分量的反射性能,环境光颜色定义了材质对环境光照的反射性能,这二者结合在一起,决定了实体的外观颜色。在编程中,它们通常取相同的值。
例:
- D3DMATERIAL9 mtrl;
- ZeroMemory( &mtrl, sizeof(D3DMATERIAL9) );
- mtrl.Diffuse.r = mtrl.Ambient.r = 1.0f;
- mtrl.Diffuse.g = mtrl.Ambient.g = 1.0f;
- mtrl.Diffuse.b = mtrl.Ambient.b = 0.0f;
- mtrl.Diffuse.a = mtrl.Ambient.a = 1.0f;
- g_pd3dDevice->SetMaterial( &mtrl );
上面表示RG两种颜色会被完全反射出去。
- DX灯光与材质
- DX中灯光和材质续
- d3d设置材质与灯光
- 3DS MAX材质与灯光
- 3DS MAX材质与灯光
- 关于OpenGL ES中灯光与材质的疑惑
- d3d灯光 材质
- D3D 材质和灯光
- 纹理灯光材质关系
- XNA入门(三)灯光和材质
- DirectX 3D灯光和材质
- 材质与材质脚本
- 灯光+材质反射=效果 0714DirectX学习笔记
- 游戏框架其九:灯光和材质( Lights and Material )
- Unity3D之入门 (灯光 材质 预制体)
- 70部MAYA灯光材质渲染教程合集
- Ogre 材质与材质脚本
- 灯光
- ASP.NET MVC 入门1、简介
- 关于窗口
- 神经网络入门连载之三
- 一个理解wait()与notify()的例子
- variant_t与_bstr_t
- DX灯光与材质
- JAD作为Eclipse反编译插件
- IEEE745浮点数格式
- MyEclipse下配置heritrix 1.12.1步骤
- SAP 系统中图标代码的查找
- 多少錢你肯出賣感情?
- 选择法排序
- MyEclipse自动提示功能的开启
- API8108A API8208A 一次性编程语音系列 下载软件