ФлеймФорумРазработка игр

Пропаганда Premultiplied Alpha (2 стр)

Страницы: 1 2 3 4 Следующая »
#15
17:03, 19 дек 2023

Имбирная Ведьмочка
> Да, у меня опять подгорело от того, как в анриле всё сделано через жопу.
Меня больше всего бесит, что гамма-корректную альфу не поддерживает никто и просто так ее реализовать невозможно. Вообще, все sRGB — это одно большое designed by committee УГ. Текстуры должны иметь булевый флаг на каждую компоненту, применять ли гамма-коррекцию или нет (и гамма должна быть равна двум).

> Есть огромная куча мест, где классическая альфа прибита гвоздями.
Одно из которых — формат PNG. Вообще, есть ли какой-то общеупотребительный формат изображений с PA?

Кстати, еще одно преимущество PA — это бесшовная поддержка аддитивного блендинга, т. е. на одном и том же изображении можно комбинировать как обычные полупрозрачные объекты, так и самосветящийся огонь, например.

#16
2:29, 20 дек 2023

}:+()___ [Smile]
> Меня больше всего бесит, что гамма-корректную альфу не поддерживает никто и
> просто так ее реализовать невозможно. Вообще, все sRGB — это одно большое
> designed by committee УГ. Текстуры должны иметь булевый флаг на каждую
> компоненту, применять ли гамма-коррекцию или нет (и гамма должна быть равна
> двум).
А у графонов нынче разве нет "аппаратной" поддержки сргб на уровне десериализации из текстуры?

Ну а использовать 8 бит в качестве хдр рендертаргета, это, мне кажется, уже немного троллинг.
_

Я немного погуглил в интернете, и там утверждают, что на "GL 3.x+ capable hardware", интерполяция и наложение производятся в линейном пространстве — а значит, там PA-формулы должны работать как надо.

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

}:+()___ [Smile]
> Одно из которых — формат PNG. Вообще, есть ли какой-то общеупотребительный
> формат изображений с PA?
Вроде как в TIFF есть явная поддержка премультиплаед. Но по факту, скорее всего, придётся либо импортировать в свой велосипедный ассет-формат, либо конвертировать при загрузке ресурса.

#17
18:57, 20 дек 2023

Имбирная Ведьмочка
> А если ты про то, что сама альфа может оказаться тоже гамма-закодированной
Да, я именно про это. Гамма-кодирование решает вполне понятную проблему: потерю точности в темной области. Эта же проблема точно так же присутствует и в альфа-канале (точнее в \(1-\alpha\), но не суть), однако текстурных форматов с коррекцией на всех четырех каналах нет.

> "гамма перекоррекцию альфы" можно подогнать на этом же этапе.
При этом будет потеря точности в темной области, в чем и состоит проблема. Так-то можно везде пользоваться текстурами с линейным 8-битным цветом, но в темноте это будет выглядеть вырвиглазно.

#18
3:40, 21 дек 2023

Имбирная Ведьмочка
Я со всем согласен, но почему такое отвратительное изображение для примера? Какая-то мерзкая рожа, да ещё и пересвеченная и перешакаленная в хлам.

#19
5:26, 21 дек 2023

BUzer посты его и темы почитай. Там что-то неладное с головой.
Кстати как называется отклонение когда человек начинает вводить свои термины и использует их надеясь что они не только ему понятны?
И да, это не суслик.

#20
5:41, 21 дек 2023

Hardway
> использует их надеясь что они только ему понятны?
Забыл "не" дописать? А то получается, как будто я специально шифруюсь так, чтобы никто не понял, но на самом деле все всё понимают. Мне кажется, ты хотел сказать наоборот.

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

Hardway
> И да, это не суслик.
Я не думаю, что кто-то серьёзно мог бы спутать меня с Сусликом.

#21
15:46, 21 дек 2023

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

+ Показать
#22
3:33, 22 дек 2023

