有哪些方法可以对地形进行纹理映射?


10

我正在与XNA一起开发3D游戏,并且正在努力营造一个适当而良好的环境。实际上,我遵循了一个教程来根据高度图创建地形。要对其进行纹理处理,我只需在其上应用草纹理并将其平铺多次。

但是我想要做的是具有真实逼真的纹理,而且还可以自动生成它(例如,如果我想使用Perlin噪声生成地形然后对其进行纹理化)。

我已经学习了多重纹理,如何为不同的纹理加载具有不同颜色的地图文件,但是我认为这并不是真正有效的方法,例如,对于悬崖或非常陡峭的区域,由于它是从地面观看的,因此会严重地平铺纹理最佳。(此外,我不知道该如何绘制道路或泥泞道路。)

我正在寻找一种有效的解决方案,以对过程生成的地形进行逼真的纹理映射。


1
您的映射问题一点都不小。在几个段落中无法正确回答。我建议您看一下谐波映射以及本文中要介绍的内容:cs.ubc.ca/~sheffa/papers/TOG02.pdf
teodron

Answers:


2

我猜您不关心混合贴图或纹理喷溅(这与UV贴图无关)。由于您特别要求最小化由映射引起的失真,因此您可以查阅此GPU Gems文章的1.5节:

https://developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch01.html

即使在程序生成的地形上也可以使用。该概念也称为“三边形纹理”

后来的编辑:我已经在自己的地形渲染器中测试了该技术,并且没有使用预先计算的uvs进行映射。您要做的就是为3个不同的投影平面(XY,YZ和ZX)计算3组UV。这可以通过使用简单的顶点和片段着色器片段来实现:

VShader:

float tileSize = 2.0;
vec4 worldPos = ( gl_Vertex);//So we obtain the world position

TexCoordX = (worldPos.zy/tileSize);//here are our texture coordinates...
TexCoordY = (worldPos.xz/tileSize);
TexCoordZ = (worldPos.xy/tileSize);
normal =  gl_Normal;
wNormal = normal;

FShader:

vec3 n = wNormal;
n*=n;
vec2 tcX = fract(TexCoordX);
vec2 tcY = fract(TexCoordY);
vec2 tcZ = fract(TexCoordZ);

vec4 grassCol = texture2D(grassTexture,tcX)*n.x+
                texture2D(grassTexture,tcY)*n.y+
                texture2D(grassTexture,tcZ)*n.z;

3

您可以定义一组纹理(草,泥土,岩石)并使用它们。假设使用这三个图层(底部是岩石,顶部是灰尘,顶部是草),您可以定义三个Alpha通道来定义每种纹理的可见程度。首先为您的Alpha通道创建一个简单的噪波图,然后考虑地形的坡度。坡度越大,越会有更多的岩石穿过。据我所知,这是一种称为“纹理喷涂”的技术。这里有一些链接可以帮助您入门。 先进的纹理喷溅(Gamasutra)

TextureSplatting(charlesbloom,我以前开始使用该主题的对象)

您应该能够很快获得很好的结果,这是非常有意义的话题

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.