绘制带有纹理的立方体

上传人:dja****22 文档编号:243369144 上传时间:2024-09-21 格式:PPT 页数:51 大小:1.41MB
返回 下载 相关 举报
绘制带有纹理的立方体_第1页
第1页 / 共51页
绘制带有纹理的立方体_第2页
第2页 / 共51页
绘制带有纹理的立方体_第3页
第3页 / 共51页
点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,Copyright 2008 By Neusoft Group. All rights reserved,专题3 绘制带有纹理的立方体,1,抛砖引玉,Copyright 2008 By Neusoft Group. All rights reserved,2,抛砖引玉,Copyright 2008 By Neusoft Group. All rights reserved,3,专题3 绘制带有纹理的立方体,学习目标:,掌握如何设置光源,控制光照,理解物体材质作用及如何进行材质的设置,熟悉如何对简单几何物体实现纹理帖图,掌握如何实现多重纹理,Copyright 2008 By Neusoft Group. All rights reserved,4,Copyright 2008 By Neusoft Group. All rights reserved,光照与材质,基本纹理绘制,特殊纹理渲染,专题授课要点,5,灯光的组成,在Direct3D灯光模型中,灯光是通过灯光模型的三个成员之一来照射的-即有三种灯光.,环境光(Ambient Light):,是经其他表面反射到达物体表面,并照亮整个场景。这时物体并不处于光源的直接照射下,照亮物体的光是其他物体反射到该物体上的光线。光线经过多次折射后看起来就像是来自四面八方一样,,这种光不依赖于光源的位置,。,Copyright 2008 By Neusoft Group. All rights reserved,6,灯光的组成,漫射光(Diffuse Light):,有特定的传播方向,但当它到达某一表面时,将沿着各个方向均匀反射。这种光无论从哪个方位观察,表面亮度均相同,所以无须考虑,观察者的位置,,仅需考虑,光传播的方向,以及,表面的朝向,。从一个光源发出的光一般都是这种类型的。,Copyright 2008 By Neusoft Group. All rights reserved,粗糙表面上每一个小区域内,都有大量的朝各个方向的小,的表面,因此光线是朝向任,意方向均匀反射出去的。,7,灯光的组成,镜面光(Specular Light):,用于显示物体表面(光滑和光泽表面)的高光效果,,有特定的传播方向,。但当它到达一个表面时,将严格的沿着另一个方向反射。是只能在一定的角度范围内才能观察到的高亮度照射。因为光照均沿着同一个方向反射,所以不仅要考虑光,的入射方向,和,表面的朝向,,还需要考虑,观察者的位置,。,Copyright 2008 By Neusoft Group. All rights reserved,8,灯光的组成小结,镜面反射光与其他类型的光相比,计算量要大很多 ,所以Direct3D为其提供了开关选项,默认状态下,Direct3D不进行镜面反射计算。可采用下面的方法启用:,SetRenderState(D3DRS_SPECULARENABLE, true);,Copyright 2008 By Neusoft Group. All rights reserved,9,灯光的组成小结,每种类型的光都是通过D3DCOLORVALUE结构或者D3DXCOLOR来描绘,表示光照的颜色。,D3DXCOLOR 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,材质的概念,在现实世界中,我们所观察到的物体的颜色是由该物体所,反射,的光的颜色决定的。如:一个纯红色的球体反射了全部的红色入射光,并吸收了所有非红色的光,所以该球体呈现为红色。,在Direct3D中,通过定义物体的,材质,(materials)来模拟这样的现象。,材质允许我们定义物体表面对各种颜色光的反射比例。,Copyright 2008 By Neusoft Group. All rights reserved,11,材质,材质结构体,D3DMATERIAL9,的定义:,Copyright 2008 By Neusoft Group. All rights reserved,typedef struct,D3DMATERIAL9,D3DCOLORVALUE Diffuse;,/指定表面对漫射光的反射率,D3DCOLORVALUE Ambient;,/指定表面对环境光的反射率,D3DCOLORVALUE Specular;,/指定表面对镜面光的反射率,D3DCOLORVALUE Emissive;,/指定物体的自发光亮度,float Power;,/指定镜面高光点的锐度(sharpness), D3DMATERIAL9, *LPD3DMATERIAL9;,12,材质,问题:得到一个红色的球。,思路: 定义球的,材质,为只反射红光而吸收所有其他颜色的光:,Copyright 2008 By Neusoft Group. All rights reserved,D3DMATERIAL9 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);,/ 无自发光,red.Power = 5.0f;,13,材质的实现方法总结,第1步:设置物体的反光性,即分别设置物体对环境光,、,漫射光,、,镜面反射光的反射性.以及物体本身的发光性,物体的反射系数.,第2步:,Direct3D,设备接口调用SetMaterial函数实现对物体材质的设置.,Copyright 2008 By Neusoft Group. All rights reserved,14,效果展示,点光源,Copyright 2008 By Neusoft Group. All rights reserved,15,效果展示,方向光,Copyright 2008 By Neusoft Group. All rights reserved,16,效果展示,聚光灯,Copyright 2008 By Neusoft Group. All rights reserved,17,结果分析,.第幅中有高亮,.第幅中光均匀分布,.第幅中有未接受到光部分,Copyright 2008 By Neusoft Group. All rights reserved,18,光源,Direct3D支持3种类型的光源:,点光源(Point lights):,处于世界坐标系中固有的位置,向,所有的方向,发射光线。,Copyright 2008 By Neusoft Group. All rights reserved,光线的作用范围半径,沿光线方向,光强度逐渐衰减,19,光源,方向光(Directional lights):,没有位置信息,,所发射的光线相互平行地沿,某一特定方向,传播。,Copyright 2008 By Neusoft Group. All rights reserved,光强不随距离而衰减,20,光源,聚光灯(Spot lights):,与手电筒类似,,有位置信息,,发出的光在,特定方向,上按照圆锥形照射。该锥形可用两个角度: 和 来描述。角描述了内部锥形, 描述了外部锥形。,Copyright 2008 By Neusoft Group. All rights reserved,Attenuation衰减,21,光源的设置,1.点光源的设置,点光源的特点:光线来源于一固定点,设定点光源时应该设置光源位置与光源,2.方向光的设置,方向光的特点:没有位置信息,平行地沿某一特定方向传播,设定方向光时应该设置方向与光源,3.聚光灯的设置,聚光灯的特点:有位置信息,发出的光在特定方向上按照圆锥形照射。,设定聚光灯时应该设置光源位置光源方向与光源,Copyright 2008 By Neusoft Group. All rights reserved,22,常见问题,光照计算是对每个顶点进行的,所以Direct3D需要知道表面在每个顶点处的局部朝向(法线方向),从而确定光线到达表面时候的入射角.,Copyright 2008 By Neusoft Group. All rights reserved,顶点法线和面法线是不相同,面法线,顶点法线,23,顶点的法向量的计算,思路:,已知三角形的三个顶点坐标P0,P1,P2,求三角形面的法向量。,Copyright 2008 By Neusoft Group. All rights reserved,n,P2,P0,P1,P1P0u,P2P0v,则可以得到面法线为:,nuv,24,顶点的法向量的计算,Copyright 2008 By Neusoft Group. All rights reserved,void,ComputeNormal(D3DXVECTOR3* p0,D3DXVECTOR3* p1,D3DXVECTOR3* p2,D3DXVECTOR3* out),D3DXVECTOR3 u = *p1 - *p0;,D3DXVECTOR3 v = *p2 - *p0;,D3DXVec3Cross(out, ,D3DXVec3Normalize(out, out);,下面的函数通过三角形的三个顶点计算三角形的面法线。注意这个函数的三个顶点是按照顺时针方向指定的。,25,顶点的法向量的计算,Copyright 2008 By Neusoft Group. All rights reserved,求出共享顶点P0的所有平面的法向量,取其和。 nn1+n2+nt (共t个面共享P0)规范化顶点的法向量。,SetRenderState(D3DRS_NORMALIZENORMALS, true);,26,注意,Copyright 2008 By Neusoft Group. All rights reserved,我们在定义顶点结构体的时候,如果需要用到顶点的法线信息,就在结构体中定义相应的数据成员。,struct,Vertex,float,_x, _y, _z;,float,_nx, _ny, _nz;,#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ | D3DFVF_NORMAL),注意:在这里不需要表示顶点的颜色了,顶点的颜色是由光照和材质来计算,出来的,所以我们需要在这里加上顶点的法向量成员。,27,实例:用聚光灯照射一个立方体,Copyright 2008 By Neusoft Group. All rights reserved,步骤:,1.创建立方体,2.设置立方体的材质,3.设置聚光灯,28,实例:用聚光灯照射一个立方体,Copyright 2008 By Neusoft Group. All 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_XRGB(255,0,0),D3DCOLOR_XRGB(255,0,0),D3DCOLOR_XRGB(255,0,0),D3DCOLOR_XRGB(0,0,0),2.0f);,29,实例:用聚光灯照射一个立方体,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步:设置聚光灯的光源,D3DXCOLOR c = D3DCOLOR_XRGB(255,255,255);,30,实例:用聚光灯照射一个立方体,Copyright 2008 By Neusoft Group. All rights reserved,步骤:,第4步:封装初始化聚光灯函数:,D3DLIGHT9 InitSpotLight(D3DXVECTOR3* position, D3DXVECTOR3* direction, D3DXCOLOR* color),D3DLIGHT9 light;,:ZeroMemory(,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 = 0.4f;,light.Phi = 0.9f;,return light;,31,注意,Copyright 2008 By Neusoft Group. All rights reserved,完成后需要在绘制的时候调用,SetMaterial函数将前面设置材质信息导入.,需要打开光照.,g_pD3DDevice-SetLight(0, ,g_pD3DDevice-LightEnable(0, true);,32,课堂练习,Copyright 2008 By Neusoft Group. All rights reserved,实现利用点光源照射一个几何体(注意点光源需要哪些),33,课后作业,Copyright 2008 By Neusoft Group. All rights reserved,实现利用方向光源照射一个物体(几何体形状自己设计),34,纹理,所谓纹理,就是一张用来表示物体表面细节的二维位图.,Copyright 2008 By Neusoft Group. All rights reserved,35,纹理坐标,Direct3D中,纹理坐标系(纹理空间)由水平方向的u轴和沿垂直方向的v轴构成。,由(,u,v),坐标对决定纹理上的元素,它被叫做,texel,(纹理元/纹素)。,Direct3D将纹理坐标进,行了规范化处理,以处,理不同尺寸的纹理,将,纹理坐标的范围都限制,在,0,1,以内。,Copyright 2008 By Neusoft Group. All rights reserved,36,纹理绘制步骤,第步:创建并启用纹理,通常使用,D3DXCreateTextureFromFile,或者,D3DXCreateTextureFromFileEx,函数来实现,Copyright 2008 By Neusoft Group. All rights reserved,37,纹理绘制步骤,第2步:设定纹理过滤器,Direct3D提供了三种不同的过滤器;每种都提供了一个不同的品质级别。越好的品质越慢,因此你必须在品质与速度之间取得一个平衡。纹理过滤器是用IDirect3DDevice9:,SetSamplerState,方法来设置的。,Copyright 2008 By Neusoft Group. All rights reserved,HRESULT,SetSamplerState,(,DWORD,Sampler,/取样阶段索引,D3DSAMPLERSTATETYPE,Type,/取样状态类型,DWORD,Value,/取样值,由type决定,);,38,纹理绘制步骤,第3步:设置当前纹理,使用SetTexture方法:,Copyright 2008 By Neusoft Group. All rights reserved,HRESULT IDirect3DDevice9:,SetTexture,(,DWORD Stage,/,0-7,的值用于标识纹理等级,现在我们取0,IDirect3DBaseTexture9* pTexture,/,要设置纹理的指针,);,39,注意,我们在定义顶点结构体的时候,如果需要实现纹理映射,就在结构体中定义相应的数据成员。,Copyright 2008 By Neusoft Group. All rights reserved,struct,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_TEX1;,注:在灵活顶点标记处增加了一个,D3DFVF_TEX1(18),的标记,表示顶点结构中包含了一,对纹理坐标。这样,我们在定义构成三角形的三个顶点时候,在纹理坐标系中也定义了一个相,应的纹理三角形。纹理映射是在光栅化阶段进行的。,40,关键程序代码,Copyright 2008 By Neusoft Group. All rights reserved,第1步:创建纹理并导入,D3DXCreateTextureFrom,1.jpg,第2步:设定纹理过滤器,g_pD3DDevice-SetSamplerState(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,实例:为一个立方体贴纹理,Copyright 2008 By Neusoft Group. All rights reserved,实现如下效果:,42,多重纹理(Multitexturing),多次渲染:,分多次将多张纹理映射到同一个多边形上。,多重纹理:,将多张纹理在一次渲染中映射到同一个多边形上。多重纹理比多次渲染更快一些,但是它需要显卡的支持。,多重纹理只渲染一次,而在渲染之前通过调用SetTexture和SetTextureStageState函数来对不同的纹理进行混合,这个过程就叫做纹理混合(texture blending)。每个纹理阶段的结果都会传递到下一个阶段,最后一个阶段的结果被光栅化到多边形上。,Copyright 2008 By Neusoft Group. All rights reserved,43,多重纹理的设置,对每个顶点使用两组纹理坐标,第一张纹理使用第一组纹理坐标,第二张纹理使用第二组纹理坐标。,Device-SetTexture(0, tex0);,Device-SetTextureStageState(,0, D3DTSS_TEXCOORDINDEX,0,);,Device-SetTexture(1, tex1);,Device-SetTextureStageState(,1, D3DTSS_TEXCOORDINDEX,1,);,当然,也可以重复使用一组纹理坐标:,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,多重纹理的应用实例,黑暗映射(Dark Mapping),将两张纹理的颜色相乘。这种类型的多重纹理之所以称为“黑暗映射”是因为最终结果中未受到光照的图素比原图中的图素更暗。,Copyright 2008 By Neusoft Group. All rights reserved,45,实现代码,设置发光映射:,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); / 使用当前颜色作为第一个texture stage的输出,/ 设置发光纹理贴图,g_pD3DDevice-SetTexture(1, m_pTexture2);,g_pD3DDevice-SetTextureStageState(1, D3DTSS_TEXCOORDINDEX, 0);,g_pD3DDevice-SetTextureStageState(1, D3DTSS_COLORARG1, D3DTA_TEXTURE);,g_pD3DDevice-SetTextureStageState(1, D3DTSS_COLORARG2, D3DTA_CURRENT);/ 颜色来源-前一个texture stage,g_pD3DDevice-SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_ADD);,Copyright 2008 By Neusoft Group. All rights reserved,46,多重纹理课堂练习,实现发光映射(Glow Mapping),将两张纹理颜色相加,。,实现的效果就是使物体的某一部分自己发光。这种效果不是材质的Emissive,因为Emissive只能使整个物体看起来都在发光.,Copyright 2008 By Neusoft Group. All rights reserved,47,多重纹理课后作业,细节映射(Detail Mapping),采用一张细节纹理,将基础纹理和细节纹理做addsigned操作,可以模拟粗糙的表面细节。,Copyright 2008 By Neusoft Group. All rights reserved,48,多重纹理课后作业,实现带细节纹理的正方体,:(效果如下图所示),Copyright 2008 By Neusoft Group. All rights reserved,49,它山之石,课下可选阅读材料:,第4章 第5章 第6章, 第4章 第5章, 第9章 第10章,Copyright 2008 By Neusoft Group. All rights reserved,50,锦上添花,感兴趣的同学可以下去了解下复杂物体的纹理是如何添加的.,Copyright 2008 By Neusoft Group. All rights reserved,51,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 大学资料


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!