绘制带有纹理的立方体_第1页
绘制带有纹理的立方体_第2页
绘制带有纹理的立方体_第3页
绘制带有纹理的立方体_第4页
绘制带有纹理的立方体_第5页
已阅读5页,还剩46页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、绘制带有纹理的立方体第1页,共51页,2022年,5月20日,19点34分,星期二抛砖引玉Copyright 2008 By Neusoft Group. All rights reserved第2页,共51页,2022年,5月20日,19点34分,星期二抛砖引玉Copyright 2008 By Neusoft Group. All rights reserved第3页,共51页,2022年,5月20日,19点34分,星期二专题3 绘制带有纹理的立方体学习目标:掌握如何设置光源,控制光照理解物体材质作用及如何进行材质的设置熟悉如何对简单几何物体实现纹理帖图掌握如何实现多重纹理 Copyrig

2、ht 2008 By Neusoft Group. All rights reserved第4页,共51页,2022年,5月20日,19点34分,星期二Copyright 2008 By Neusoft Group. All rights reserved光照与材质基本纹理绘制特殊纹理渲染专题授课要点第5页,共51页,2022年,5月20日,19点34分,星期二灯光的组成在Direct3D灯光模型中,灯光是通过灯光模型的三个成员之一来照射的-即有三种灯光.环境光(Ambient Light):是经其他表面反射到达物体表面,并照亮整个场景。这时物体并不处于光源的直接照射下,照亮物体的光是其他物体

3、反射到该物体上的光线。光线经过多次折射后看起来就像是来自四面八方一样,这种光不依赖于光源的位置。Copyright 2008 By Neusoft Group. All rights reserved第6页,共51页,2022年,5月20日,19点34分,星期二灯光的组成 漫射光(Diffuse Light):有特定的传播方向,但当它到达某一表面时,将沿着各个方向均匀反射。这种光无论从哪个方位观察,表面亮度均相同,所以无须考虑观察者的位置,仅需考虑光传播的方向以及表面的朝向。从一个光源发出的光一般都是这种类型的。Copyright 2008 By Neusoft Group. All righ

4、ts reserved粗糙表面上每一个小区域内都有大量的朝各个方向的小的表面,因此光线是朝向任意方向均匀反射出去的。第7页,共51页,2022年,5月20日,19点34分,星期二灯光的组成 镜面光(Specular Light):用于显示物体表面(光滑和光泽表面)的高光效果,有特定的传播方向。但当它到达一个表面时,将严格的沿着另一个方向反射。是只能在一定的角度范围内才能观察到的高亮度照射。因为光照均沿着同一个方向反射,所以不仅要考虑光的入射方向和表面的朝向,还需要考虑观察者的位置。Copyright 2008 By Neusoft Group. All rights reserved第8页,共

5、51页,2022年,5月20日,19点34分,星期二灯光的组成小结 镜面反射光与其他类型的光相比,计算量要大很多 ,所以Direct3D为其提供了开关选项,默认状态下,Direct3D不进行镜面反射计算。可采用下面的方法启用: SetRenderState(D3DRS_SPECULARENABLE, true);Copyright 2008 By Neusoft Group. All rights reserved第9页,共51页,2022年,5月20日,19点34分,星期二灯光的组成小结 每种类型的光都是通过D3DCOLORVALUE结构或者D3DXCOLOR来描绘,表示光照的颜色。 D3D

6、XCOLOR redAmbient(1.0f, 0.0f, 0.0f, 1.0f);D3DXCOLOR blueDiffuse(0.0f, 0.0f, 1.0f, 1.0f);D3DXCOLOR whiteSpecular(1.0f, 1.0f, 1.0f, 1.0f); 注意:1、在D3DXCOLOR类中的alpha值用在描述光线颜色时是被忽略的。 Copyright 2008 By Neusoft Group. All rights reserved第10页,共51页,2022年,5月20日,19点34分,星期二材质的概念 在现实世界中,我们所观察到的物体的颜色是由该物体所反射的光的颜色决

