Які існують способи текстурування карти місцевості?


10

Я працюю з XNA над 3D-грою, і намагаюся створити належне та гарне оточення. Я фактично дотримувався навчального посібника, щоб створити місцевість із мапи висоти. Щоб її текстурувати, я просто наношу на неї текстуру трави і плитую її кілька разів.

Але те, що я хочу зробити, це мати справді реалістичну текстурування, але також генерувати її автоматично (наприклад, якщо я хочу використовувати шум Перліна для створення місцевості, а потім текстуру).

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

Я шукаю ефективне рішення для реалістичного відображення текстури з процедурно сформованою місцевістю.


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

Відповіді:


2

Напевно, ви не переймаєтесь накладанням карт або розписуванням текстур (як це не залежно від вашої УФ-карти). Оскільки ви спеціально попросили мінімізувати спотворення, спричинені картографуванням, ви можете ознайомитись з розділом 1.5 цієї статті GPU Gems:

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

Це могло б працювати навіть на територіально створеній місцевості. Концепція відома також як "трипланарне текстурування" .

Пізніше редагування: Я перевірив техніку у власному рельєфі місцевості, використовуючи не попередньо обчислені ПВ для картографування. Все, що вам потрібно зробити, - це обчислити 3 набори УФ для 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;

3

Ви можете визначити набір текстур (трава, бруд, скеля) і використовувати їх. Скажімо, використовуючи ці три шари (скеля внизу, бруд зверху і трава вгорі), ви можете визначити три альфа-канали, щоб визначити, скільки кожної текстури видно. Почніть з простої карти шуму для своїх альфа-каналів і, можливо, врахуйте нахил місцевості. Чим більше нахил, тим більше скелі просвічуватиметься. Наскільки я пам’ятаю, це методика під назвою «Бризки текстури». Ось декілька посилань для початку роботи. Розширене розсипання текстури (гамасутра)

TextureSplatting (charlesbloom, той, з якого я почав працювати з цією темою)

Ви повинні мати можливість отримати хороші результати досить швидко, дуже корисно

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.