




已阅读5页,还剩2页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
DirectX中的多重纹理相关技术来源: ogdev 浏览: 28 直到现在我才知道前边讲的所谓黑暗映射之类的是什么东西,其实说白了就是使用多重纹理的一种方式。多重纹理从原则上讲全部可以被多次渲染所替代,因为多重纹理实际上就是将多次渲染中的每遍中的纹理在一遍中进行操作。因此我们首先介绍一下多次渲染,然后概要介绍一下多重纹理的使用方法和实现的效果。一种复杂的效果往往是无法通过单次渲染来完成的,因此多次渲染实际上非常普遍。在shadow volume算法中就要通过多次渲染来实现阴影混合。Hook在siggraph1998中提到Quake3使用了10次渲染:14 累积凹凸贴图(Accumulate bump map)5 漫反射光照(Diffuse lighting)6 基本纹理,具有镜面反射成分7 镜面光照(Specular lighting)8 放射性光照(Emissive lighting)9 体积/大气效果(volumetric/atmosphere effect)10 屏幕显示(screen flash)这对硬件的性能要求非常高,即使再现在来讲对于复杂场景来讲也是不能忍受的。那么为了减少渲染次数,显卡开始支持多重纹理。我们来看一下多次渲染和多重纹理的代码比较。多次渲染:/texture #1m_pd3dDevice-SetTextureStageState(0,D3DTSS_COLORARG1,D3DTA_TEXTURE);m_pd3dDevice-SetTextureStageState(0,D3DTSS_COLOROP,D3DTOP_SELECTARG1);m_pd3dDevice-SetTexture(0,m_pWallTexture);m_pd3dDevice-SetSteamSource(0,m_pCubeVB,0,sizeof(CUBEVERTEXT);m_pd3dDevice-SetFVF(FVF_CUBEVERTEXT);m_pd3dDevice-SetIndices(m_pCubeIB,0);m_pd3dDevice-DrawIndexedPrimitive(D3DPT_TRIANGLELIST,0,24,0,36/3);/texture #2m_pd3dDevice-SetRenderState(D3DRS_ALPHABLENDENABLE,TRUE);m_pd3dDevice-SetRenderState(D3DRS_SRCBLEND,D3DBLEND_ONE);m_pd3dDevice-SetRenderState(D3DRS_DESTBLEND,D3DBLEND_ONE);m_pd3dDevice-SetTexture(0,m_pDetailTexture);m_pd3dDevice-SetSteamSource(0,m_pCubeVB,0,sizeof(CUBEVERTEXT);m_pd3dDevice-SetFVF(FVF_CUBEVERTEXT);m_pd3dDevice-SetIndices(m_pCubeIB);m_pd3dDevice-DrawIndexedPrimitive(D3DPT_TRIANGLELIST,0,24,0,36/3);多重纹理/texture #1m_pd3dDevice-SetTexture(0,m_pWallTexture);m_pd3dDevice-SetTextureStageState(0,D3DTSS_COLORARG1,D3DTA_TEXTURE);m_pd3dDevice-SetTextureStageState(0,D3DTSS_COLOROP,D3DTOP_SELECTARG1);/texture #2m_pd3dDevice-SetTexture(1,m_pDetailTexture);m_pd3dDevice-SetTextureStageState(1,D3DTSS_TEXCOORDINDEX,0);m_pd3dDevice-SetTextureStageState(0,D3DTSS_COLORARG1,D3DTA_TEXTURE);m_pd3dDevice-SetTextureStageState(0,D3DTSS_COLORARG2,D3DTA_CURRENT);m_pd3dDevice-SetSteamSource(0,m_pCubeVB,0,sizeof(CUBEVERTEXT);m_pd3dDevice-SetFVF(FVF_CUBEVERTEXT);m_pd3dDevice-SetIndices(m_pCubeIB);m_pd3dDevice-DrawIndexedPrimitive(D3DPT_TRIANGLELIST,0,24,0,36/3);通过对比可以看到多重纹理只对场景顶点进行了一次绘制,而多次渲染要进行对此绘制。上边代码也基本展示了多重纹理的使用方法:设置每一个纹理阶段的纹理操作参数和操作类型,然后调用顶点绘制即可。在一个纹理阶段有最多三个纹理参数,通过设置的某种操作将结果投入下一个阶段。这样进行多重纹理级联以后的效果如下:具体来说,纹理的操作包括:typedef enum _D3DTEXTUREOP D3DTOP_DISABLE = 1,D3DTOP_SELECTARG1 = 2,D3DTOP_SELECTARG2 = 3,D3DTOP_MODULATE = 4,D3DTOP_MODULATE2X = 5,D3DTOP_MODULATE4X = 6,D3DTOP_ADD = 7,D3DTOP_ADDSIGNED = 8,D3DTOP_ADDSIGNED2X = 9,D3DTOP_SUBTRACT = 10,D3DTOP_ADDSMOOTH = 11,D3DTOP_BLENDDIFFUSEALPHA = 12,D3DTOP_BLENDTEXTUREALPHA = 13,D3DTOP_BLENDFACTORALPHA = 14,D3DTOP_BLENDTEXTUREALPHAPM = 15,D3DTOP_BLENDCURRENTALPHA = 16,D3DTOP_PREMODULATE = 17,D3DTOP_MODULATEALPHA_ADDCOLOR = 18,D3DTOP_MODULATECOLOR_ADDALPHA = 19,D3DTOP_MODULATEINVALPHA_ADDCOLOR = 20,D3DTOP_MODULATEINVCOLOR_ADDALPHA = 21,D3DTOP_BUMPENVMAP = 22,D3DTOP_BUMPENVMAPLUMINANCE = 23,D3DTOP_DOTPRODUCT3 = 24,D3DTOP_MULTIPLYADD = 25,D3DTOP_LERP = 26,D3DTOP_FORCE_DWORD = 0x7fffffff D3DTEXTUREOP; 这里边也包括了alpha混合的操作,都是通过D3DTEXTUREOP来进行设置。对于每个颜色的操作最多有三个参数,也是通过 SetTextureStageState()来设置的,该方法的第一个参数设置了纹理阶段,第二个参数设置了参数序号: D3DTSS_COLORARG0,D3DTSS_COLORARG1,D3DTSS_COLORARG2。第三个参数是参数值:D3DTA_CURRENTD3DTA_DIFFUSED3DTA_SELECTMASKD3DTA_SPECULARD3DTA_TEMPD3DTA_TEXTURED3DTA_TFACTOR分别表示了不同的颜色获取途径。OK,下面我们来看一下几种多重纹理的效果。1,单色纹理贴图一些老的三维加速卡不支持使用目标像素的阿尔法值进行纹理混合,更多信息请参阅阿尔法纹理混合。一般来说这些加速卡也不支持多重纹理混合,如果应用程序在此类适配器上运行,那么可以用多趟纹理混合进行单色光照贴图要进行单色光照贴图,应用程序应该把光照信息存放在光照贴图的阿尔法数据中。应用程序使用Microsoft Direct3D的纹理过滤功能把图元的图像中的每个像素映射到光照贴图中的相应texel。应用程序应该把源混合因子设为相应texel的阿尔法值.以下C+示例代码描述了应用程序如何把一张纹理用作单色光照贴图。/本例假设d3dDevice为指向IDirect3DDevice9接口的有效指针,/且lptexLightMap为指向包含单色光照贴图数据的纹理的有效指针。/把光照贴图设置为当前纹理。d3dDevice-SetTexture(0, lptexLightMap);/设置颜色操作。d3dDevice-SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1);/设置颜色操作的第一个参数。d3dDevice-SetTextureStageState(0, D3DTSS_COLORARG1,D3DTA_TEXTURE | D3DTA_ALPHAREPLICATE);因为不支持目标阿尔法混合的适配器一般来说也不支持多重纹理混合,这个示例把光照贴图设为第一张纹理,而这在所有三维加速卡上都是可用的。示例代码先设置纹理混合层的颜色操作,让纹理数据与图元已有的颜色进行混合,然后选择第一张纹理和图元已有的颜色作为输入数据。2,有色光照贴图如果应用程序使用有色光照贴图,那么通常会渲染得到更具真实感的三维场景。一张有色光照贴图使用RGB数据存放光照信息。以下C+示例代码显示了如何用RGB颜色数据进行光照贴图。/本例假设d3dDevice为指向IDirect3DDevice9接口的有效指针,/且lptexLightMap为指向包含单色光照贴图数据的纹理的有效指针。/把光照贴图设为第一张纹理。 d3dDevice-SetTexture(0, lptexLightMap); d3dDevice-SetTextureStageState(0,D3DTSS_COLOROP, D3DTOP_MODULATE );d3dDevice-SetTextureStageState( 0,D3DTSS_COLORARG1, D3DTA_TEXTURE );d3dDevice-SetTextureStageState(0,D3DTSS_COLORARG2, D3DTA_DIFFUSE );这个示例先把光照贴图设为第一张纹理,然后设置第一个混合层的状态,对输入数据进行调制(相乘),并把第一张纹理和图元的当前颜色用作调制操作的参数。3,镜面反射贴图在对发亮的物体那些使用了高反射度材质的物体进行光照计算时会产生镜面反射高光。在一些情况下,由光照模块产生的镜面反射高光不够精确,为了产生更吸引人的镜面反射高光,许多Microsoft Direct3D应用程序会给图元使用镜面反射光照贴图。要进行镜面反射光照贴图,只需把镜面反射光照贴图与图元的纹理相加,然后再和RGB光照贴图进行调制(与结果相乘)操作。/以下C+示例代码描述了这个过程。 /本例假设d3dDevice为指向IDirect3DDevice9接口的有效指针/lptexBaseTexture为指向纹理的有效指针。/lptexSpecLightMap为指向包含RGB镜面反射光照贴图数据的纹理的有效指针。/lptexLightMap为指向包含RGB光照贴图数据的纹理的有效指针。/设置基本纹理。d3dDevice-SetTexture(0, lptexBaseTexture );/设置要对基本纹理执行的操作及参数。d3dDevice-SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE ); d3dDevice-SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE );d3dDevice-SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE );/设置镜面反射光照贴图。d3dDevice-SetTexture(1, lptexSpecLightMap);/设置要对镜面反射光照贴图执行的操作及参数。d3dDevice-SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_ADD );d3dDevice-SetTextureStageState(1, D3DTSS_COLORARG1, D3DTA_TEXTURE );d3dDevice-SetTextureStageState(1, D3DTSS_COLORARG2, D3DTA_CURRENT );/设置RGB光照贴图。d3dDevice-SetTexture(2, lptexLightMap);/设置要对RGB光照贴图执行的操作及参数。d3dDevice-SetTextureStageState(2,D3DTSS_COLOROP, D3DTOP_MODULATE);d3dDevice-SetTextureStageState(2,D3DTSS_COLORARG1, D3DTA_TEXTURE );d3dDevice-SetTextureStageState(2,D3DTSS_COLORARG2, D3DTA_CURRENT );4,漫反射光照贴图不光滑的表面在被光源照射时会显示漫反射光。漫反射光的亮度取决于表面到光源的距离及表面法向与光源的方向向量间的夹角。通过光照计算(译注:由光照模块执行)模拟漫反射光只能得到一般的效果。应用程序可以用光照贴图模拟更为复杂的漫反射光照效果,只需在基本纹理的基础上再加一张漫反射光照贴图即可,如以下C+示例代码所示。/本例假设d3dDevice为指向IDirect3DDevice9接口的有效指针。/lptexBaseTexture为指向纹理的有效指针。/lptexLightMap为指向包含RGB光照贴图数据的纹理的有效指针。/设置基本纹理。d3dDevice-SetTexture(0,lptexBaseTexture );/设置要对基本纹理执行的操作及参数。d3dDevice-SetTextureStageState(0,D3DTSS_COLOROP, D3DTOP_MODULATE );d3dDevice-SetTextureStageState(0,D3DTSS_COLORARG1, D3DTA_TEXTURE );d3dDevice-SetTextureStageState(0,D3DTSS_COLORARG2, D3DTA_DIFFUSE );/设置漫反射光照贴图。d3dDevice-SetTexture(1,lptexDiffuseLightMap );/设置混合层 。d3dDevice-SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_MODULATE );d3dDevice-SetTextur
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 品牌声誉风险评估-洞察及研究
- 消防安全月培训记录课件
- 租赁合同解除条件解析-应对租赁纠纷
- 高端私立幼儿园教师专业素质培养聘用合同
- 离婚前婚姻关系解除财产分割及子女成长及教育协议书
- 2025至2030中国镍基高温合金行业产业运行态势及投资规划深度研究报告
- 离婚协议书制作指南与范本:财产分割与子女抚养
- 离婚协议书:财产分割及子女抚养权分配协议范本
- 离婚财产分割协议范本二:清晰界定财产权益
- 股权回购合同中目标公司控制权变更与保障
- 国内外新能源现状及发展趋势课件
- 大班科学《玩转扑克牌》课件
- 高速公路改扩建桥梁拼宽施工技术及质量控制
- 双台110kV主变短路电流计算书
- DB1750-2019水电站(厂)防雷与接地性能测试技术规范
- 牛常见病防治课件
- 你不懂咖啡课件
- 危险物品储存安全隐患排查整治表
- 装饰工程保修单
- IInterlib区域图书馆集群管理系统-用户手册
- EnglishDrama英语戏剧写作及表演技巧课件
评论
0/150
提交评论