地形纹理混合

上传人:夏** 文档编号:494205337 上传时间:2023-03-31 格式:DOC 页数:27 大小:232.50KB
返回 下载 相关 举报
地形纹理混合_第1页
第1页 / 共27页
地形纹理混合_第2页
第2页 / 共27页
地形纹理混合_第3页
第3页 / 共27页
地形纹理混合_第4页
第4页 / 共27页
地形纹理混合_第5页
第5页 / 共27页
点击查看更多>>
资源描述

《地形纹理混合》由会员分享,可在线阅读,更多相关《地形纹理混合(27页珍藏版)》请在金锄头文库上搜索。

1、D3DTOP_DISABLE:禁用纹理层颜色输出.D3DTOP_SELECTARG1:将该纹理层的第一个混合参数直接输出.对于D3DTSS_COLOROP,则输出由D3DTSS_COLORARG1指定的第一个表示RGB的参数;对于D3DTSS_ALPHAOP,则输出由D3DTSS_ALPHAARG1指定的第一个表示ALPHA的参数.D3DTOP_SELECTARG2:同上.D3DTOP_MODULATE:将两个混合参数相乘后输出.D3DTOP_MODULATE2X:将两个混合参数相乘后再乘以2输出.D3DTOP_MODULATE4X:将两上混合参数相乘后再乘以4输出.D3DTOP_ADD:将两

2、上混合参数相加后输出.D3DTOP_ADDSIGNED:将两个混合参数相加后减去0.5输出.(可以这样理解:本来范围在0,1里,减0.5使其范围限制在-0.5, 0.5中.这样相加后,比较暗的部分,即负数部分,将对原来的纹理产生衰减,而较亮部分则对原来的纹理增强.可用作细节纹理.如果有的显卡不支持D3DTOP_ADDSIGNED方式,可考虑采用D3DTOP_MODULATE2X来模拟这种效果).D3DTOP_ADDSIGNED2X:同上,结果再乘以2输出.D3DTOP_SUBTRACT:将两个混合参数相减后输出.D3DTOP_ADDSMOOTH:将两个混合参数的和减去两个混合参数的积.D3DT

3、SS_COLORARG1 与 D3DTSS_COLORARG2 可以指定的纹理混合参数:D3DTA_CURRENT:前一个纹理层的输出颜色.如果在第0层,则为漫反射颜色.D3DTA_DIFFUSE:像素的漫反射颜色值.这种颜色是在使用GOURAUD着色模式时对顶点的漫反射颜色插值得到的.D3DTA_TEXTURE:当前纹理的颜色值.D3DTA_TFACTOR:参数值为SetRenderState()通过D3DRS_TEXTURE_EFACTOR设置的系数值.D3DTA_SPECULAR:参数值为像素的镜面反射颜色值.这种颜色是在使用高洛德着色模色时对顶点的镜面反射颜色插值得到的.D3DTA_S

4、ELECTMASK:该状态在设置纹理参数时不起作用.D3DTA_TEMP:参数值存储在一个临时寄存器中.D3DTA_CONSTANT:参数值为一个常数值.D3DTA_COMPLEMENT:该参数必须与以上任意一个参数同时设置(或操作?),表示用一减去原参数.D3DTA_ALPHAREPLICATE:该参数必须与以上除了D3DTA_COMPLEMENT之外的任一参数同时设置,表示将原参数的ALPHA值复制到R,G,B中. 本文来自CSDN博客,转载请标明出处:http:/ 由定点的Diffuse提供Alpha有一个好处,那就是D3D会做插值运算,这样就不会让某一点的Alpha扩展成斑块,因为它扩

5、展出来的新值会被D3D插值运算的。那么要实现Torque那样的最多支持3张纹理混合,同一个地形就需要2份Diffuse。可以考虑使用多流的技术,让Diffuse数据作为一个单独的流。 原文 地形多层纹理混合加阴影渲染方法地形由于十分庞大,需要大量顶点,所以往往占用很多内存空间,那么就应该在地形贴图上想办法节约空间。很多游戏的地形,虽然看上去不同地点的纹理好像互不相同,地表纹理十分丰富,但其实真正用的贴图是很少的,之所以还能产生地表纹理变化多端的视觉效果,是因为使用了Alpha混合和阴影,从而产生一种错觉。2.5D的网络游戏奇迹(MU)、全3D引擎Torque(多人联网FPS游戏部落2即使用此引

6、擎)、全3D的滑雪游戏极限滑雪(SupremeSnowboarding),都是这么做的。(参见文章末尾的截图) 我对此设想了一个解决方案。需要用到顶点的Diffuse颜色、3个TextureStage。其实所谓的多层纹理,具体到一个三角形上的时候,很多游戏只用了2层纹理来做Alpha混合(因为也许玩家的显卡只支持2层MultiTexture混合),然后再一层光照纹理。前2层纹理要做Alpha混合,Alpha来自哪里?若使用Alpha贴图,就必然再增加一层TextureStage,而我选择使用顶点的Diffuse就可以省掉这一层TextureStage:由Diffuse的Alpha通道提供Alp

7、ha值供前两层TextureStage混合使用。下面是在D3D中的设置: /TextureStage0 pd3dDevice-SetTextureStageState(0,D3DTSS_COLOROP,D3DTOP_SELECTARG1); pd3dDevice-SetTextureStageState(0,D3DTSS_COLORARG1,D3DTA_TEXTURE); pd3dDevice-SetTextureStageState(0,D3DTSS_ALPHAOP,D3DTOP_DISABLE); /TextureStage1 pd3dDevice-SetTextureStageState

