Несколько текстурных изображений, смешанных на трехмерной поверхности - PullRequest
10 голосов
/ 10 июля 2009

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

Я просто использую огромную предварительно запеченную текстуру? Это кажется очень неэффективным, когда я могу использовать существующие текстуры. Так тогда я использую огромную альфа-карту для каждой существующей текстуры? В теории это звучит нормально для меня, но как мне на самом деле поступить так и каковы последствия? Я действительно не знаю, с чего начать, и мои поиски в 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, но в то время я не обращал на это особого внимания, и теперь, когда лето, у меня нет доступа к библиотеке моего университета, чтобы проверить ! Я сейчас ищу оглавления и буду редактировать, если найду его, но я все равно не смогу прочитать его до середины августа.

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

Ответы [ 6 ]

9 голосов
/ 10 июля 2009

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

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

MixMap

Этот микскарта использует все 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);
}

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

1 голос
/ 30 апреля 2011

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

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

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

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

1 голос
/ 10 июля 2009

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

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

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

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

1 голос
/ 10 июля 2009

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

0 голосов
/ 12 июля 2009

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

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

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

0 голосов
/ 10 июля 2009

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

...