Какие есть способы текстурирования карты местности?

10

Я работаю с XNA над 3D-игрой и пытаюсь создать подходящую и приятную обстановку. Я фактически следовал учебнику, чтобы создать ландшафт из карты высот. Чтобы текстурировать его, я просто накладываю на него текстуру травы и накладываю ее на плитки несколько раз.

Но я хочу иметь действительно реалистичное текстурирование, а также генерировать его автоматически (например, если я хочу использовать шум Перлина для создания рельефа, а затем текстурировать его).

Я уже узнал о мультитекстурировании, загрузке файла карты с разными цветами для разных текстур, но я не думаю, что это действительно эффективно, например, для скал или очень крутых участков, текстура будет плохо наложена, так как это вид из Вверх. (Кроме того, я не знаю, как я буду рисовать дороги или грязные дорожки с этим.)

Я ищу эффективное решение для реалистичного наложения текстур сгенерированной процедурой местности.

Адриен Невеу
источник
1
Ваша проблема с отображением совсем не тривиальна. На это нельзя правильно ответить в нескольких параграфах. Я рекомендую вам взглянуть на гармонические отображения и то, что объясняется в этой статье: cs.ubc.ca/~sheffa/papers/TOG02.pdf
teodron

Ответы:

2

Я предполагаю, что вас не волнуют карты наложения или разбрызгивание текстуры (так как это не зависит от вашего UV-отображения). Так как вы специально просили минимизировать искажения, вызванные отображением, вы можете обратиться к разделу 1.5 этой статьи о Gems из GPU:

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

Это может работать даже на процедурно сгенерированной местности. Концепция также известна как «трипланарное текстурирование» .

ПОСЛЕДНЕЕ РЕДАКТИРОВАНИЕ: я проверил технику в моем собственном рендерере ландшафта, не используя предварительно вычисленные uvs для отображения. Все, что вам нужно сделать, это вычислить 3 набора UV для 3 различных плоскостей проекции (XY, YZ и ZX). Это может быть достигнуто с помощью простых фрагментов вершинных и фрагментных шейдеров:

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;
teodron
источник
3

Вы можете определить набор текстур (трава, грязь, камень) и использовать их. Допустим, используя эти три слоя (камень внизу, грязь сверху и трава сверху), вы можете определить три альфа-канала, чтобы определить, какая часть каждой текстуры видима. Начните с простой карты шума для ваших альфа-каналов и, возможно, примите во внимание наклон местности. Чем больше склон, тем больше камней будет просвечивать. Насколько я помню, это техника под названием «Texture Splatting». Вот несколько ссылок, с которых можно начать. Усовершенствованная текстура сплаттинга (гамасутра)

TextureSplatting (charlesbloom, тот, который я использовал, чтобы начать работу с этой темой)

Вы должны быть в состоянии получить хорошие результаты довольно быстро, очень полезная тема

Петерсон
источник