7、定的。如:一个纯红色的球体反射了全部的红色入射光,并吸收了所有非红色的光,所以该球体呈现为红色。 在Direct3D中,通过定义物体的材质(materials)来模拟这样的现象。 材质允许我们定义物体表面对各种颜色光的反射比例。Copyright 2008 By Neusoft Group. All rights reserved第11页,共51页,2022年,5月20日,19点34分,星期二材质材质结构体D3DMATERIAL9的定义:Copyright 2008 By Neusoft Group. All rights reserved typedef struct D3DMATERIAL

8、9 D3DCOLORVALUE Diffuse; /指定表面对漫射光的反射率 D3DCOLORVALUE Ambient; /指定表面对环境光的反射率 D3DCOLORVALUE Specular; /指定表面对镜面光的反射率 D3DCOLORVALUE Emissive; /指定物体的自发光亮度 float Power; /指定镜面高光点的锐度(sharpness) D3DMATERIAL9, *LPD3DMATERIAL9; 第12页,共51页,2022年,5月20日,19点34分,星期二材质问题:得到一个红色的球。思路: 定义球的材质为只反射红光而吸收所有其他颜色的光: Copyrigh

9、t 2008 By Neusoft Group. All rights reservedD3DMATERIAL9 red;:ZeroMemory(&red, sizeof(red);red.Diffuse = D3DXCOLOR(1.0f, 0.0f, 0.0f, 1.0f); /红色red.Ambient = D3DXCOLOR(1.0f, 0.0f, 0.0f, 1.0f); /红色red.Specular = D3DXCOLOR(1.0f, 0.0f, 0.0f, 1.0f); /红色red.Emissive = D3DXCOLOR(0.0f, 0.0f, 0.0f, 1.0f); /

10、无自发光red.Power = 5.0f;第13页,共51页,2022年,5月20日,19点34分,星期二材质的实现方法总结第1步:设置物体的反光性,即分别设置物体对环境光、漫射光、镜面反射光的反射性.以及物体本身的发光性,物体的反射系数.第2步: Direct3D设备接口调用SetMaterial函数实现对物体材质的设置.Copyright 2008 By Neusoft Group. All rights reserved第14页,共51页,2022年,5月20日,19点34分,星期二效果展示点光源Copyright 2008 By Neusoft Group. All rights re

11、served第15页,共51页,2022年,5月20日,19点34分,星期二效果展示方向光Copyright 2008 By Neusoft Group. All rights reserved第16页,共51页,2022年,5月20日,19点34分,星期二效果展示聚光灯Copyright 2008 By Neusoft Group. All rights reserved第17页,共51页,2022年,5月20日,19点34分,星期二结果分析.第幅中有高亮.第幅中光均匀分布.第幅中有未接受到光部分Copyright 2008 By Neusoft Group. All rights rese

12、rved第18页,共51页,2022年,5月20日,19点34分,星期二光源Direct3D支持3种类型的光源:点光源(Point lights):处于世界坐标系中固有的位置,向所有的方向发射光线。Copyright 2008 By Neusoft Group. All rights reserved光线的作用范围半径沿光线方向,光强度逐渐衰减第19页,共51页,2022年,5月20日,19点34分,星期二光源方向光(Directional lights):没有位置信息,所发射的光线相互平行地沿某一特定方向传播。Copyright 2008 By Neusoft Group. All righ

13、ts reserved光强不随距离而衰减第20页,共51页,2022年,5月20日,19点34分,星期二光源聚光灯(Spot lights):与手电筒类似,有位置信息,发出的光在特定方向上按照圆锥形照射。该锥形可用两个角度: 和 来描述。角描述了内部锥形, 描述了外部锥形。Copyright 2008 By Neusoft Group. All rights reservedAttenuation衰减第21页,共51页,2022年,5月20日,19点34分,星期二光源的设置1.点光源的设置点光源的特点:光线来源于一固定点设定点光源时应该设置光源位置与光源2.方向光的设置方向光的特点:没有位置信

14、息,平行地沿某一特定方向传播设定方向光时应该设置方向与光源3.聚光灯的设置聚光灯的特点:有位置信息,发出的光在特定方向上按照圆锥形照射。设定聚光灯时应该设置光源位置光源方向与光源Copyright 2008 By Neusoft Group. All rights reserved第22页,共51页,2022年,5月20日,19点34分,星期二常见问题 光照计算是对每个顶点进行的,所以Direct3D需要知道表面在每个顶点处的局部朝向(法线方向),从而确定光线到达表面时候的入射角.Copyright 2008 By Neusoft Group. All rights reserved顶点法线和

15、面法线是不相同面法线顶点法线第23页,共51页,2022年,5月20日,19点34分,星期二顶点的法向量的计算思路:已知三角形的三个顶点坐标P0,P1,P2,求三角形面的法向量。Copyright 2008 By Neusoft Group. All rights reservednP2P0P1P1P0uP2P0v则可以得到面法线为:nuv第24页,共51页,2022年,5月20日,19点34分,星期二顶点的法向量的计算Copyright 2008 By Neusoft Group. All rights reservedvoid ComputeNormal(D3DXVECTOR3* p0,

16、D3DXVECTOR3* p1, D3DXVECTOR3* p2, D3DXVECTOR3* out)D3DXVECTOR3 u = *p1 - *p0;D3DXVECTOR3 v = *p2 - *p0;D3DXVec3Cross(out, &u, &v);D3DXVec3Normalize(out, out); 下面的函数通过三角形的三个顶点计算三角形的面法线。注意这个函数的三个顶点是按照顺时针方向指定的。第25页,共51页,2022年,5月20日,19点34分,星期二顶点的法向量的计算Copyright 2008 By Neusoft Group. All rights reserved

17、求出共享顶点P0的所有平面的法向量,取其和。 nn1+n2+nt (共t个面共享P0)规范化顶点的法向量。SetRenderState(D3DRS_NORMALIZENORMALS, true);第26页,共51页,2022年,5月20日,19点34分,星期二注意Copyright 2008 By Neusoft Group. All rights reserved 我们在定义顶点结构体的时候,如果需要用到顶点的法线信息,就在结构体中定义相应的数据成员。struct Vertex float _x, _y, _z;float _nx, _ny, _nz;#define D3DFVF_CUSTO

18、MVERTEX (D3DFVF_XYZ | D3DFVF_NORMAL)注意:在这里不需要表示顶点的颜色了,顶点的颜色是由光照和材质来计算出来的,所以我们需要在这里加上顶点的法向量成员。第27页,共51页,2022年,5月20日,19点34分,星期二实例:用聚光灯照射一个立方体Copyright 2008 By Neusoft Group. All rights reserved步骤:1.创建立方体2.设置立方体的材质3.设置聚光灯第28页,共51页,2022年,5月20日,19点34分,星期二实例:用聚光灯照射一个立方体Copyright 2008 By Neusoft Group. All

19、 rights reserved步骤:1.创建立方体(略)2.设置立方体的材质第1步:封装设置材质的函数D3DMATERIAL9 InitMtrl(D3DXCOLOR a, D3DXCOLOR d, D3DXCOLOR s, D3DXCOLOR e, float p)D3DMATERIAL9 mtrl;mtrl.Ambient = a;mtrl.Diffuse = d;mtrl.Specular = s;mtrl.Emissive = e;mtrl.Power = p;return mtrl;第2步:设置立方体材质D3DMATERIAL9 matrl = InitMtrl(D3DCOLOR_X

20、RGB(255,0,0),D3DCOLOR_XRGB(255,0,0),D3DCOLOR_XRGB(255,0,0),D3DCOLOR_XRGB(0,0,0),2.0f);第29页,共51页,2022年,5月20日,19点34分,星期二实例:用聚光灯照射一个立方体Copyright 2008 By Neusoft Group. All rights reserved步骤:3.设置聚光灯第1步:设置聚光灯的位置D3DXVECTOR3 position(0.0f,0.0f,-5.0f);第2步:设置聚光灯的照射的方向D3DXVECTOR3 dir(0.0f, 0.0f, 1.0f);第3步:设置聚

21、光灯的光源D3DXCOLOR c = D3DCOLOR_XRGB(255,255,255);第30页,共51页,2022年,5月20日,19点34分,星期二实例:用聚光灯照射一个立方体Copyright 2008 By Neusoft Group. All rights reserved步骤:第4步:封装初始化聚光灯函数:D3DLIGHT9 InitSpotLight(D3DXVECTOR3* position, D3DXVECTOR3* direction, D3DXCOLOR* color)D3DLIGHT9 light;:ZeroMemory(&light, sizeof(light);

22、light.Type = D3DLIGHT_SPOT;light.Ambient = *color * 0.0f;light.Diffuse = *color;light.Specular = *color * 0.6f;light.Position = *position;light.Direction = *direction;light.Range = 1000.0f;light.Falloff = 1.0f;light.Attenuation0 = 1.0f;light.Attenuation1 = 0.0f;light.Attenuation2 = 0.0f;light.Theta

23、= 0.4f;light.Phi = 0.9f;return light;第31页,共51页,2022年,5月20日,19点34分,星期二注意Copyright 2008 By Neusoft Group. All rights reserved 完成后需要在绘制的时候调用SetMaterial函数将前面设置材质信息导入. 需要打开光照. g_pD3DDevice-SetLight(0, &Spot );g_pD3DDevice-LightEnable(0, true);第32页,共51页,2022年,5月20日,19点34分,星期二课堂练习Copyright 2008 By Neusoft

24、Group. All rights reserved 实现利用点光源照射一个几何体(注意点光源需要哪些)第33页,共51页,2022年,5月20日,19点34分,星期二课后作业Copyright 2008 By Neusoft Group. All rights reserved 实现利用方向光源照射一个物体(几何体形状自己设计)第34页,共51页,2022年,5月20日,19点34分,星期二纹理所谓纹理,就是一张用来表示物体表面细节的二维位图.Copyright 2008 By Neusoft Group. All rights reserved第35页,共51页,2022年,5月20日,1

25、9点34分,星期二纹理坐标Direct3D中,纹理坐标系(纹理空间)由水平方向的u轴和沿垂直方向的v轴构成。由(u,v)坐标对决定纹理上的元素,它被叫做texel(纹理元/纹素)。Direct3D将纹理坐标进 行了规范化处理,以处 理不同尺寸的纹理,将 纹理坐标的范围都限制 在0,1以内。Copyright 2008 By Neusoft Group. All rights reserved第36页,共51页,2022年,5月20日,19点34分,星期二纹理绘制步骤第步:创建并启用纹理通常使用D3DXCreateTextureFromFile或者D3DXCreateTextureFromFil

26、eEx函数来实现Copyright 2008 By Neusoft Group. All rights reserved第37页,共51页,2022年,5月20日,19点34分,星期二纹理绘制步骤第2步:设定纹理过滤器 Direct3D提供了三种不同的过滤器;每种都提供了一个不同的品质级别。越好的品质越慢,因此你必须在品质与速度之间取得一个平衡。纹理过滤器是用IDirect3DDevice9:SetSamplerState方法来设置的。Copyright 2008 By Neusoft Group. All rights reservedHRESULT SetSamplerState( DWO

27、RD Sampler, /取样阶段索引 D3DSAMPLERSTATETYPE Type, /取样状态类型 DWORD Value /取样值,由type决定); 第38页,共51页,2022年,5月20日,19点34分,星期二纹理绘制步骤第3步:设置当前纹理 使用SetTexture方法: Copyright 2008 By Neusoft Group. All rights reservedHRESULT IDirect3DDevice9:SetTexture( DWORD Stage, / 0-7的值用于标识纹理等级,现在我们取0 IDirect3DBaseTexture9* pTextu

28、re / 要设置纹理的指针);第39页,共51页,2022年,5月20日,19点34分,星期二注意 我们在定义顶点结构体的时候,如果需要实现纹理映射,就在结构体中定义相应的数据成员。Copyright 2008 By Neusoft Group. All rights reservedstruct Vertex float _x, _y, _z;float _nx, _ny, _nz;float _u, _v; / 纹理坐标static const DWORD FVF;const DWORD Vertex:FVF = D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_TE

29、X1;注:在灵活顶点标记处增加了一个D3DFVF_TEX1(18)的标记,表示顶点结构中包含了一对纹理坐标。这样,我们在定义构成三角形的三个顶点时候,在纹理坐标系中也定义了一个相应的纹理三角形。纹理映射是在光栅化阶段进行的。第40页,共51页,2022年,5月20日,19点34分,星期二关键程序代码Copyright 2008 By Neusoft Group. All rights reserved第1步:创建纹理并导入D3DXCreateTextureFromFile(g_pD3DDevice,1.jpg,&Tex);第2步:设定纹理过滤器g_pD3DDevice-SetSamplerSt

30、ate(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);g_pD3DDevice-SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);g_pD3DDevice-SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_POINT);第3步:设置当前纹理g_pD3DDevice-SetTexture(0,Tex);第41页,共51页,2022年,5月20日,19点34分,星期二实例:为一个立方体贴纹理Copyright 2008 By Neusoft Group. All rig