8、(1,D3DTSS_COLOROP,D3DTOP_BLENDDIFFUSEALPHA); pd3dDevice-SetTextureStageState(1,D3DTSS_COLORARG1,D3DTA_TEXTURE); pd3dDevice-SetTextureStageState(1,D3DTSS_COLORARG2,D3DTA_CURRENT); pd3dDevice-SetTextureStageState(1,D3DTSS_ALPHAOP,D3DTOP_DISABLE); 在TextureStage0,什么也没做,把第一层纹理原封不动的留给TextureStage1;在Textur

9、eStage1,COLOROP使用D3DTOP_BLENDDIFFUSEALPHA,也就是使用来自顶点Diffuse的Alpha值作为混合因子混合第2层纹理和TextureStage0原封不动留下来的第1层纹理。混合公式如下(来自DX帮助文档): Result=Arg1*Alpha+Arg2*(1Alpha) Arg1是来自第2层纹理的颜色,Arg2是来自TextureStage0原封不动留下来的第1层纹理的颜色。并且,这里的Alpha值是D3D插值运算后得到的,因此混合效果很平滑。 你不相信2层纹理混合就能得到丰富的地表视觉效果吗?你应该相信,因为虽然Arg1和Arg2总是恒定不变的来自2个

10、贴图,因此对三角形上的同一点来说,这两个是常量,但Alpha值却是个变量,Alpha值取不同的值就会产生不同的Result。 假设与Arg1相对应的贴图是一个草地的贴图,与Arg2相对应的贴图是一个沙地的贴图,在一片地形区域内,仅使用这两张贴图,但是由于各顶点的Diffuse的Alpha值不同,你会看到最终渲染出来的这片地形区域,草地的分布并不均匀,有些地方草的样子多一些,有些地方沙的样子多一些。这种效果看上去已经很自然了。 当然并不限制你在一个地形场景上使用更多的地表纹理,但是对一个三角形来说,2张纹理已经足够,其它纹理请用在其它三角形上吧,这可以产生更丰富的地貌。比如你想让另一片地形区域是

11、雪地和岩石的风格,那么在那片区域上就使用1张雪地贴图、1张岩石贴图。现在这个关卡里面共有4张贴图了,但同一个三角形仍然只使用2张贴图(这是硬件的限制啊!)。 现在来说阴影。前面已经使用了顶点Diffuse的Alpha通道,现在他的RGB三个分量也要派上用场了。在D3D中设置如下: /TextureStage2 pd3dDevice-SetTextureStageState(2,D3DTSS_COLOROP,D3DTOP_MODULATE); pd3dDevice-SetTextureStageState(2,D3DTSS_COLORARG1,D3DTA_DIFFUSE); pd3dDevice

12、-SetTextureStageState(2,D3DTSS_COLORARG2,D3DTA_CURRENT); pd3dDevice-SetTextureStageState(2,D3DTSS_ALPHAOP,D3DTOP_DISABLE); 这是第3个TextureStage,COLOROP为相乘,Arg1设为Diffuse,是来自经过D3D插值运算的顶点Diffuse颜色,Arg2是Current就是TextureStage1产生的结果。混合公式如下: Result=Arg1*Arg2 颜色虽是RGB三个字节(或者其它颜色格式),但D3D会将它们拆成单独的3个RGB通道值(0-1之间的浮

13、点数)。相乘运算可以贴上彩色的光影效果。 有一个问题是,人们当初选择使用光照图就是为了能够提高光影的精确度,因为顶点光照只作用于顶点,虽然渲染API会在顶点之间做插值,但这也只在顶点很密集的时候才会有很精确的光照,如果定点很稀疏甚至不能产生正确的光照效果。这里使用顶点Diffuse,会不会也得不到令人满意的光照效果呢? 我想过使用一整张光照图铺在整个地形上,但我忽然想起这与基于heightmap的地形生成技术面临一个同样的问题,精度。使用heightmap,为了减小游戏体积,这个heightmap不可能很大,不可能每一个高度点只对应一个顶点,而是多个顶点被映射到同一个高度点上去了。一整张光照图

14、也面临同样的问题,也许多个顶点使用光照图上的同一个像素呢?如果两个顶点用的是光照图上的同一个像素,那顶点之间的空间也肯定是用这个像素点了,这样是不会提高精度的。把光照图的尺寸增大?那是选择512*512呢,还是1024*1024? 而实际上,LOD地形的顶点总是很密集的。至少在靠近照相机的区域是这样的,往往比室内建筑的顶点还要密集。虽然还没密集到可以让D3D的聚光灯产生满意效果的地步,但已足够使用顶点光照模拟地形因高低起伏而产生的阴影效果。何况业界普遍认为地形渲染的精度是低于室内渲染一个档次的(新游戏FarCry是个例外)。 更妙的是,顶点光照信息可以存储在高度图里,我们把高度点从一个unsignedchar改为一个多字节的数据结构: structHeightPoint unsignedcharheight;/用于计算定点的Y坐标值,用于渲染地形高度起伏 unsignedcharalpha;/定点diffuse的alpha,用于多层纹理混合

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 建筑/环境 > 施工组织

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号