Ключевой инсайт в том, что "цвет домноженный на альфу" — это физическая величина, такая же, как "масса", "температура" или "количество яблок", точно так же имеет свою единицу измерения (люмен), и именно вот этот факт делает простую интерполяцию над этой величиной — физически осмысленным действием.

}:+()___ [Smile]
> Кстати, еще одно преимущество PA — это бесшовная поддержка аддитивного
> блендинга, т. е. на одном и том же изображении можно комбинировать как обычные
> полупрозрачные объекты, так и самосветящийся огонь, например.
Это тоже имеет представление в модели с "плашечками", кстати — это когда непрозрачные частицы, несмотря на ненулевую суммарную светимость, при этом занимают пренебрежимо малую площадь пикселя.

#23
5:43, 22 дек 2023

Имбирная Ведьмочка
> Ключевой инсайт в том, что "цвет домноженный на альфу" — это физическая
> величина, такая же, как "масса", "температура" или "количество яблок", точно
> так же имеет свою единицу измерения (люмен), и именно вот этот факт делает
> простую интерполяцию над этой величиной — физически осмысленным действием.

Можно так воспринимать.
Но мне нравится по другому это трактовать - как просто то, что интерполяция без особых поправок на прозрачность является довольно таки неправильной операцией.
Если взять зеленый и красный пиксели рядом у одного прозрачность 0.1, а у другого 0.9, то при независимой интерполяции в центре между ними получится среднеарифметическая смесь зеленого с красным и альфа 0,5. Но довольно очевидно, что раз зеленый пиксель по идее прозрачности "пригашен" на 0.1 альфы, то правильная интерполяция должна именно такой вес ему и дать при смешении цветов. Выходит что линейная интерполяция без оглядки на физическую сущность альфа-канала это весьма грубая и непонятно уже даже как что-то вывозящая вещь. Формулы обычной альфы были для операций пиксель-в-пиксель.
Таким образом предумноженная альфа просто берет и "пригашивает" цветовые компоненты заранее чтобы интерполяция вела себя правильно. И при этом действительно можно говорить о том, что после "пригашивания" в RGB-канале находится уже не абстракция цвета, а физичная светимость пикселя, т.к. когда вводили понятие альфы, то незаметненько RGB канал перестал быть вторым (до альфы он полностью попадал под то же самое понятие).

#24
5:50, 22 дек 2023

=A=L=X=
> Формулы обычной альфы были для операций пиксель-в-пиксель.
Если посмотреть на всякую документацию к пнг и вебп, то там в качестве "формулы обычной альфы" приводятся корректные формулы, с делением по пропорции.

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

#25
5:50, 22 дек 2023

Имбирная Ведьмочка
По Premultiplied Alpha полностью согласен, но! хочу набросить еще на сам альфаканал так сказать.
Типичный альфаподход - это когда для 0 имеем полностью прозрачный пиксель, а для 1 - полностью непрозрачный. А по хорошему надо чтобы альфа показывала сколько света проходит сквозь этот материал. В этом случае полностью непрозрачный пиксель - это 0, а полностью прозрачный - 1.

Такой казалось бы минимальный трюк, но позволяет просто реализовать front to back blending. В этом случае результирующая альфа - это просто:
alpha_dst = alpha_src * alpha_dst
а цвет:
col_dst = alpha_dst * col_src + col_dst //тут понятное дело col_src - premultiplied как нульпосте
Ну и чтобы рендерить такое - нужно сортировать всё от ближних к дальним.

Но что это дает? А то, что технически можно было бы даже не вызывать фрагментный шейдер для пикселей, у которых в alpha_dst значение стало 0 или очень близко к 0. Т.е. рисуем мы скажем дым/облака частицами, за которыми ничего не видно. И прямо на хардварном уровне можно было бы early_alpha_discard делать, по аналогии с early_z, и иметь просто сумасшедшую производительность при рендере кучи частиц. Но увы, этому не суждено было родиться.

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

p.s. А вообще еще очень хотелось иметь blending шейдер после пиксельного в конвеере, но этого тоже никогда не случится.

