Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / Форум / Задачка по блендингу (2 стр)

Задачка по блендингу (2 стр)

Поделиться

Страницы: 1 2 3 Следующая

destractПользовательwww9 мая 201713:58#15
Suslik
> Спрайты на всех этапах рендерю я сам и могу их запекать так, как мне вздумается
> и потом трактовать их в шейдере так, как мне вздумается.
Хех. С этого надо начинать.

Если colorKey с альфой, то тут проще простого.
fixed4 c0 = tex2D(tex0, uv);
fixed4 c1 = tex2D(tex1, uv);
fixed4 final = fixed4(fixed3(c0.rgb * c1.a + c1.rgb * c1.a), c0.a * c1.a);

Поправьте, если где напутал.

SuslikМодераторwww9 мая 201715:03#16
destract
> fixed4 c0 = tex2D(tex0, uv);
> fixed4 c1 = tex2D(tex1, uv);
> fixed4 final = fixed4(fixed3(c0.rgb * c1.a + c1.rgb * c1.a), c0.a * c1.a);
Suslik
> Возможно, кто-то знает интересный хак, как такую проблему можно обойти, не
> используя дополнительную текстуру?

jaguard
> Ну кстати, в таком случае достижимо согласно классической теории информации -
> кодируешь ARGB уменьшенной битности и на оставшихся битах хранишь свою
> колорокиевую магию(например 7 бит на альфу и 1 на колорки а, ну да, у тебя
> колоркий тоже с альфой. Тогда, например, 6-6-6-6-8). Ну и фильтрацию все-равно
> свою писать, чтобы не потерять эти волшебные биты.
это — слишком влобно. можно попытаться делать допущения. например, допущение, что градиент не может быть сразу от маски к бэграунду и от цвета к бэграунду (на их аккуратное пересечение можно положить болт). в том, что это теоретически возможно, вопросов никаких нет — в 32 бита теоретически возможно запаковать 5 каналов, но хочется это сделать как можно более gpu-friendly.

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

Правка: 9 мая 2017 15:08

destractПользовательwww9 мая 201717:30#17
Suslik
> > Возможно, кто-то знает интересный хак, как такую проблему можно обойти, не
> > используя дополнительную текстуру?
Ты хочешь сблендить текстуру саму с собой? Или что?

Теперь я тебя совсем не понимаю :)

Правка: 9 мая 2017 17:31

SuslikМодераторwww9 мая 201718:05#18
имеется в виду, не используя дополнительную текстуру для второго альфа-канала. спрайты рендерятся один за другим, я не могу прочитать пиксель рендертаргета, скомбинировать его с текущим рендерящимся спрайтом и записать результат, потому что нельзя в таргет сразу читать и писать. ещё раз — спрайтов в общем случае не два, их много. но даже если бы их было два, формула, которую ты привёл, никак не учитывает мой злополучный color key, из-за которого все проблемы и растут.

Правка: 9 мая 2017 18:06

destractПользовательwww9 мая 201718:35#19
Suslik
> но даже если бы их было два, формула, которую ты привёл, никак не учитывает мой
> злополучный color key
Может вместо colorKey использовать альфу? Или есть еще какое-то препятствие, начисто запрещающее такое решение?

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

Хотя наверно и здесь есть причина почему так сделать нельзя?

SuslikМодераторwww9 мая 201718:52#20
destract
> Может вместо colorKey использовать альфу? Или есть еще какое-то препятствие,
> начисто запрещающее такое решение?
>
сам-то как думаешь, стал бы я выдумывать проблемы, если бы их не было?

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


короче, ребята, чё-то расстроен я, что уже две страницы обсуждаем условие задачи, а не решения. то ли я настолько криво условие рассказал, то ли вы расслабились.

MrShoorУчастникwww9 мая 201719:09#21
Suslik
ColorKey достаточно неплохо можно подчистить, если перевести цвет в HSV/HSB цветовое пространство. А если еще семплить самому, то можно построить градиент по H и даже сдвигать его в предполагаемую сторону. Мне приходилось такое делать для реалтайм видео, а там артефакты похлеще чем у тебя антиалязинговый переход. Получалось даже цвет волос частично восстанавливать. Код к сожалению дать не могу, т.к. он принадлежит не мне.
destractПользовательwww9 мая 201719:14#22
Suslik
ОК. Если проблема в антиалиасинге при смешивании спрайтов, то единственное решение - ввести некоторую величину toletance, определяющую допустимые отклонения от ключевого цвета. Получится с артефактами, но работать будет.

