DirectX中的多重纹理相关技术.docx
《DirectX中的多重纹理相关技术.docx》由会员分享,可在线阅读,更多相关《DirectX中的多重纹理相关技术.docx(6页珍藏版)》请在三一文库上搜索。
1、NO.*DirectX中的多重纹理相关技术来源:ogdev浏览:28直到现在我才知道前边讲的所谓黑暗映射之类的是什么东西,其实说白了就是使用多重纹理的一种方式。多重纹理从原则上讲全部可以被多次渲染所替代,因为多重纹理实际上就是将多 次渲染中的每遍中的纹理在一遍中进行操作。因此我们首先介绍一下多次渲染, 然后概要介绍一下多重纹理的使用方法和实现的效果。一种复杂的效果往往是无法通过单次渲染来完成的,因此多次渲染实际上非常普遍。在shadow volume算法中就要通过多次渲染来实现阴影混合。Hook在siggraph1998中提到Quake3使用了 10次渲染:14累积凹凸贴图(Accumulat
2、e bump map)5 漫反射光照(Diffuse lighting)6基本纹理,具有镜面反射成分7 镜面光照(Specular lighting)8 放射性光照(Emissive lighting)9 体积/大气效果(volumetric/atmosphere effect)10 屏幕显示(screen flash)这对硬件的性能要求非常高,即使再现在来讲对于复杂场景来讲也是不能忍受的。那么为了减少渲染次数,显卡开始支持多重纹理。我们来看一下多次渲染和多重纹理的代码比较。多次渲染:/texture #1m_pd3dDevice->SetTextureStageState(0,D3DT
3、SS_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_p
4、d3dDevice->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_pDetai
5、lTexture);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-
6、>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,D3
7、DTSS_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_TRIANG
8、LELIST,0,24,0,36/3);通过对比可以看到多重纹理只对场景顶点进行了一次绘制,而多次渲染要进行对 此绘制。上边代码也基本展示了多重纹理的使用方法:设置每一个纹理阶段的纹理操作参 数和操作类型,然后调用顶点绘制即可。在一个纹理阶段有最多三个纹理参数,通过设置的某种操作将结果投入下一个阶 段。这样进行多重纹理级联以后的效果如下:ElendingPolygon1 through N*1具体来说,纹理的操作包括: typedef enum _D3DTEXTUREOP D3DTOP_DISABLE = 1, D3DTOP_SELECTARG1 = 2, D3DTOP_SELECTARG2
9、= 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 =
10、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_M
11、ULTIPLYADD = 25,D3DTOP_LERP = 26,D3DTOP_FORCE_DWORD = 0x7fffffff D3DTEXTUREOP;这里边也包括了 alpha混合的操作,都是通过D3DTEXTUREO砒行设置。对于每个颜色的操作最多有三个参数,也是通过SetTextureStageState() 来设置的,该方法的第一个参数设置了纹理阶段,第二个参数设置了参数序号:D3DTSS_COLORA RG0DTSS_COLORA RD3DTSS_COLORAR叱个参数是参数 化D3DTA_CURRENTD3DTA_DIFFUSED3DTA_SELECTMASKD3DTA_SPE
12、CULARD3DTA_TEMPD3DTA_TEXTURED3DTA_TFACTOR分别表示了不同的颜色获取途径。OK下面我们来看一下几种多重纹理的效果。1,单色纹理贴图一些老的三维加速卡不支持使用目标像素的阿尔法值进行纹理混合,更多信息请参阅阿尔法纹理混合。一般来说这些加速卡也不支持多重纹理混合,如果应用程 序在此类适配器上运行,那么可以用多趟纹理混合进行单色光照贴图要进行单色光照贴图,应用程序应该把光照信息存放在光照贴图的阿尔法数据中。应用程序使用Microsoft? Direct3D? 的纹理过滤功能把图元的图像中的每个像素映射到光照贴图中的相应texel。应用程序应该把源混合因子设为相应
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- DirectX 中的 多重 纹理 相关 技术
链接地址:https://www.31doc.com/p-12335312.html