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

Overlay-блендинг как в Фотошопе

#0
22:10, 10 сен 2014

Нужно светить на букашек и червяков из различных источников света.
Сейчас получается так:

FogLight | Overlay-блендинг как в Фотошопе

Вот таким образом:

_d3dDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
_d3dDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ONE);

Накладываю вот такой спрайт света:

LightSprite | Overlay-блендинг как в Фотошопе

Получается аддитивное наложение, это чуть лучше чем просто как есть накладывать, но всё равно свет ватный!

В идеале хотелось бы получить вот такой эффект:

OverlayLight | Overlay-блендинг как в Фотошопе

Это я в графическом редакторе наложил спрайт света в режиме Overlay.

Как можно сделать хоть что-нибудь похожее?
Желательно через FFP, но и шейдером пойдёт.

#1
22:24, 10 сен 2014

Kozinaka
Пробуй шейдером

#2
22:42, 10 сен 2014

Andrey
> Пробуй шейдером
Ха, если бы проблема была исключительно в выборе между FFP и шейдером, то я бы не стал уважаемое сообщество беспокоить.

Есть кто-нибудь со значком «Хочешь сделать Overlay шейдером — спроси меня как!»?

#3
22:47, 10 сен 2014

Вот очень хорошая статья к ознакомлению - http://mouaif.wordpress.com/2009/01/05/photoshop-math-with-glsl-shaders/

#4
22:47, 10 сен 2014

а если под современное железо, то можно и через данное расширение - http://www.opengl.org/registry/specs/NV/blend_equation_advanced.txt

#5
22:57, 10 сен 2014

Попробуй вместо освещения затемнять остальную картинку:

_d3dDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ZERO);
_d3dDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_SRCALPHA);


А вообще попробуй так:

_d3dDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_DESTCOLOR);
_d3dDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ONE);
#6
23:16, 10 сен 2014

есть не NV specific:
http://www.opengl.org/registry/specs/KHR/blend_equation_advanced.txt

#7
23:16, 10 сен 2014

Neill
> Вот очень хорошая статья к ознакомлению -
> http://mouaif.wordpress.com/2009/01/05/photoshop-math-with-glsl-shaders/
Спасибо! Попробую вкурить!

Che@ter
> Попробуй вместо освещения затемнять остальную картинку

DarkLight | Overlay-блендинг как в Фотошопе

Увы, не то.

Che@ter
> А вообще попробуй так

SpotLight | Overlay-блендинг как в Фотошопе

А вот это интереснее! Эффект - что нужно, не хватает только вывода по маске. Может можно в два прохода как-нибудь сделать? Я похожим образом блики на стёкла накладываю, вот в этой теме подсказали: http://www.gamedev.ru/code/forum/?id=184279 Спасибо за идею, попробую!

HolyDel
> есть не NV specific:
> http://www.opengl.org/registry/specs/KHR/blend_equation_advanced.txt
Боюсь, у меня DirectX 9.

#8
23:39, 10 сен 2014

Kozinaka
> А вот это интереснее!
Для такого эффекта нужно накладывать черно-белую градиентную картинку, в которой нет прозрачности.

Kozinaka
> > Попробуй вместо освещения затемнять остальную картинку
Да, если много источников освещения - такой вариант не пойдет.

#9
7:09, 11 сен 2014

Kozinaka
В этом посте я писал, как 2д свет можно сделать: http://www.gamedev.ru/code/forum/?id=192224&page=2#m23

#10
7:40, 11 сен 2014

Che@ter
> Для такого эффекта нужно накладывать черно-белую градиентную картинку, в
> которой нет прозрачности.

BrightLight | Overlay-блендинг как в Фотошопе

Ура! Che@ter, то, что доктор прописал! На лампах подсветка щелей поползла, потому что там свет с альфой, я только круглое пятно света для пробы заменил.
Спасибо! Буду экспериментировать.

SunnyBunny
> В этом посте я писал, как 2д свет можно сделать:
> http://www.gamedev.ru/code/forum/?id=192224&page=2#m23

О, спасибо за информацию! Попробовал мультипликативный блендинг сделать к текущему варианту, который предложил Che@ter:

_d3dDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_DESTCOLOR);
_d3dDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ONE);
_d3dDevice->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MULTIPLYADD);

На выходе без изменений. Можно получить что-то лучше, чем на картинке?

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

HellLight | Overlay-блендинг как в Фотошопе

Если будет мешать, то воспользуюсь твоим опытом. Просто буду предварительно собирать свет в отдельном спрайте, а потом накладывать разом. У меня в игре это можно разрулить парой-тройкой слоёв.

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

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