资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,Copyright 2008 By,Neusoft,Group.All rights reserved,专题,3,绘制带有纹理的立方体,抛砖引玉,Copyright 2008 By,Neusoft,Group.All rights reserved,抛砖引玉,Copyright 2008 By,Neusoft,Group.All rights reserved,专题,3,绘制带有纹理的立方体,学习目标:,掌握如何设置光源,控制光照,理解物体材质作用及如何进行材质的设置,熟悉如何对简单几何物体实现纹理帖图,掌握如何实现多重纹理,Copyright 2008 By,Neusoft,Group.All rights reserved,Copyright 2008 By,Neusoft,Group.All rights reserved,光照与材质,基本纹理绘制,特殊纹理渲染,专题授课要点,灯光的组成,在,Direct3D,灯光模型中,灯光是通过灯光模型的三个成员之一来照射的,-,即有三种灯光,.,环境光,(Ambient Light),:,是经其他表面反射到达物体表面,并照亮整个场景。这时物体并不处于光源的直接照射下,照亮物体的光是其他物体反射到该物体上的光线。光线经过多次折射后看起来就像是来自四面八方一样,,这种光不依赖于光源的位置,。,Copyright 2008 By,Neusoft,Group.All rights reserved,灯光的组成,漫射光,(Diffuse Light):,有特定的传播方向,但当它到达某一表面时,将沿着各个方向均匀反射。这种光无论从哪个方位观察,表面亮度均相同,所以无须考虑,观察者的位置,,仅需考虑,光传播的方向,以及,表面的朝向,。从一个光源发出的光一般都是这种类型的。,Copyright 2008 By,Neusoft,Group.All rights reserved,粗糙表面上每一个小区域内,都有大量的朝各个方向的小,的表面,因此光线是朝向任,意方向均匀反射出去的。,灯光的组成,镜面光,(,Specular,Light),:,用于显示物体表面(光滑和光泽表面)的高光效果,,有特定的传播方向,。但当它到达一个表面时,将严格的沿着另一个方向反射。是只能在一定的角度范围内才能观察到的高亮度照射。因为光照均沿着同一个方向反射,所以不仅要考虑光,的入射方向,和,表面的朝向,,还需要考虑,观察者的位置,。,Copyright 2008 By,Neusoft,Group.All rights reserved,灯光的组成小结,镜面反射光与其他类型的光相比,计算量要大很多,所以,Direct3D,为其提供了开关选项,默认状态下,,Direct3D,不进行镜面反射计算。可采用下面的方法启用:,SetRenderState(D3DRS_SPECULARENABLE,true);,Copyright 2008 By,Neusoft,Group.All rights reserved,灯光的组成小结,每种类型的光都是通过,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,材质的概念,在现实世界中,我们所观察到的物体的颜色是由该物体所,反射,的光的颜色决定的。如:一个纯红色的球体反射了全部的红色入射光,并吸收了所有非红色的光,所以该球体呈现为红色。,在,Direct3D,中,通过定义物体的,材质,(materials),来模拟这样的现象。,材质允许我们定义物体表面对各种颜色光的反射比例。,Copyright 2008 By,Neusoft,Group.All rights reserved,材质,材质结构体,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;,材质,问题:得到一个红色的球。,思路,:,定义球的,材质,为只反射红光而吸收所有其他颜色的光:,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;,材质的实现方法总结,第,1,步,:,设置物体的反光性,即分别设置物体对环境光,、,漫射光,、,镜面反射光的反射性,.,以及物体本身的发光性,物体的反射系数,.,第,2,步,:,Direct3D,设备接口调用,SetMaterial,函数实现对物体材质的设置,.,Copyright 2008 By,Neusoft,Group.All rights reserved,效果展示,点光源,Copyright 2008 By,Neusoft,Group.All rights reserved,效果展示,方向光,Copyright 2008 By,Neusoft,Group.All rights reserved,效果展示,聚光灯,Copyright 2008 By,Neusoft,Group.All rights reserved,结果分析,.,第幅中有高亮,.,第幅中光均匀分布,.,第幅中有未接受到光部分,Copyright 2008 By,Neusoft,Group.All rights reserved,光源,Direct3D,支持,3,种类型的光源:,点光源,(Point lights),:,处于世界坐标系中固有的位置,向,所有的方向,发射光线。,Copyright 2008 By,Neusoft,Group.All rights reserved,光线的作用范围半径,沿光线方向,光强度逐渐衰减,光源,方向光,(Directional lights),:,没有位置信息,,所发射的光线相互平行地沿,某一特定方向,传播。,Copyright 2008 By,Neusoft,Group.All rights reserved,光强不随距离而衰减,光源,聚光灯,(Spot lights),:,与手电筒类似,,有位置信息,,发出的光在,特定方向,上按照圆锥形照射。该锥形可用两个角度:和 来描述。角描述了内部锥形,描述了外部锥形。,Copyright 2008 By,Neusoft,Group.All rights reserved,Attenuation,衰减,光源的设置,1.,点光源的设置,点光源的特点,:,光线来源于一固定点,设定点光源时应该设置光源位置与光源,2.,方向光的设置,方向光的特点,:,没有位置信息,平行地沿某一特定方向传播,设定方向光时应该设置方向与光源,3.,聚光灯的设置,聚光灯的特点,:,有位置信息,发出的光在特定方向上按照圆锥形照射。,设定聚光灯时应该设置光源位置光源方向与光源,Copyright 2008 By,Neusoft,Group.All rights reserved,常见问题,光照计算是对每个顶点进行的,所以,Direct3D,需要知道表面在每个顶点处的局部朝向(法线方向),从而确定光线到达表面时候的入射角,.,Copyright 2008 By,Neusoft,Group.All rights reserved,顶点法线和面法线是不相同,面法线,顶点法线,顶点的法向量的计算,思路,:,已知三角形的三个顶点坐标,P0,P1,P2,,求三角形面的法向量。,Copyright 2008 By,Neusoft,Group.All rights reserved,n,P2,P0,P1,P1,P0,u,P2,P0,v,则可以得到面法线为:,n,uv,顶点的法向量的计算,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);,下面的函数通过三角形的三个顶点计算三角形的面法线。注意这个函数的三个顶点是按照顺时针方向指定的。,顶点的法向量的计算,Copyright 2008 By,Neusoft,Group.All rights reserved,求出共享顶点,P0,的所有平面的法向量,取其和。,n,n1+n2+,nt,(,共,t,个面共享,P0),规范化顶点的法向量。,SetRenderState(D3DRS_NORMALIZENORMALS,true);,注意,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),注意:在这里不需要表示顶点的颜色了,顶点的颜色是由光照和材质来计算,出来的,所以我们需要在这里加上顶点的法向量成员。,实例,:,用聚光灯照射一个立方体,Copyright 2008 By,Neusoft,Group.All rights reserved,步骤,:,1.,创建立方体,2.,设置立方体的材质,3.,设置,聚光灯,实例,:,用聚光灯照射一个立方体,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);,实例,:,用聚光灯照射一个立方体,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);,实例,:,用聚光灯照射一个立方体,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;,注意,Copyright 2008 By,Neusoft,Group.All rights reserved,完成后需要在绘制的时候调用,SetMaterial,函数将前面设置材质信息导入,.,需要打开光照,.,g_pD3DDevice-SetLight(0,g_pD3DDevice-LightEnable(0,true);,课堂练习,Copyright 2008 By,Neusoft,Group.All rights reserved,实现利用点光源照射一个几何体,(,注意点光源需要哪些,),课后作业,Copyright 2008 By,Neusoft,Group.All rights reserved,实现利用方向光源照射一个物体,(,几何体形状自己设计,),纹理,所谓纹理,就是一张用来表示物体表面细节的二维位图,.,Copyright 2008 By,Neusoft,Group.All rights reserved,纹理坐标,Direct3D,中,纹理坐标系(纹理空间)由水平方向的,u,轴和沿垂直方向的,v,轴构成。,由,(,u,v,),坐标对决定纹理上的元素,它被叫做,texel,(纹理元,/,纹素)。,Direct3D,将纹理坐标进,行了规范化处理,以处,理不同尺寸的纹理,将,纹理坐标的范围都限制,在,0,,,1,以内。,Copyright 2008 By,Neusoft,Group.All rights reserved,纹理绘制步骤,第步,:,创建并启用纹理,通常使用,D3DXCreateTextureFromFile,或者,D3DXCreateTextureFromFileEx,函数来实现,Copyright 2008 By,Neusoft,Group.All rights reserved,纹理绘制步骤,第,2,步,:,设定纹理过滤器,Direct3D,提供了三种不同的过滤器;每种都提供了一个不同的品质级别。越好的品质越慢,因此你必须在品质与速度之间取得一个平衡。纹理过滤器是用,IDirect3DDevice9:,SetSamplerState,方法来设置的。,Copyright 2008 By,Neusoft,Group.All rights reserved,HRESULT,SetSamplerState,(,DWORD,Sampler,/,取样阶段索引,D3DSAMPLERSTATETYPE,Type,/,取样状态类型,DWORD,Value,/,取样值,由,type,决定,);,纹理绘制步骤,第,3,步,:,设置当前纹理,使用,SetTexture,方法:,Copyright 2008 By,Neusoft,Group.All rights reserved,HRESULT IDirect3DDevice9:,SetTexture,(,DWORD Stage,/,0-7,的值用于标识纹理等级,现在我们取,0,IDirect3DBaseTexture9*,pTexture,/,要,设置纹理的指针,);,注意,我们在定义顶点结构体的时候,如果需要实现纹理映射,就在结构体中定义相应的数据成员。,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),的标记,表示顶点结构中包含了一,对纹理坐标。这样,我们在定义构成三角形的三个顶点时候,在纹理坐标系中也定义了一个相,应的纹理三角形。纹理映射是在光栅化阶段进行的。,关键程序代码,Copyright 2008 By,Neusoft,Group.All rights reserved,第,1,步,:,创建纹理并导入,D3DXCreateTextureFromFile(g_pD3DDevice,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);,实例,:,为一个立方体贴纹理,Copyright 2008 By,Neusoft,Group.All rights reserved,实现如下效果,:,多重纹理,(,Multitexturing,),多次渲染:,分多次将多张纹理映射到同一个多边形上。,多重纹理:,将多张纹理在一次渲染中映射到同一个多边形上。多重纹理比多次渲染更快一些,但是它需要显卡的支持。,多重纹理只渲染一次,而在渲染之前通过调用,SetTexture,和,SetTextureStageState,函数来对不同的纹理进行混合,这个过程就叫做纹理混合,(texture blending),。每个纹理阶段的结果都会传递到下一个阶段,最后一个阶段的结果被光栅化到多边形上。,Copyright 2008 By,Neusoft,Group.All rights reserved,多重纹理的设置,对每个顶点使用两组纹理坐标,第一张纹理使用第一组纹理坐标,第二张纹理使用第二组纹理坐标。,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,多重纹理的应用实例,黑暗映射,(Dark Mapping),将两张纹理的颜色相乘。这种类型的多重纹理之所以称为“黑暗映射”是因为最终结果中未受到光照的图素比原图中的图素更暗。,Copyright 2008 By,Neusoft,Group.All rights reserved,实现代码,设置发光映射:,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,多重纹理课堂练习,实现发光映射,(Glow Mapping),将两张纹理颜色相加,。,实现的效果就是使物体的某一部分自己发光。这种效果不是材质的,Emissive,,因为,Emissive,只能使整个物体看起来都在发光,.,Copyright 2008 By,Neusoft,Group.All rights reserved,多重纹理课后作业,细节映射,(Detail Mapping),采用一张细节纹理,将基础纹理和细节纹理做,addsigned,操作,可以模拟粗糙的表面细节。,Copyright 2008 By,Neusoft,Group.All rights reserved,多重纹理课后作业,实现带细节纹理的正方体,:(,效果如下图所示,),Copyright 2008 By,Neusoft,Group.All rights reserved,它山之石,课下可选阅读材料,:,第,4,章 第,5,章 第,6,章,第,4,章 第,5,章,第,9,章 第,10,章,Copyright 2008 By,Neusoft,Group.All rights reserved,锦上添花,感兴趣的同学可以下去了解下复杂物体的纹理是如何添加的,.,Copyright 2008 By,Neusoft,Group.All rights reserved,
展开阅读全文