ПрограммированиеФорумГрафика

Трехмерные спрайты - как реализовать? (4 стр)

Страницы: 1 2 3 4
#45
8:26, 9 июня 2011

daemolisher
так вы и описали собственно базовую реализацию метода - добавьте туда высоту и нормаль и сможете считать пересечение и самозатенение в рилтайме

warchief
да я сначала ошибся, нет там 3д текстуры. Просто 2д текстура (написал чуть выше). Снимок с одного ракурса: альбедо+нормаль+высота. Из-за возможности считать динамический лайт, пересечения и самозатенение и назвали 2.5 спрайтом) Одно дело сделать спрайт просто картинкой (упечь туда результат с тенями), а другое запечь альбедо+нормаль+высота и считать результат в каждом кадре. Вот на скринах выше именно запечен результат. Захотите вы сделать персонажа, который входит в комнату со свечкой в руках и уже освещение будет неправильное. 2.5 спрайт позволяет иметь динамический свет. Плюс можно в патиклы магии вставлять лайты, которые будут засвечивать атакуемого противника - пример, игра света и тени от фаербола на противнике.

#46
14:36, 9 июня 2011

daemolisher
> идеология 3D спрайтов мне не ясна
>
> Это нужно для 2D игр?
> Использующих движок поддерживающий 3D графику?
>
> 1. Берем любую 3D модель

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

Но вот мне интересно.. Предположим, что тест глубины будем делать, записывая в буфер глубины глубину точки (= z-позиция спрайта + значение карты высоты), то как быть с прозрачностью? То есть, мы имеем текстуру для спрайта, в которой альфа = 1 для каждого текселя изображения модели и альфа = 0 для текселя фона.. но между текселем модели и текселем фона есть несколько текселей с пормежуточным значением альфы. С одной стороны, если запишем в буфер глубины значение глубины для полупрозрачного пикселя, то будут косяки со спрайтом, который будет выводиться "позади" текущего спрайта, с другой стороны, если писать в буфер глубины значения для пикселей, у которых альфа выше некоторого порога (скажем, > 0.9), то у отрендеренного спрайта будут косячные края. Как разрулить этот косяк?

#47
17:26, 9 июня 2011

Ravlique
ты в доку загляни, хотя бы картинки посмотри. Там и вращать можно и прозрачность есть. Короче полное 3Д из одного квада. Предлагается эту технику использовать для рендера далеких объектов... типа экономия на геометрии, вот только не ясно оправдана ли она с не совсем легким ps.

#48
18:35, 9 июня 2011

Ravlique
> целесообразно только при ортогональной проекции.
нет

d.m.k
что за дока? то, что в демке - вращать нельзя, т.к. изображение - 2д текстура. Там даже авторы акцент делают на этом недостатке.
а прозрачность как будет работать в случае пересекающихся объектов?

#49
18:38, 9 июня 2011

вот эта дока http://www.inf.ufrgs.br/~oliveira/pubs_files/Policarpo_Oliveira_R… r_I3D2006.pdf

#50
21:27, 9 июня 2011

evirus
> > целесообразно только при ортогональной проекции.
> нет

хм, какие применения трехмерные спрайты могут иметь при перспективной проекции? Насколько понял, рендерить полупрозрачные трехмерные спрайты нельзя, так что всякий дым или туман им не отрендеришь.. на ум приходит только реализация кроны деревьев с помощью таких спрайтов.

d.m.k
> ты в доку загляни, хотя бы картинки посмотри. Там и вращать можно и
> прозрачность есть.

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

Вобще, довольно давно интересует вопрос: вот есть у нас текстура с нормалями для каждого пикселя объекта, который хотим отрендерить. Также на этой текстуре пиксели для фона имеют альфу = 0. И, грубо говоря, для каждого пикселя из текстуры мы в шейдере должны решить, означает ли этот пиксель собственно нормаль или фон, то есть взять пиксель и дальше просчитывать или пропустить его. Но ведь четкой границы между "полезными" пикселями и фоном нет (в большинстве случаев). Как определить тогда, брать этот пиксель или нет? Может есть какой-нить способ построения гладкой границы между полезными пикселями и фоном? Типа интерполяции чтоли.. хотя как тут интерполяцию применить - хз )

#51
22:42, 9 июня 2011

Ravlique
можешь брать все, альфа смешивание ни кто не отменял
если хочешь сделать альфа тест, то его можно как фф стейт выставить, ну или бранчинг по (alpha < 1.0) делать

#52
1:02, 10 июня 2011

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

#53
1:40, 10 июня 2011

Ravlique
для этого и нужен альфа тест, чтобы оставить пикселы только с альфой = 1

#54
7:58, 10 июня 2011

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

#55
8:17, 10 июня 2011

Ravlique
Да думаю обычный Deferred Shading, только геометрия не рендерится, а в ГБуффер пишется уже отрендеренная заранее картинка.

#56
14:08, 10 июня 2011

Возможно ли как то тени сделать, например, фейковые, если все объекты заданы спрайтами-(цвет, нормали, карта высот) ?
типа такого
shadows | Трехмерные спрайты - как реализовать?

#57
14:39, 10 июня 2011

black_ninja
> Возможно ли как то тени сделать, например, фейковые, если все объекты заданы
> спрайтами-(цвет, нормали, карта высот) ?
> типа такого
Если источник направленный, параллельный то можно сделать спрайты тени и выводить их в теневую текстуру а потом уже как обычное освещение.

#58
15:17, 10 июня 2011

susageP
Если не сложно, можете подробнее объяснить
спрайты-тени - это сам спрайт, где цвет заменен на черный?

и про вывод освещения и теней подробнее плиз

#59
15:26, 10 июня 2011

Если источник направленный, параллельный и не изменяется во времени ПОСТОНЯННЫЙ...

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

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

Страницы: 1 2 3 4
ПрограммированиеФорумГрафика

Тема в архиве.