Несколько изображений текстур смешаны на трехмерной земле.

StackOverflow https://stackoverflow.com/questions/1110844

  •  12-09-2019
  •  | 
  •  

Вопрос

Как компьютерные игры создают свою почву?Я буду использовать карту высот для геометрии (хотя позже я ее оптимизирую), но мне интересно, какой метод лучше всего, например, «покрасить» землю;трава почти повсюду, грунтовые дорожки тут и там, гравий внутри городов и плавные переходы между каждым типом материала.

Я просто использую огромную заранее запеченную текстуру?Это кажется очень неэффективным, когда я могу разместить существующие текстуры плиткой.Итак, нужно ли мне использовать огромную альфа-карту для каждой существующей текстуры?Теоретически это звучит нормально, но как мне на самом деле это сделать и каковы последствия?Я действительно не знаю, с чего начать, и мои поиски в Google оказались не очень эффективными.

Я бы предпочел не «привязывать» текстуру к сетке (т.е.пробел (0,0) — трава, пробел (0,2) — грязь, пробел (0,1) — переход трава-земля);Я бы предпочел иметь возможность рисовать произвольно, чтобы это выглядело более убедительно.Конечно, это был бы простой путь, но это слишком большая жертва в качестве графики и «реалистичности».

Я в основном просто ищу здесь теорию и варианты.Я использую OpenGL, поэтому, если вы дадите советы о способах работы OpenGL и функциях, о которых я, возможно, никогда не слышал, это было бы здорово.

Просто для пояснения: Oblivion — хороший справочник по тому, что я ищу.Я не знаю, какова геометрия земли (карта высот, статические 3D-модели и т. д.), но их ландшафт имеет разные типы земли и плавные переходы между ними, о чем я и говорю.Вот пример изображения, обратите внимание, как булыжник сливается с травой, нереально, но плавно: http://www.elitistsnob.com/images/Oblivion%202006-05-21%2008-38-25-15.jpg

Кроме того, мне кажется, я читал об этом в одной из книг «Жемчужины игрового программирования», но тогда я не обратил на это особого внимания, а теперь, когда наступило лето, у меня нет доступа к университетской библиотеке, чтобы проверить!Я сейчас ищу оглавление и отредактирую, если найду его, но прочитать его я все равно не смогу до середины августа.

РЕДАКТИРОВАТЬ:Ох, чувак, в Game Programming Gems 7 есть глава 5.8 под названием «Отображение больших текстур для рендеринга наружной местности», это звучит как именно то, что мне нужно, но в моей библиотеке нет даже этой книги!Я не смог найти ничего подобного в других книгах Game Programming Gems, хотя в паре книг были статьи о геометрии ландшафта.

Это было полезно?

Решение

Недавно я написал небольшой движок рендеринга ландшафта в OpenGL, который делает нечто похожее на то, о чем вы говорите.Технику, которую я использую, лучше всего описать как текстура.

Для этого я использую пять текстур.Четыре из этих текстур являются текстурами деталей:трава, камень, вода и песок.Эти текстуры небольшие, размером 512x512, и они расположены по всей местности.Пятая текстура — это миксмап.Миксмап — это гигантская текстура, покрывающая всю местность, в моем случае это 4096x4096.

МиксКарта

В этом миксмапе используются все 4 цветовых канала (r,g,b,a), чтобы описать, какая часть текстуры деталей должна отображаться в этом конкретном месте.Я использую красный цветовой канал, чтобы определить, насколько непрозрачен песок, зеленый — для травы, синий — для воды, а альфа — для камня.Эта микс-карта рассчитывается на основе карты высот при инициализации, и я использую высоты для определения этих значений.Например, вблизи уровня моря мне больше всего нужна вода, поэтому я устанавливаю высокое значение в синем канале и низкое значение в других каналах.По мере того, как я поднимаюсь выше в горы, я устанавливаю высокое значение альфа-канала цвета, так как мне нужно много текстуры камня, но я устанавливаю для всех остальных цветовых каналов более низкие значения.

Фрагментный шейдер

Затем эта микс-карта используется во фрагментном шейдере, где я беру эти цветовые каналы микс-карты и использую их для объединения текстур деталей.Вот код GLSL, который я использую для фрагментного шейдера:

uniform sampler2D alpha;
uniform sampler2D grass;
uniform sampler2D water;
uniform sampler2D rock;
uniform sampler2D sand;
uniform float texscale;