#26
6:11, 22 дек 2023

Имбирная Ведьмочка
> Если посмотреть на всякую документацию к пнг и вебп, то там в качестве "формулы
> обычной альфы" приводятся корректные формулы, с делением по пропорции.

Я если честно тут когда писал никогда еще не выходил за рамки частного случая как у тебя написано когда Ad=1. Но уже прекрасно видно, что даже для одного прозрачного наложения у формул с Ad=1 будут проблемы в реалиях компьютерной графики.

#27
12:28, 22 дек 2023

Площади перекрывающиеся, свечения какие-то... Почему именно такие конфигурации Ad и As, а не, скажем, вертикальные, поставленные рядом без пересечения (это дало бы нам просто сумму)? Во всём этом выводе сплошь и рядом чувствуются натяжки. Между тем, "правильную формулу" можно вывести, не умничая, а исключительно из формулы наложения на непрозрачный фон D значения S с альфой A: D' = (1-A)*D + A*S. Афтор высокомерно обозвал её "частной", а она, на самом деле, основополагающая: достаточно её одной.

Рассмотрим:
1) последовательное наложение на D0 значений S1,A1 и (после него) S2,A2:
D1 = D0*(1-A1) + S1*A1
D2 = D1*(1-A2) + S2*A2

2) наложение на то же D0 значения S3,A3:
D3 = D0*(1-A3) + S3*A3

Теперь мы хотим подобрать такие S3,A3, чтобы результат от 2) получился такой же, как от 1) (т. е. D3=D2). Это даёт нам псевдосистему:
D1 = D0*(1-A1) + S1*A1
D2 = D1*(1-A2) + S2*A2
D2 = D0*(1-A3) + S3*A3

Проведя подстановки и сгруппировав коэффициенты при D0, конвертируем псевдосистему в уравнение:
D0*(A1*A2-A1-A2) + (A2*S2-A1*A2*S1+A1*S1) = A3*S3 - A3*D0

Поскольку при D0, согласно основополагающей формулы, у нас может фигурировать только альфа, независимо от накладываемого значения, мы можем вытащить отсюда соотношение чисто для альф:
D0*(A1*A2-A1-A2) = -A3*D0
(из чего, с учётом остального уравнения, автоматически следует: A2*S2-A1*A2*S1+A1*S1 = A3*S3)

В итоге:
A3 = A1+A2-A1*A2
S3 = (A2*S2-A1*A2*S1+A1*S1) / A3 = (A2*S2-A1*A2*S1+A1*S1) / (A1+A2-A1*A2)

что и ожидалось.

#28
17:36, 22 дек 2023

Sbtrn. Devil
> Почему именно такие конфигурации Ad и As, а не, скажем, вертикальные,
> поставленные рядом без пересечения (это дало бы нам просто сумму)?
Потому что, на самом деле, это модель для некоррелированных случайных процессов. Но если нарисовать шум из точек, то формула станет не такой очевидной.

Sbtrn. Devil
> В итоге:
> A3 = A1+A2-A1*A2
> S3 = (A2*S2-A1*A2*S1+A1*S1) / A3 = (A2*S2-A1*A2*S1+A1*S1) / (A1+A2-A1*A2)
>
> что и ожидалось.
Ну и какая тогда разница?

#29
18:24, 22 дек 2023

MrShoor
> А по хорошему надо чтобы альфа показывала сколько света проходит сквозь этот материал. В этом случае полностью непрозрачный пиксель - это 0, а полностью прозрачный - 1.
Именно! И эта новая альфа должна быть гамма-скорректированной, чтобы не было бандинга при белом заднике.
Т. е. идеальный формат с прозрачностью должен иметь \(\{\gamma(AR),\gamma(AG),\gamma(AB),\gamma(1-A)\}.\)

Причем, в идеале \(\gamma(x) = \sqrt{x}\), а не тот ужас, который сейчас.

Страницы: 1 2 3 4 Следующая »
ФлеймФорумРазработка игр

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