我猜您不关心混合贴图或纹理喷溅(这与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;