varying vec3 normal, lightDir ;

void main()
{
   // Get the color information
   vec3 alpha    = texture2D( alpha, gl_TexCoord[0].st ).rgb;
   vec3 texSand  = texture2D( sand, gl_TexCoord[0].st * texscale ).rgb;
   vec3 texGrass = texture2D( grass,  gl_TexCoord[0].st * texscale ).rgb;
   vec3 texWater = texture2D( water, gl_TexCoord[0].st * texscale ).rgb;
   vec3 texRock  = texture2D( rock,  gl_TexCoord[0].st * texscale ).rgb;

   // Mix the colors together
   texSand *= mixmap.r;
   texGrass = mix(texSand,  texGrass, mixmap.g);
   texWater = mix(texGrass, texWater, mixmap.b);
   vec3 tx  = mix(texWater, texRock,  mixmap.a);

   // Lighting calculations
   vec3 dl = gl_LightSource[0].diffuse.rgb;   
   vec3 al = gl_LightSource[0].ambient.rgb;
   vec3 n = normalize(normal);
   vec3 d = tx * (dl * max( dot ( n, lightDir), 0.0 ) + al );   

   // Apply the lighting to the final color   
   vec4 finalColor = vec4( min(d, 1.0), 1.0);
   gl_FragColor = mix(gl_Fog.color, finalColor, fogFactor);
}

Униформа texscale — это значение, определяющее, сколько раз детализированные текстуры накладываются на ландшафт.Более высокие значения сделают текстуры деталей более четкими, но есть риск сделать их более повторяющимися.

Другие советы

предварительное выпекание, безусловно, не является неэффективным.Фактически, это наиболее эффективно, потому что вашему коду времени выполнения не нужно выполнять какие-либо смешивания или другие вычисления.он просто отображает текстуру.Конечно, динамические методы предлагают упрощение инструментальной цепочки и больше возможностей.

ID, похоже, сделал сингл большим "мегатекстура" (мы говорим о 32К^2-128К^2) работают в QuakeWars.

На эту тему есть интересный вопрос с Кармаком на сайте

http://web.archive.org/web/20080121072936/http://www.gamerwithin.com/?view=article&article=1319&cat=2

(исходная ссылка в настоящее время кажется неработающей, но приведенная выше ссылка не является ссылкой, потому что у SO, похоже, есть проблемы со ссылками Интернет-архива;они хорошо выглядят в предварительном просмотре редактирования, а затем ломаются на главной странице).

Один из стандартных способов, используемый, например, в движке source(hl2), заключается в использовании альфа для каждой вершины для смешивания двух материалов.Материалы обычно состоят как минимум из альбедо и карты нормалей.В исходном движке разрешено использовать только 2 материала на материал «смешивания текстур», что довольно хреново.

Если вам нужно более двух материалов, вам придется смоделировать их, текстурируя различные смещения с разными текстурами, следя за тем, чтобы каждый отдельный тайл содержал не более двух материалов.

Использование альфа для каждой вершины, а не для каждого пикселя, выглядит довольно плохо.Как вы заметили в Oblivion, например, булыжники плавно переходят в песок.Есть исправление этого дефекта;вы используете другую текстуру, которая модулирует альфа попиксельно, так что трещины между булыжниками легко заполняются песком, но вершины булыжников остаются почти на уровне 1,0 альфа до тех пор, пока интерполированная вершина альфа не станет почти 0 для булыжника. материал.Это может сделать переход действительно красивым, а не просто уродливым пятном.

Вы также можете использовать текстуру с низким разрешением, содержащую альфы (но все равно намного больше, чем 1 альфа на вершину).Мозаичные текстуры местности могут иметь размер 2048x2048, но текстура, используемая для их смешивания, не требует разрешения каждого текселя.Текстура размером 256x256 (8 бит на тексель) занимает всего 96 КБ с MIP-картами.

Обычно области перехода создаются заранее, хотя кое-что можно сделать с помощью альфа-каналов и смешивания текстур.

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

используйте базовую текстуру с теми же текстурными координатами, что и альфа-текстура.базовая текстура может быть любой..спутниковое изображение или текстура травы..оно будет идеально сочетаться с формой вашей земли.

и попробуйте использовать бесшовные текстуры для травы, текстуры камней...это не решает, но делает вид, будто проблемы нет

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top