Артефакты можно замазать альфой. Применение альфы определять мультивыборкой из соседних пикселей, подбирая toletance.

jaguardУчастникwww9 мая 201719:44#23
Suslik
> то ли я настолько криво условие рассказал, то ли вы расслабились.

Ты не то чтобы криво, ты его вообще не рассказал. А когда рассказал, оставил нам слишком мало того, с чем можно работать.

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

Правка: 9 мая 2017 19:45

=A=L=X=Постоялецwww9 мая 201720:07#24
Suslik

Сперва я думал что понимаю задачу.
Потом я начал думать, что я не понимаю задачу.
Теперь я уже думаю что ты не понимаешь задачу.

SkybladeУчастникwww10 мая 20170:34#25
Можно ли хранить цветовой ключ в отдельной текстуре? Просто я не понял, он должен смешиваться с основной текстурой или нет?
Если да, то будут артефакты. Если нет, то нафига пихать все в одну текстуру.
SuslikМодераторwww10 мая 20173:07#26
MrShoor
> ColorKey достаточно неплохо можно подчистить, если перевести цвет в HSV/HSB
> цветовое пространство.
вот это — годная идея. я уже тоже думал в этом направлении, но не был уверен, что так кто-то делает. вполне можно попробовать на самом-то деле. код мне нафиг не нужен, мне нужна идея.

Правка: 10 мая 2017 3:11

SuslikМодераторwww10 мая 20173:10#27
Skyblade
> Можно ли хранить цветовой ключ в отдельной текстуре? Просто я не понял, он
> должен смешиваться с основной текстурой или нет?
Suslik
> Возможно, кто-то знает интересный хак, как такую проблему можно обойти, не
> используя дополнительную текстуру?
если бы можно было использовать две текстуры, проблем бы не было вообще никаких. хочется именно впихнуть невпихуемое, потому что по сути прозрачность-то используется только лишь для антиалиазинга, а не в полном объёме, поэтому хотелось бы её пожать.

jaguard
> В текущей постановке надо изобрести плагин для фотошопа, который идеально
> вырезает любой контур из любого бекграунда.
в постановке с маской, которая задана цветом — да, получается так. но маску можно кодировать как угодно, я её закодировал цветом просто для примера.

=A=L=X=
> Сперва я думал что понимаю задачу.
> Потом я начал думать, что я не понимаю задачу.
> Теперь я уже думаю что ты не понимаешь задачу.
досадно, если ты так считаешь. исходную задачу я точно не хочу рассказывать, потому что она вызовет ещё больше вопросов, которые у меня нет никакого желания обсуждать.

=A=L=X=Постоялецwww10 мая 20177:42#28
Suslik
> маску можно кодировать как угодно, я её закодировал цветом просто для примера.

Это то вот как раз (еще одно, что) сильно сбило с толку, т.к. colorkey это colorkey, он не может быть 50%, он потому и key, потому что он входит как ключ в замочную скважину - любое иное, даже на доли миллиметра строение ключа уже не откроет замок.
Если под цветом ты всё-таки понимал отдельный полноценный канал 0-100%, то тогда сходу вопрос - если в одном и том же пикселе выставлены зеленый цвет (50% интенсивности), обычная альфа 50% и тут же твой розовый канал тоже в 50%, то какой должен быть итоговый цвет, а главное - почему?

Правка: 10 мая 2017 7:45

SuslikМодераторwww10 мая 20178:00#29
=A=L=X=
> если в одном и том же пикселе выставлены зеленый цвет (50% интенсивности),
> обычная альфа 50% и тут же твой розовый канал тоже в 50%, то какой должен быть
> итоговый цвет, а главное - почему?
можно считать так, как удобнее с точки зрения реализации. то есть альфа может умножаться на "розовый канал", может браться минимум — это не очень принципиально.

Страницы: 1 2 3 Следующая

/ Форум / Программирование игр / 2D графика и изометрия

2001—2017 © GameDev.ru — Разработка игр