31、hts reserved实现如下效果:第42页,共51页,2022年,5月20日,19点34分,星期二多重纹理(Multitexturing)多次渲染:分多次将多张纹理映射到同一个多边形上。多重纹理:将多张纹理在一次渲染中映射到同一个多边形上。多重纹理比多次渲染更快一些,但是它需要显卡的支持。多重纹理只渲染一次,而在渲染之前通过调用SetTexture和SetTextureStageState函数来对不同的纹理进行混合,这个过程就叫做纹理混合(texture blending)。每个纹理阶段的结果都会传递到下一个阶段,最后一个阶段的结果被光栅化到多边形上。Copyright 2008 By N

32、eusoft Group. All rights reserved第43页,共51页,2022年,5月20日,19点34分,星期二多重纹理的设置对每个顶点使用两组纹理坐标,第一张纹理使用第一组纹理坐标,第二张纹理使用第二组纹理坐标。Device-SetTexture(0, tex0);Device-SetTextureStageState(0, D3DTSS_TEXCOORDINDEX, 0); Device-SetTexture(1, tex1);Device-SetTextureStageState(1, D3DTSS_TEXCOORDINDEX, 1); 当然,也可以重复使用一组纹理坐标

33、:Device-SetTexture(0, tex0);Device-SetTextureStageState(0, D3DTSS_TEXCOORDINDEX, 0); Device-SetTexture(1, tex1);Device-SetTextureStageState(1, D3DTSS_TEXCOORDINDEX, 0);Copyright 2008 By Neusoft Group. All rights reserved第44页,共51页,2022年,5月20日,19点34分,星期二多重纹理的应用实例黑暗映射(Dark Mapping)将两张纹理的颜色相乘。这种类型的多重纹理之

34、所以称为“黑暗映射”是因为最终结果中未受到光照的图素比原图中的图素更暗。Copyright 2008 By Neusoft Group. All rights reserved第45页,共51页,2022年,5月20日,19点34分,星期二实现代码设置发光映射: g_pD3DDevice-SetTexture(0, m_pTexture1); g_pD3DDevice-SetTextureStageState(0, D3DTSS_TEXCOORDINDEX, 0); g_pD3DDevice-SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE); g_pD3DDevice-SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1); / 使用当前颜

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论