Афиша рендеринга без искажений?

8

Я использую стандартный подход к рекламному щиту в Unity, который в порядке, но не идеален:

transform.LookAt(camera)

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

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

Есть ли у кого-нибудь примеры этого подхода (если возможно, GLSL), или какие-либо предложения относительно того, почему это обычно не делается таким образом (по сравнению с вышеупомянутым методом четырехкратного преобразования)?

РЕДАКТИРОВАТЬ: Я был в замешательстве, спасибо Натан за голову. Конечно, заставляя квадроциклы смотреть на камеру, они не становятся параллельными плоскости обзора - это то, что мне нужно.

инженер
источник

Ответы:

4

Меня смущает ваш вопрос, потому что в стандартном перспективном проектировании рисование билборда параллельно плоскости обзора не вносит искажения. Это эквивалентно переносу изображения в область просмотра с некоторым масштабированием, где масштабирование зависит от глубины (перпендикулярного расстояния от плоскости обзора).

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

Натан Рид
источник
1
@NickWiggill Я не совсем знаком с Unity, но если вы хотите, чтобы квадраторы были обращены к плоскости обзора, а не к камере, вы по существу устанавливаете матрицу вращения квадрата равной матрице вращения камеры. Вам может понадобиться дополнительное вращение на 180 градусов в зависимости от того, как построены квадраты.
Натан Рид
1

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

Изменить: эта статья была полезна для меня для рекламных щитов и рекламы:

http://www.flipcode.com/archives/Billboarding-Excerpt_From_iReal-Time_Renderingi_2E.shtml

Я не знаю, насколько это условно, но я называю это «обманчивым», когда перспектива сохраняется, и «рекламным щитом», когда это не так.

notlesh
источник
Я кое-что понял. Я использую Unity iOS / Android, и некоторые из старых устройств являются OpenGL ES 1.1 - таким образом, фиксированный конвейер. Так что делать это без шейдера - вот ключ. Как бы я поступил так без шейдера?
Инженер
1
Это, вероятно, более дешевый способ сделать это в любом случае. В моем коде на моих спрайтах есть флажок, который диктует, нужно ли рекламировать или подставлять перед тем, как делать розыгрыши. Когда это так, я просто беру текущую матрицу, устанавливаю верхнюю 3x3 на тождество, а затем обновляю текущую матрицу.
notlesh
Ах ... цените дополнительные детали, но, поскольку у меня нет доступа к вызовам GL (Unity абстрагирует их), я думаю, что я довольно обескуражен этим подходом.
инженер
Вы не можете получить или установить текущую матрицу? Я никогда не использовал единство ... Если нет, то, возможно, попробуйте поискать "рекламный щит единства" или "
создание