Laynos
Нет у меня примера, если на распространение света должны влиять все спрайты, то выходит что каждый пиксель спрайта может влиять на источник - думаю это нифига не простая задачка и до вас ее врядли кто-то решал. Если получиться - то Это просто выход на новый уровень в системах света. Тут сначала надо задуматься какие пиксели и как должны влиять, т.е. У них должен появиться некий параметр - прозрачность для источника света и это не то же самое что альфа канал в текстуре.
Если делать на уровне геометрии, то тут немного проще - такой вопрос - вы можете построить около источника света список треугольников - т.е. расчитать и определить область которая должна быть освещена? Т.е. куда попадает свет? Тут не нужны шейдеры.
leonardo98
> Нет у меня примера, если на распространение света должны влиять все спрайты, то
> выходит что каждый пиксель спрайта может влиять на источник - думаю это нифига
> не простая задачка и до вас ее врядли кто-то решал.
Shadow mapping во всех играх почти используют. Я думаю, его можно и для 2D адаптировать. Рендерить со стороны источника света в 1D текстуру глубины, а шейдере читать из неё и проводить сравнения. Можно эту идею развить наверное, но мне лень. Всё равно наверное ТС не осилит.
Laynos
во Флеш это делает так:
1. создаешь изображение круга с градиентной заливкой цветом и альфой.
от центра к краям.
2. выводишь это изображение с режимом смешивания BlendMode.OVERLAY.
3. теней не будет, их нужно отдельно просчитывать.
gammaker
> Shadow mapping во всех играх почти используют. Я думаю, его можно и для 2D
> адаптировать. Рендерить со стороны источника света в 1D текстуру глубины, а
> шейдере читать из неё и проводить сравнения. Можно эту идею развить наверное,
> но мне лень. Всё равно наверное ТС не осилит.
Можно и просто в пиксельном шейдере лучи к источникам света покидать. Если еще и высоту каждого пикселя учитывать, то тени красивые получаются.
gammaker
Shadow map тут никак не прикрутить, там фишка в том что можно поставить камеру в точку источника света, в 2д это получиться бесполезная полосочка(в лучшем случае)
unnamed
Интересная идея, звучит красиво, но как определять затенен пиксель или нет - пробегать все пиксели до источника света?
leonardo98
> Интересная идея, звучит красиво, но как определять затенен пиксель или нет -
> пробегать все пиксели до источника света?
необязательно все. нужно выбрать определенный шаг.
> Интересная идея, звучит красиво,
да и работает неплохо, правда довольно медленно. Хотя планшет(на интеле) спокойно тащит в full hd.
Ну, тогда вопрос другой немного.
Как с помощью шейдера сделать:
1)Чтобы вся картинка была чуть затенена, типа сейчас вечер\ночь
2)"Свет" рендерился с помощью такой текстуры:
?
up
Laynos
> Ну, тогда вопрос другой немного.
> Как с помощью шейдера сделать:
> 1)Чтобы вся картинка была чуть затенена, типа сейчас вечер\ночь
> 2)"Свет" рендерился с помощью такой текстуры:
Тут и шейдеры не обязательно использовать.
1) Создаешь рендер таргет размером с экран. Чистишь его темносиним цветом (это будет амбиент).
2) Затем с адиттивным блендингом рисуешь в рендер таргет пятно света в нужной тебе позиции.
3) Рисуешь объекты сцены на экран как обычно, без освещения.
4) Сверху на экран твой рендер таргет с мультипликативным блендингом - бац.
SunnyBunny
> 1) Создаешь рендер таргет размером с экран. Чистишь его темносиним цветом (это
> будет амбиент).
только не обязательно в данном случае размер с экран, можно сделать меньше и увеличивать программно, пиксельной точности с тенями не требуется
leonardo98
Да, ты прав
SunnyBunny
о! Картинка немного яснее становится. Но есть немного впросов
> 4) Сверху на экран твой рендер таргет с мультипликативным блендингом - бац.
Эт как?..SunnyBunny
> 1) Создаешь рендер таргет размером с экран. Чистишь его темносиним цветом (это
> будет амбиент).
Что имеется ввиду под render target? Frame Buffer или что? О_о
SunnyBunny
> Затем с адиттивным блендингом рисуешь в рендер таргет пятно света в нужной
> тебе позиции.
Как? о_О
Я буду вам ОЧЕНЬ признателен если чуть-чуть подробнее объясните... Выручаете прямо!
SunnyBunny
> Чистишь его темносиним цветом (это будет амбиент).
А если менять этот цвет, то можно сделать смену дня и ночи?
sf::RenderTarget нашёл. Ииии? :с
Laynos
>> 4) Сверху на экран твой рендер таргет с мультипликативным блендингом - бац.
> Эт как?
Нарисуй на экран спрайт, занимающий всю площадь экрана, с текстурой из твоего рендер таргета и режимом смешивания Multiply.
Laynos
> Что имеется ввиду под render target? Frame Buffer или что? О_о
Да, в OpenGL это называется Frame Buffer. Но раз ты используешь SFML, там есть класс, облегчающий твою задачу.
Посмотри это http://www.sfml-dev.org/documentation/2.0/classsf_1_1RenderTexture.php
И тут http://sfml-dev.org/tutorials/2.1/graphics-draw.php раздел Off-screen drawing
Laynos
>> Затем с адиттивным блендингом рисуешь в рендер таргет пятно света в нужной тебе позиции.
> Как? о_О
Спрайтом
Laynos
> А если менять этот цвет, то можно сделать смену дня и ночи?
Конечно
Тема в архиве.