欢迎来到三一文库! | 帮助中心 三一文库31doc.com 一个上传文档投稿赚钱的网站
三一文库
全部分类
  • 研究报告>
  • 工作总结>
  • 合同范本>
  • 心得体会>
  • 工作报告>
  • 党团相关>
  • 幼儿/小学教育>
  • 高等教育>
  • 经济/贸易/财会>
  • 建筑/环境>
  • 金融/证券>
  • 医学/心理学>
  • ImageVerifierCode 换一换
    首页 三一文库 > 资源分类 > DOCX文档下载  

    DirectX中的多重纹理相关技术.docx

    • 资源ID:12335312       资源大小:59.75KB        全文页数:6页
    • 资源格式: DOCX        下载积分:4
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录   微博登录  
    二维码
    微信扫一扫登录
    下载资源需要4
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    DirectX中的多重纹理相关技术.docx

    NO.*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);通过对比可以看到多重纹理只对场景顶点进行了一次绘制,而多次渲染要进行对 此绘制。上边代码也基本展示了多重纹理的使用方法:设置每一个纹理阶段的纹理操作参 数和操作类型,然后调用顶点绘制即可。在一个纹理阶段有最多三个纹理参数,通过设置的某种操作将结果投入下一个阶 段。这样进行多重纹理级联以后的效果如下:ElendingPolygon1 through N*1具体来说,纹理的操作包括: 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混合的操作,都是通过D3DTEXTUREO砒行设置。对于每个颜色的操作最多有三个参数,也是通过SetTextureStageState() 来设置的,该方法的第一个参数设置了纹理阶段,第二个参数设置了参数序号:D3DTSS_COLORA RG0DTSS_COLORA RD3DTSS_COLORAR叱个参数是参数 化D3DTA_CURRENTD3DTA_DIFFUSED3DTA_SELECTMASKD3DTA_SPECULARD3DTA_TEMPD3DTA_TEXTURED3DTA_TFACTOR分别表示了不同的颜色获取途径。OK下面我们来看一下几种多重纹理的效果。1,单色纹理贴图一些老的三维加速卡不支持使用目标像素的阿尔法值进行纹理混合,更多信息请参阅阿尔法纹理混合。一般来说这些加速卡也不支持多重纹理混合,如果应用程 序在此类适配器上运行,那么可以用多趟纹理混合进行单色光照贴图要进行单色光照贴图,应用程序应该把光照信息存放在光照贴图的阿尔法数据中。应用程序使用Microsoft? Direct3D? 的纹理过滤功能把图元的图像中的每个像素映射到光照贴图中的相应texel。应用程序应该把源混合因子设为相应texel的阿尔法值.以下C+M例代码描述了应用程序如何把一张纹理用作单色光照贴图。/本例假设d3dDevice为指向IDirect3DDevice9 接口的有效指针,/且lptexLightMap为指向包含单色光照贴图数据的纹理的有效指针。/把光照贴图设置为当前纹理。d3dDevice->SetTexture(0, lptexLightMap);/设置颜色操作。d3dDevice->SetTextureStageState(0, D3DTSS_COLOROD3DTOP_SELECTARG1);/设置颜色操作的第一个参数。d3dDevice->SetTextureStageState(0, D3DTSS_COLORARG1,D3DTA_TEXTURE | D3DTA_ALPHAREPLICATE);因为不与持目标阿尔法混合的适配器一般来说也不支持多重纹理混合,这个示例把光照贴图设为第一张纹理,而这在所有三维加速卡上都是可用的。 示例代码先 设置纹理混合层的颜色操作,让纹理数据与图元已有的颜色进行混合,然后选择 第一张纹理和图元已有的颜色作为输入数据。2,有色光照贴图如果应用程序使用有色光照贴图,那么通常会渲染得到更具真实感的三维场景。一张有色光照贴图使用RG瞰据存放光照信息。以下C+切例代码显示了如何用RG的色数据进行光照贴图。/本例假设d3dDevice为指向IDirect3DDevice9 接口的有效指针,/且IptexLightMap为指向包含单色光照贴图数据的纹理的有效指针。/把光照贴图设为第一张纹理。d3dDevice->SetTexture(0, IptexLightMap);d3dDevice->SetTextureStageState(0,D3DTSS_COLOROP, D3DTOP_MODULATE ); d3dDevice->SetTextureStageState( 0,D3DTSS_COLORARG1, D3DTA_TEXTURE ); d3dDevice->SetTextureStageState(0,D3DTSS_COLORARG2, D3DTA_DIFFUSE ); 这个示例先把光照贴图设为第一张纹理,然设置第一个混合层的状态,对输入数据进行调制(相乘),并把第一张纹理和图元的当前颜色用作调制操作的参数。3,镜面反射贴图在对发亮的物体一一那些使用了高反射度材质的物体一一进行光照计算时会产 生镜面反射高光。在一些情况下,由光照模块产生的镜面反射高光不够精确,为了产生更吸引人的镜面反射高光,许多Microsoft? Direct3D? 应用程序会给图元使用镜面反射光照贴图。要进行镜面反射光照贴图,只需把镜面反射光照贴图与图元的纹理相加,然后再和RGBt照贴图进行调制(与结果相乘)操作。/以下C+M例代码描述了这个过程。/本例假设d3dDevice为指向IDirect3DDevice9 接口的有效指针/lptexBaseTexture为指向纹理的有效指针。/lptexSpecLightMap 为指向包含RGBS面反射光照贴图数据的纹理的有效指/lptexLightMap 为指向包含RGBt照贴图数据的纹理的有效指针。/设置基本纹理。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 );/设置RGBt照贴图。d3dDevice->SetTexture(2, lptexLightMap);/设置要对RGBt照贴图执行的操作及参数。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 接口的有效指针。/IptexBaseTexture为指向纹理的有效指针。/IptexLightMap为指向包含RGBt照贴图数据的纹理的有效指针。/设置基本纹理。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->SetTextureStageState(1, D3DTSS_COLORARG1, D3DTA_TEXTURE );d3dDevice->SetTextureStageState(1, D3DTSS_COLORARG2, D3DTA_CURRENT ); 上边介绍了四种基本贴图,下边介绍几种特效贴向。1,黑暗映射(Dark mapping)黑暗映射实际上是把一张灰度图作用于当前的纹理中。采用调制的方式进行混合,适合于微弱光照的情况进行渲染。2,黑暗贴图动回就是通过控制显示的次数和显示亮度的关系,分别调用三种不同的调制操作类型来交替显示,就可以达到黑暗贴图动画的效果。适合于闪烁的黑暗环境。3,细节纹理(Detail mapping)采用一张细节纹理,将基础纹理和细节纹理做 addsigned操作,可以模拟粗糙的 表面细节。上述效果都不是固定的应用,可以尽可能多的采用纹理类型和纹理混合形式,最 终实现更好的效果。顺便说一下alpha调制。原来我一直以为作为第四维alpha和RGB勺处理方式是一样的,直到昨天问了大 牛才知道不是。现在的图形硬件已经可以对RGB® alpha分别进行处理,因为alpha最开始是用来表示透明的,又可以用来在混合的时候表示混合因子,但是 随着图形技术的发展alpha的应用也发生了变化,于是图形硬件开始允许alpha 进行单独的操作。那么d3d里边就可以对alpha操作进行单独的设置。alpha操 作的设置方法同颜色操作的设置方式基本相同,操作类型甚至都差不多。最后是纹理管理。d3d有一个时间戳管理方法,通过最近最少使用算法来进行从 内存到显存的调度。当然也允许设置纹理的优先级来强制管理。6N0.*

    注意事项

    本文(DirectX中的多重纹理相关技术.docx)为本站会员(scccc)主动上传,三一文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一文库(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    经营许可证编号:宁ICP备18001539号-1

    三一文库
    收起
    展开