Рендеринг 3D карт в играх
У меня есть несколько вопросов о картах в 3D-играх (например, World of Warcraft) и о том, как программисты рендерит их, поэтому вместо того, чтобы открывать ветку для каждой из них, я решил спросить их все в одном месте.
Можно ли "сгладить" края гор с помощью некоторой техники, или единственно возможным решением было бы использование большего количества вершин в карте высот?
Я не прав и считаю, что они используют какую-то технику для этого, поскольку они просто отдают достаточное количество вершин для каждой горы?
Посмотрите на это изображение: http://wow.gamona.de/wp-content/gallery/dun-morogh/dun_morogh_008.jpg Несколько вопросов о том, как визуализировать этот вид сцены:
- Как мне сказали, в играх с открытым миром, таких как WoW, для рендеринга рельефа используются карты высот, откуда они знают, где рисовать все остальное? (деревья, дома, заборы, вода и т. д.).
- Как они делают подземные районы? (Внутри горы огромный замок)
- Обратите внимание, что каждый выступ использует около 2 текстур для отображения (снег и камень). Каким может быть алгоритм, который они используют, чтобы знать, когда брать каждую текстуру? Это не похоже, что это зависит от нормалей. (Я не думаю, что они даже генерируют нормали для своей местности.)
- Также не похоже, что они используют скайбокс для горизонта. Какая техника это может быть?
- Не могли бы вы назвать другие интересные приемы, которые вы заметили, чтобы я мог изучить?
В настоящее время я изучаю OpenGL, но я тоже пометил DirectX, поскольку эти вопросы не относятся к API.
4 ответа
По вашей карте высот довольно сложно отличиться (в первую очередь потому, что на ней нет освещения), но я бы сказал, что почти точно, что в ваших примерах они используют карты высот с высоким разрешением, чем вы.
Теперь, в отличие от того, что предлагают другие авторы, очень маловероятно, что ландшафт моделируется в пакете трехмерного моделирования. Также очень маловероятно, что они используют B-сплайны для визуализации ландшафта.
Большая проблема с использованием карты высот с более высоким разрешением - это требования к памяти. Для этого существует несколько различных решений, которые "оптимизируют" данные карты высот, хранящиеся в памяти. Соседний пейзаж не требует столько деталей, как пейзаж далеко.
Действительно хорошая техника для визуализации VAST-объектов с высокой детализацией геометрии ландшафта - это геометрические клип-карты. Это довольно сложно, хотя. Еще одна схема, которую я использовал для большого успеха в прошлом, это Geo-Mipmapping. Это очень просто и очень быстро. Это также дает отличные результаты, если вы применяете методы трилинейной фильтрации к своим Geo-MIP-картам. Также довольно тривиально написать асинхронный загрузчик чанка для такого ландшафта, чтобы обеспечить хорошую потоковую передачу огромных ландшафтов.
В любом случае я отвечу на другие ваши вопросы.
Как предполагает hbdavehb, у них будет редактор, который загружает ландшафт, и они могут затем размещать элементы на карте (а также, скорее всего, как редактирование ландшафта). Модели будут созданы в 3DS Max или Maya, а затем загружены в редактор для размещения.
Они отображаются с другой формой рендерера. Часто средство визуализации портала или, возможно, средство визуализации BSP.
Этот метод известен как разбрызгивание текстуры.
Выглядит как скайбокс для меня. Могу ли я угадать динамический рендеринг на скайбокс?
Список огромный. Но я бы посоветовал изучить различные методы отображения изображений, такие как рельефное отображение (особенно нормальное отображение), отображение куба, отображение параллакса, отображение смещения. Тогда были бы методы освещения, такие как глобальное освещение, освещение Фонга (не то же самое, что затенение Фонга), двунаправленные функции распределения отражательной способности и предварительно вычисленная передача излучения. Это только царапает поверхность. Я настоятельно рекомендую хорошо прочитать. Компьютерная графика: принципы и практика Foley et al. отличная книга по рендерингу. Серия GPU Gems тоже очень хороша. Для истории методов 3D-рендеринга и, на мой взгляд, все еще очень полезной книги, стоит также посмотреть Черную книгу Майкла Абраша.
Удачи!
В дополнение к ответу Тайлера Дурдена я хочу коснуться нескольких ваших моментов.
Вероятно, они разработали свой собственный редактор, который экспортируют и передают своему средству визуализации. Таким образом, разработчики могут войти и поместить дерево в точку, а затем средство визуализации знает, как нарисовать модель дерева в этой точке. Или они делают что-то вроде этого: http://mollyrocket.com/casey/stream_0017.html, в котором они "заполняют" пустую область такими вещами, как трава (как показано в этом примере), деревья и т. Д.
Так же, как они визуализируют внешние области:p
Этого можно добиться с помощью ссылки dari, опубликованной в ответ на ваше сообщение, или наложив текстуру из карты высот, как вы упомянули.
Я не уверен в скайбоксе.
Взгляните на некоторые из опубликованных ссылок, вы наверняка сможете потратить немало времени на исследования:)
Я обнаружил, что самый простой способ сгладить ландшафт - после преобразования в плавающие объекты применить фильтр свертки к вершинам. Это метод обработки изображений, но он хорошо работает и с данными из 8-битных карт высот.
Вот источник C++, который я использовал несколько лет назад.
void CGround::CHeightmap::_SmoothTerrain(int passes)
{
float* NewHeightData;
while (passes--)
{
// Note: m_Size.X and m_Size.Y should be equal and power-of-two values
NewHeightData = new float[m_Size.X * m_Size.Y];
for (int x = 0; x < m_Size.X; x++)
{
for (int y = 0; y < m_Size.Y; y++)
{
int adjacentSections = 0;
float sectionsTotal = 0.0f;
if ((x - 1) > 0) // Check to left
{
sectionsTotal += m_Heights[(x - 1)*m_Size.Y + y];
adjacentSections++;
if ((y - 1) > 0) // Check up and to the left
{
sectionsTotal += m_Heights[(x - 1)*m_Size.Y + y - 1];
adjacentSections++;
}
if ((y + 1) < m_Size.Y) // Check down and to the left
{
sectionsTotal += m_Heights[(x - 1)*m_Size.Y + y + 1];
adjacentSections++;
}
}
if ((x + 1) < m_Size.X) // Check to right
{
sectionsTotal += m_Heights[(x + 1)*m_Size.Y + y];
adjacentSections++;
if ((y - 1) > 0) // Check up and to the right
{
sectionsTotal += m_Heights[(x + 1) * m_Size.Y + y - 1];
adjacentSections++;
}
if ((y + 1) < m_Size.Y) // Check down and to the right
{
sectionsTotal += m_Heights[(x + 1)*m_Size.Y + y + 1];
adjacentSections++;
}
}
if ((y - 1) > 0) // Check above
{
sectionsTotal += m_Heights[x*m_Size.Y + y - 1];
adjacentSections++;
}
if ((y + 1) < m_Size.Y) // Check below
{
sectionsTotal += m_Heights[x*m_Size.Y + y + 1];
adjacentSections++;
}
NewHeightData[x*m_Size.Y + y] = (m_Heights[x*m_Size.Y + y] + (sectionsTotal / adjacentSections)) * 0.5f;
}
}
delete m_Heights;
m_Heights = NewHeightData;
}
}
Увеличить значение passes
чтобы получить больше сглаживания.
Ответить на ваш 1) - отдельно. Они имеют список объектов if и просто размещают их поверх карты высот.
2) - по-другому. Подземелья обычно представляют собой обычные сетки.
3) Вы можете использовать нормаль, высоту, дополнительные данные текстуры, интерпретируемые по-разному или любую комбинацию выше
Разработчики Blizzard используют Autodesk 3ds max для создания моделей. Если вы изучите возможности и технологии этого пакета, вы увидите, как они достигают своего эффекта. Обратите внимание, что ландшафтные модели используют неоднородные b-сплайны (NURB), которые придают им округленный вид.