2014-10-07 6 views
3

Я работаю над некоторыми играми на основе спрайтов. Для г-заказа спрайтов в основном существует альтернативы
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

+1

вы можете написать глубину самостоятельно после проекции. https://www.opengl.org/sdk/docs/man/html/gl_FragDepth.xhtml Чтобы уточнить: визуализируйте ваши объекты с перспективой проекции на одной глубине. После этого используйте gl_FragDepth для размещения ваших объектов в правильном порядке. – dari

+0

Черт, моя ошибка. Я должен был упомянуть OpenGL ES 2.0. Afaik нет поддержки gl_FragDepth. Сожалею! Должен был сказать это раньше. В любом случае, спасибо! –

+0

Используйте перспективную проекцию вместо 'glPolygonOffset'. https://www.opengl.org/sdk/docs/man/html/glPolygonOffset.xhtml – dari

ответ

2

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

gl_Position.z=(u_zOffset-1.0)*gl_Position.w; 

Это «придавить» сетку, так что, если ваши сетки являются более сложными, и в зависимости от используемого DepthFunc, вы можете иметь диапазон вместо. (Видимый диапазон от -1 до 1):

gl_Position.z=((1.0+(gl_Position.z/gl_Position.w))*u_zRange+u_zOffset-1.0)*gl_Position.w; 

Где u_zRange является 2f/(number_of_layers) и u_zOffset является u_zRange * layer_id. Слой 0 является самым близким.

EDIT: Реферат: Поместите все через матрицу MVP на том же расстоянии от камеры, а затем измените значение Z в вершинном шейдере, чтобы заказать их на экране.

+0

Хорошо, это похоже на неловкое решение. Но я не уверен, полностью ли понимаю. Вы не предлагаете, я должен просто нажимать на них все плоские на одной плоскости проекции в шейдере фрагмента, но в определенном диапазоне? Являются ли вызовы gl_Position не влиять на значения глубины результирующих фрагментов и тем самым нарушать z-порядок? –

+0

Вы находитесь в клип-пространстве в этот момент (см. [This] (http://www.songho.ca/opengl/gl_transform.html)), чтобы они не отображались на экране (обычное/освещение и т. Д. Вычисления не затронут). Это влияет на z-буфер, чтобы получить то, что вы хотите от OpenGL. Таким образом, мы не нарушаем его, а «фиксируем» его :) – mikkokoo

+0

Вы, конечно, правы. Тогда как я буду обрабатывать 3D-преобразования? Если я применил 3dTransform к патчу спрайтов и запустил бы его через 2d-плоскость, мне пришлось бы «смещать» координаты z соответственно? Как я могу убедиться, что все изменения в пространстве клипов не мешают отображению не выровненных спрайтов? –

1

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

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

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

Может быть, это сумасшедшая идея, тем не менее, я надеюсь, что это помогает

+1

Да, это то, что я планировал сделать. (Пока я не прочитал ответ mikkokoos) Объекты те же самые. Вот почему я упомянул о клонах. Например. у вас есть 2-карточная игра, но вы хотите иметь некоторые 3D-анимации, когда вы рисуете или переворачиваете карту. Или у вас есть сетка для плитки в качестве фона и хотите, чтобы все плитки обернулись вокруг или взорвались как частицы и т. Д. –

+0

почти такие же сценарии использования, о которых я думал (например, Magick the Gathering или, для ностальгиков, подобных мне, Rick Dangerous 2 http : //www.mobygames.com/game/rick-dangerous-2 :)). Престижность к миккокуам за его (очень хороший) ответ, хотя мне интересно, ради того, чтобы быть убийцей, будет ли использование перспективы и ошибок округления привести к нежелательному масштабированию, если вообще когда-нибудь (на дешевом оборудовании, может быть?) , [Извините, я делаю затенение на моем Nexus5 MALI, и я не могу не быть в пессимистической стороне, в последнее время ...: /] – Rick77