Проблемы с фотошопоподобным "осветленным" фрагментом шейдера
Я отмечаю это в OpenGL, потому что я думаю, что это относится к этому пространству (хотя и с другим наименованием).
Я пытаюсь заставить фотошоп-смешение работать во Flash 11, который использует OpenGL (ES2?). У меня есть определенные проблемы со светом, которые, я считаю, должны быть:
outputColor.rgb = max (base.rgb, blend.rgb);
Я считаю, что у меня есть проблемы, потому что мои слои имеют прозрачность. Однако, даже когда я предварительно умножил свои слои, у меня все еще есть проблемы (изображение все еще слишком темное).
Я пропустил шаг здесь? (Это AGAL, сборка Adobe gl)
[Shader.Fragment]
tex ft0, v0, fs0 <2d,nearest,nomip,clamp>
tex ft1, v0, fs1 <2d,nearest,nomip,clamp>
// premultiply
mul ft2, ft1.xyzw, ft1.wwww
// premultiplied values
max oc, ft0, ft2
2 ответа
Обратите внимание, вы тоже умножаете альфу.
Таким образом, вместо ( ra, ga, ba, a) вы выводите ( ra, ga, ba, aa), что приведет к получению более темного изображения при смешивании с черным фоном
Вы можете попробовать сделать это:
// premultiply
mul ft2, ft1.xyzw, ft1.wwww
mov ft2.w, ft1.w
// premultiplied values
max oc, ft0, ft2
Как уже упоминалось в crazyjul, вы должны восстановить исходные значения цвета из предварительно умноженных на альфа. Я считаю, что следующий код должен работать:
tex ft0, v0, fs0 <2d, nearest, nomip, clamp>
tex ft1, v0, fs1 <2d, nearest, nomip, clamp>
max ft0, ft0, fc0
div ft0.xyz, ft0.xyz, ft0.www // obtain original color 1
max ft1, ft1, fc0
div ft0.xyz, ft0.xyz, ft0.www // obtain original color 2
max ft1.xyz, ft0.xyz, ft1.xyz // lighten
mul ft1.xyz, ft1.xyz, ft1.www // pre-multiply output color with the second alpha
mov oc, ft1
линии max ft0, ft0, fc0
а также max ft1, ft1, fc0
необходимо избегать деления на нулевое альфа-значение. Вы можете установить fc0
постоянная, чтобы содержать что-л 0,0,0,0.001
,
Также обратите внимание, что мы используем альфа второго слоя (ft1
) как итоговая альфа. Я не знаю, правильно ли это.