Большая, медленно вращающаяся планета графика для игры - PullRequest
5 голосов
/ 17 декабря 2010

Для компьютерной игры, которую я разрабатываю, я хотел бы нарисовать очень большую (~ 500 пикселей) графику медленно вращающихся планет. Эти графики предназначены для впечатления. Какой лучший способ сделать это?

  • Я мог бы предварительно визуализировать каждый кадр, но при 500px и периоде вращения 10 секунд это нелепое количество данных на планету.
  • Я мог бы использовать 3D-движок и отобразить текстуру планеты на меш, приближающийся к сфере, но я боюсь, что при 500px количество полигонов должно быть огромным, чтобы он выглядел хорошо.
  • Я мог бы написать своего рода трехмерный движок, который делает только эффективную визуализацию текстурированной сферы, путем преобразования координаты x / y каждого пикселя вида в координатное пространство текстуры сферы - но это необходимо и не может выигрыш от графического ускорения.
  • Что-то еще, о чем я не подумал?

Вот пример анимированного GIF того, что я имею в виду. (При 100x100 пикселях и 60 кадрах он уже довольно большой, извините.) Вообразите это намного, намного больше, вращаться намного медленнее и плавнее анимировать:

alt text

Но если бы это были 500x500 пикселей и 10 x 25 = 250 кадров, мы бы говорили о сотнях МБ данных, поэтому этот простой подход не работает.

Ответы [ 7 ]

6 голосов
/ 18 декабря 2010

Fracplanet может сохранять карты текстур "сферкарты" (и карты рельефа);см. изображения в нижней части галереи .Они предназначены для последующего считывания в приложение и сопоставления их с геометрией сферы с относительно низким разрешением для достижения того эффекта, который, я думаю, вы ищете.Этот подход будет использовать меньше памяти, чем предварительно обработанный анимационный подход или исходную модель полигона с полным разрешением.

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

Альтернативная идея: сделать один квадратный четырехугольник достаточно большимпокрыть планету.Для каждого пикселя в этом, выполните пиксельный шейдер, который вычисляет точку пересечения экрана и лучевой сферы (если есть).Посмотрите цвет текстуры планеты (принимая во внимание время и вращение планеты).Избегает необходимости много полигонов и дает вам точную сферу.

2 голосов
/ 18 декабря 2010

Архаичный способ сделать это состоит в том, чтобы предварительно создать изображение сферы, но вместо того, чтобы хранить цвета текстуры поверхности в каждом пикселе, вы сохраняете текстуру UV в качестве справочной таблицы.Теперь вы можете визуализировать сферу, нарисовав предварительно отрендеренное изображение, но ищите соответствующий тексель в текстуре поверхности планеты по ультрафиолетовому излучению, найденному на изображении.Чтобы заставить планету вращаться, вы можете добавить смещение к ультрафиолетовой координате, найденной на изображении в таблице поиска.Удостоверьтесь, что вы используете дополнение модуля так, чтобы структура хорошо завернулась.Если вы хотите затенение на планете, вы можете добавить это как отдельный проход поверх текстуры.

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

2 голосов
/ 18 декабря 2010

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

Я рекомендую текстуру карты куба и соответствующую кубоподобную сетку треугольника: начните ссетка вершин в форме (поверхности) куба относительно начала координат и нормализует каждую трехмерную координату в единичном радиусе.Это облегчит вычисление координат текстур.

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

1 голос
/ 17 декабря 2010

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

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

Если вы сделаете кадр 256x256, вы можете разместить 16 на 1024 текстуре, чтобы 60 кадров заняли только 4 текстуры.При использовании сжатия DXT3 вы можете ожидать, что это будет около 1 МБ на текстуру (довольно разумно).

1 голос
/ 17 декабря 2010

Если вы пойдете на предварительный рендеринг, как насчет алгоритма, который будет воспроизводить требуемые кадры во время игры, основываясь на вероятности того, что игрок на самом деле их увидит - от «определенного» падения до все более невероятного на основео том, где игровой движок может позволить игроку показывать время в x секундах, в зависимости от того, какой кадр должен быть виден в это время, вплоть до «невозможного» и, следовательно, не отображаемого?

0 голосов
/ 17 декабря 2010

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

Я могу порекомендовать посмотреть на sf.net/projects/a3d, который легко изучить. draw_asteroids использует вызов glRotate, вот и все.

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

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