Поскольку во всём интернете я не нашёл толкового гайда по террейну в darkplaces, решил запилить сам, чтобы кому-то было менее больно, чем мне.
-
Скрыть объявление
Друзья, в это тяжёлое и непонятное для всех нас время мы просим вас воздержаться от любых упоминаний политики на форуме, - этим ситуации не поможешь, а только возникнут ненужные ссоры и обиды. Это касается также шуток и юмора на тему конфликта. Пусть войны будут только виртуальными, а политики решают разногласия дипломатическим путём. С уважением, администрация Old-Games.RU.
-
Скрыть объявлениеЕсли Вы видите это сообщение, значит, вы ещё не зарегистрировались на нашем форуме.
Зарегистрируйтесь, если вы хотите принять участие в обсуждениях. Перед регистрацией примите к сведению:
- Не регистрируйтесь с никами типа asdfdadhgd, 354621 и тому подобными, не несущими смысловой нагрузки (ник должен быть читаемым!): такие пользователи будут сразу заблокированы!
- Не регистрируйте больше одной учётной записи. Если у вас возникли проблемы при регистрации, то вы можете воспользоваться формой обратной связи внизу страницы.
- Регистрируйтесь с реально существующими E-mail адресами, иначе вы не сможете завершить регистрацию.
- Обязательно ознакомьтесь с правилами поведения на нашем форуме, чтобы избежать дальнейших конфликтов и непонимания.
С уважением, администрация форума Old-Games.RU
Darkplaces 3.1 (terrain tutorial)
Категории:
-
Не, ну конечно по 3-ей кваке есть различные туториалы, но все они на английском, устарели, и не охватывают darkplaces, в котором, разумеется, свои приколюхи. Итак...
Мне не особо нужны террэйновские просторы, но небольшой кусочек земли всегда пригодится. В самом первом уровне у меня, например, должно быть что-то вроде пустыни, откуда мы перемещаемся в город. Поначалу я сделал террейн патчем (patch). Объясняю, для тех, кто в танке: в первом Quake не было никаких патчей, всё было сделано брашами (brush).
Что это такое, и в чём разница? Brush - это цельный куб из которых состоит любой кваковский (хальфлайфовский, анриловский, они использовались повсеместно) уровень. И даже если кажется, что в первом Quake на уровне сложная геометрия, то это только кажется - всё там состоит из этих кубиков. Они могут быть какой угодно формы, но всегда это примитивы. Более того, уровень должен быть закрыт полностью этими брашами, чтобы не было дырок (leak), иначе он просто не скомпилится. Зачем все эти сложности?
А просто браши компилятся так, чтобы отрезать геометрию за собой, ту, которую не видно. Это называется occlusion - оптимизация уровня. И если вы думаете, то на современных машинах это не нужно, подумайте ещё раз. Одна только неоптимизированная трава на уровне съела у меня около 1000 fps. Поэтому terrain лучше делать тоже брашами.
Патчи-же появились впервые в Quake 3 (кажется?), и это просто геометрия с которой удобно работать (флаги, трубы, арки, и т.д.). Патчами удобно наводить красоты, они сглаживаются по умолчанию, и они могут быть сколько угодно дырявые - это декоративные элементы, они ничего не оптимизируют, и если сделать террейн патчем, то он будет рендериться отовсюду, полностью, если в кадре будет хоть кусочек, и разумеется сам не будет ничего за собой скрывать. Это не страшно, если это небольшой террейн, скажем в помещении, но проблема очевидна.
Итак, будем делать terrain как полагается. К слову, есть множество способов его сделать, и необязательно даже прибегать к сторонним утилитам, ведь по сути любой террейн - это тот же набор кубиков, и при желании его можно собрать прямо в редакторе. Так и делают иногда, если это скажем скала, и изголяться особо не надо, но целый большой террейн лучше генерировать где-то отдельно. Я использовал старинную прогу EasyGen.
Качаем EasyGen отсюда, и распаковываем. При запуске она попросит указать путь к игре и текстурам, и лучше бы это сделать. Поскольку у нас речь о darkplaces, путь будет выглядеть как-то так:
Дальше всё очень просто, выбираем на палитре цвет (абсолютно любой), подгружаем нужную текстуру, рисуем на террейне с помощью Shift+Ctrl+Lclick (лучше не смешивать три текстуры вместе - возникнут артефакты). Я не буду описывать все тонкости, туториал не про это, если что, то вот гайд по EasyGen на английском. Прога старая и не очень удобная, зато супер простая, ничего лишнего, чистый функционал. На всякий, вот тут можно посмотреть все горячие клавиши:
Итак мы создали наш супер-пупер террейн, и очень собой гордимся. Теперь нужно экспортировать его в игру. Однако тут есть нюансы. У меня лично не получилось вставить террейн в существующий уровень, хотя такая возможность предусмотрена. Он не сломался, не заглючил, нет, но террейн там просто не появился, и вообще, хрен знает, работает эта возможность или нет. Вместо этого я создал новый уровень (всё равно многие редакторы поддерживают копипаст между уровнями, так что это не проблема). Рекомендую сразу поставить галочку Insert into a skybox, это создаст закрытый уровень с небом, чтобы лишний раз не гемороиться. Также можно сразу поставить игрока на карту с помощью Add an info_player_start
Экспортируем карту в папку maps в нашем моде.
Итак уровень создан, и можно открыть его в редакторе. Я использую NetRadiant-custom. До этого пользовался TrenchBroom и хочу сказать что он очень удобный. Все остальные эти радианты тащат за собой болячки 30-летней давности. К сожалению TrenchBroom не поддерживает патчи. Уровень Q3 он может открыть, но с патчами ничего нельзя сделать, они просто подгружаются как объекты. Поэтому NetRadiant-custom. Открываем уровень и если всё сделано правильно, видим примерно такое:
Это в случае, если редактор уже настроен, и там прописаны все пути. Шейдер terrain который наложен на землю - стандартный, и с ним ничего не надо делать, EasyGen должен был прописать уже все необходимые пути. На обратой стороне terrainа должен уже стоять шейдер caulk - невидимый шейдер с работающим occlusion. Его не нужно трогать. Всё это должно работать по умолчанию, если редактор настроен как надо, но сейчас не о нём.
Выделяем дальние полигоны с помощью Ctrl-Lclick и назначаем на них шейдер неба (подразумевается, что он у вас уже есть).
Шейдер называется skies.shader и должен лежать в папке scripts.
Текстуры тоже должны лежать там где написано. Про скайбокс отдельная песня, вот туториал, если что.
//Название твоей текстуры
textures/q3/sky4
{
//это как раз та текстура, которая назначается в радианте
qer_editorimage textures/q3/sky4.tga
//чтобы текстура неба не освещала сама себя
q3map_backsplash 0 0
//насколько хорошо текстура излучает свет - тут можно ставить довольно высокие значения
q3map_lightsubdivide 2048
//яркость свечения неба
//q3map_surfacelight 1500
q3map_skyLight 300 5
q3map_lightmapFilterRadius 0 8
//параметры солнца: первые 3 номера - цвет (RG
, четвертая цифра - яркость,
//пятая - компас (север = 90 degrees, дальше, кажется, против часовой стрелки... 0, -90, 180 ),
//шестая - высота (12 часов дня = 90 градусов, горизонт (закат = 0 градусов,
//восход = 180 градусов (или наоборот)
//q3map_sun 1 1 0.98 10 160 60
surfaceparm sky //flags compiler that this is sky
surfaceparm noimpact
surfaceparm nomarks
surfaceparm nolightmap
surfaceparm nodlight
nopicmip
nomipmaps
//параметры неба - эта строка объясняет игре, что текстуры для отображения скайбокса нужно
//брать из папки /[mymapname]/[skyname] и читатьвсе файлы, начинающиеся на [skyname]*
skyparms gfx/env/n2 - -
}
Кстати NetRadiant-custom может показывать скайбокс прямо в редакторе. Клёвая возможность.
Позже посмотрим на шейдеры подробнее, а пока можно выбрать кусок террейна и нажать N. Это откроет окошко объектов (entity). Экспортёр уже превратил весь террейн в объект func_group. Не волнуйтесь, так надо.
Можно его выделить полностью, а пока - вот как он устроен. Как я и говорил - это просто набор примитивов:
Нажимаем кнопочку L или через меню выбираем EntityList. Это покажет все объекты в сцене. Тыркаем на func_group и террейн выделяется весь полностью. Этого можно и не делать, зато теперь вы узнали как это работает.
Теперь при выделенном террейне опять нажимаем N (окошко объектов) и добавляем строку _phong, и переменную 1. Нажимаем enter - строка должна появиться.
Честно говоря, я не знаю, фурычит это в формате Q3 или нет, но на всякий случай добавил. _phong добавляет сглаживание углов.
Сохраняем карту и компилим. Вот, например мои параметры для q3map2:
или:
[q3map2] -bsp -v -skyfix -custinfoparms -meta "[MapFile]"
[q3map2] -vis -v -saveprt "[MapFile]"
[q3map2] -light -custinfoparms -v -dark -shade -shadeangle 89 -sky 3 -fast -dirty -dirtmode 1 -dirtscale 3 -dirtdepth 128 -deluxe -deluxemode 0 -samples 2 -samplesize 32 -patchshadows -bounce 2 -bouncescale 5 -bouncegrid -gamma 3 -compensate 4 -threads 2 "[MapFile]"
Запускаем карту в нашей игре
и видим примерно такое:
Это в случае, если в шейдере неба прописано освещение. У меня прописано, это шейдер, который был выше. Если всё чёрное, можно просто вернуться в редактор и поставить тестовые лампочки самому.
Ура!!! Все работает... ведь правда? Правда?...
Не спешите. Вот такие артефакты terrain выдаёт в darkplaces, если включить динамическое освещение, в моём случае фонарик:
Это из за шейдера. EasyGen красавчик, он всё экпортировал правильно, и даже создал шейдер, в папке scripts, вот только это шейдер третьей кваки, и с тёмными местами дружит не особо. Заходим в папку scripts и ищем шейдер террейна, в моём случае это map01.shader, поскольку сохранённый файл карты в EasyGen так и назывался:
Открываем файл любым текстовым редактором, я советую Notepad++ и смотрим. Там должно быть что то такое:
textures/map01/terrain_0
{
surfaceparm nolightmap
q3map_novertexshadows
q3map_forcesunlight
{
map textures/terrain/ground_mud_01.jpg
rgbGen vertex
tcmod scale 0.125 0.125
}
}
Удаляем строчки выделенные красным для всех блоков, заканчивающихся на простую цифру типа _0.
Теперь меняем их, чтобы они выглядели вот так:
textures/map01/terrain_0
{
q3map_nonplanar
q3map_globalTexture
q3map_shadeangle 179
q3map_lightmapsamplesize 32
q3map_lightmapaxis z
q3map_lightmapBrightness 0.5
q3map_lightmapsampleoffset 8.0
q3map_tcGen ivector ( 384 0 0 ) ( 0 384 0 )
{
map textures/terrain/ground_mud_01.jpg
}
{
map $lightmap
blendFunc GL_DST_COLOR GL_ZERO
tcGen lightmap
}
}
По сути от старого блока осталось только название и путь к текстуре. Так и надо.
Теперь то же самое с блоками, заканчивающимися на строки типа _0to1:
Превращаем вот это:
textures/map01/terrain_0to1
{
surfaceparm nolightmap
q3map_novertexshadows
q3map_forcesunlight
{
map textures/terrain/ground_mud_01.jpg
rgbGen vertex
alphaGen vertex
tcmod scale 0.125 0.125
}
{
map textures/terrain/ground_rocks_01.jpg
rgbGen vertex
alphaGen vertex
tcmod scale 0.125 0.125
blendFunc GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA
}
}
В это:
textures/map01/terrain_0to1
{
q3map_nonplanar
q3map_globalTexture
q3map_shadeangle 179
q3map_lightmapsamplesize 32
q3map_lightmapaxis z
q3map_lightmapBrightness 0.5
q3map_lightmapsampleoffset 8.0
q3map_tcGen ivector ( 384 0 0 ) ( 0 384 0 )
{
map textures/terrain/ground_mud_01.jpg
}
{
map textures/terrain/ground_rocks_01.jpg
alphaGen vertex
blendFunc GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA
}
{
map $lightmap
blendFunc GL_DST_COLOR GL_ZERO
tcGen lightmap
}
}
Осторожно, не сотрите ненароком что нибудь нужное, типа второй текстуры. Последний блок
textures/map01/terrain.vertex
{
surfaceparm nolightmap
q3map_novertexshadows
q3map_forcesunlight
{
map textures/terrain/ground_mud_01.jpg
rgbGen vertex
tcmod scale 0.125 0.125
}
}
можно вообще закомментить, или стереть, не знаю зачем он нужен, разницы не заметил.
Можно добавить к любому из начальных блоков такую строчку, где нибудь в начале:
q3map_surfaceModel models/terrain/grass01.md3 24 0.025 1.5 3 1 122 1
Это создаст детали на данной текстуре, в данном случае траву. Разумеется моделька должна лежать по указанному пути и быть в нужном расширении.
Теперь сохраняем шейдер. Кстати, советую прописать его в файле shaderlist.txt, который лежит там-же, в папке scripts. Если не лежит, то создайте, и пропишите туда все файлы с расширением .shader, но без расширения, примерно так:
common
concrete
dp_custom
dfx_liquids
ground
map01
metal
skies
water
walls
Не забудьте, если будете ещё шалить в EasyGen, сохранитe карту (в самом EasyGen) под другим названием, а то при экспорте ваш шейдер опять сломается!
Итак, возвращаемся в редактор, и компилим всё по новой. Теперь всё должно выглядеть как-то так:
Уррра!!!
Теперь всё точно получилось, и нет артефактов!
Если-же нет, советую всё проверить и перепроверить, особенно шейдеры.
Можно поиграться с настройками размера текстур (только смотрите, чтобы и текстуры были одного размера(между собой), и цифры были одинаковые у всех, однако это важно только если игра пиксельная, с текстурами в низком разрешении).
Это строчка:
q3map_tcGen ivector ( 384 0 0 ) ( 0 384 0 )
И пошалить с размером и плотностью травы:
//q3map_surfaceModel modelpath density odds minscale maxscale minangle maxangle oriented
q3map_surfaceModel models/terrain/grass01.md3 24 0.025 1.5 3 1 122 1
Всё это, возможно, было сумбурно, что-то я упустил, что-то сам недопонял, но, в любом случае, надеюсь, это было полезно. Мне бы такой туториал, а то пришлось выяснять всё по старинке, методом тыка. Если что, задавайте вопросы в комментариях.
Всем бобра!Метки:
Комментарии
Сортировать комментарии по