Я работаю над некоторыми играми на основе спрайтов. Для г-заказа спрайтов в основном существует альтернативы
1) рисовать в правильном порядке - может быть трудными для дозирования
2) использовать ортогональную проекцию и тестирование глубины - может быть хлопотно с полупрозрачностью
я одобряя 2), однако я хотел бы сохранить перспективную проекцию, чтобы позволить несколько простых 3D-анимаций. Карты переворачиваются в 3d и т. Д. Если я это сделаю, различия в z-буфере могут/привести к масштабированию спрайтов, поскольку объекты находятся на разных расстояниях до камеры.
Я думал о масштабировании спрайтов на основе их расстояния, чтобы отменить проекцию. Но тогда я получу интерференцию с 3D-анимированными объектами поверх «неплоской» 2-й сцены.
Я предполагаю, что разумный способ - пойти на орфографическую сцену 2d и сделать редкие 3D-анимации на втором этапе с «клонированными» объектами поверх нее. Но может быть, у кого-то другая идея?
Сценарий OpenGL с использованием z-буфера с перспективной проекцией и без искажений. Возможное?
mikkokoos ответить привели к решению. Через дополнительное значение глубины вершинный шейдер может регулировать z-координаты всех вершин в пространстве клипов, чтобы вытолкнуть их на разные уровни глубины. Реальные 3d-координаты могут оставаться при z = 0. Изменение пространства клипа устраняет проблемы перспективы, поэтому перспективная проекция может использоваться в сцене.
Чтобы использовать разные углы камеры, чем просто перпендикулярно плоскости спрайта, вместо того, чтобы нажимать вершины спрайта на фиксированные слои, их следует отрегулировать с помощью слоя layerOffset * layerIdx. Поэтому для каждого слоя вершина подталкивается на один шаг ближе к камере.
Примечание: с фиксированными слоями может быть очень сложно определить правильные координаты пространства клипа, поскольку плоскость xy не обязательно находится в центре.
Открытые вопросы: Разрешение пространства для клипов? Самая маленькая разница в клипе? Возможные помехи между нажатыми спрайтами и реальными 3D-элементами? Чтобы предотвратить овердрайз плоскостных спрайтов от трехмерных объектов, все объекты, не содержащие спрайтов, должны быть сдвинуты с помощью максимально используемого смещения слоя. Вычисление смещения слоя из доступного пространства перед камерой, вероятно, было бы хорошей идеей.
Достигнуто: Спрайты организованы на 2-й плоскости в перспективной проекции 3d-сцены. Спрайты закрываются на основе глубины фрагмента, рассчитанной в шейдерах. Рисование все еще может быть выполнено в пакетах текстур.
Примечание2: Я все еще считаю, что вы делаете два раунда тиражей. 1-й для 2-х спрайтов с заданной глубиной, второй для спрайтов или объектов, которые не «прикреплены» к плоскости спрайта. Очистка буфера глубины между ними и добавление невидимой плоскости спрайта для отсечения. (Если нет объектов за сценой не допускаются)
Pics:
http://www.imagebam.com/image/109f6e356918267
http://www.imagebam.com/image/a2085f356918275
вы можете написать глубину самостоятельно после проекции. https://www.opengl.org/sdk/docs/man/html/gl_FragDepth.xhtml Чтобы уточнить: визуализируйте ваши объекты с перспективой проекции на одной глубине. После этого используйте gl_FragDepth для размещения ваших объектов в правильном порядке. – dari
Черт, моя ошибка. Я должен был упомянуть OpenGL ES 2.0. Afaik нет поддержки gl_FragDepth. Сожалею! Должен был сказать это раньше. В любом случае, спасибо! –
Используйте перспективную проекцию вместо 'glPolygonOffset'. https://www.opengl.org/sdk/docs/man/html/glPolygonOffset.xhtml – dari