如何在DirectX9 C ++中纹理平铺的3D地形?

时间:2012-04-28 19:18:46

标签: textures direct3d tile terrain

我操纵网格本身没有问题,但是每个图块(基本上是4个顶点的正方形,整个地形网格由图块网格构成)必须能够给出不同的纹理。选择。到目前为止,我只能给网格1纹理,并通过改变顶点缓冲区中CUSTOMVERTEX-es的UV值使其重复。但是我不能像这里那样制作不同的图块纹理:http://classic.battle.net/war3/images/neutral/heroes/ss02.jpg - 你可以看到侧面有草砖和一些污垢砖,左边有一些碎石。

我有一个愚蠢的想法,就是让每个瓷砖成为一个单独的网格,但那只是......更重,而且纹理没有很好地夹紧。我确定必须要有一些功能让我纹理terrainmesh的单独方块: (

1 个答案:

答案 0 :(得分:1)

这样做的一种方法是使用alpha贴图来定义哪个纹理在地形上的位置。通常,您将4个或更多纹理绑定到着色器,并使用另一个纹理和rgba组件来定义纹理应该出现的位置。

假设你有草,泥土,沙子和雪以及阿尔法地图纹理。红色组件控制草的可见性,绿色组件控制污垢,蓝色组件控制沙子和alpha组件控制雪。

在像素着色器中,您从alphamap中读取,然后使用rgba组件中的值从草,沙,泥雪纹理中混合。

一些伪代码:

float4 mix = sampler.read(alphaTexture,alphaTexCoord);
float4 finalColor = sampler.read(grassTexture,texCoord) * mix.r + 
                    sampler.read(dirtTexture,texCoord) * mix.g + 
                    sampler.read(sandTexture,texCoord) * mix.b + 
                    sampler.read(snowTexture,texCoord) * mix.a; 

正如您所看到的,在alpha地图中,您的颜色值为0,0,1,0,该片段将为沙子等等。

此视频中的地形采用此技术构建: http://www.youtube.com/watch?v=-mBpMYYtJCo

你也可以使用8个纹理和2个alpha地图。

希望有所帮助。