Проблемы с фотошопоподобным «осветленным» фрагментом шейдера - PullRequest
2 голосов
/ 16 сентября 2011

Я отмечаю это в OpenGL, потому что я думаю, что это относится к этому пространству (хотя и к другим именам).

Я пытаюсь заставить фотошоп-смешение работать в Flash 11, который использует OpenGL (ES2?).У меня есть определенные проблемы с lighten, которые, я считаю, должны быть:

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 ]

3 голосов
/ 04 октября 2011

Обратите внимание, вы также умножаете альфу на себя.

Таким образом, вместо (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
0 голосов
/ 19 января 2013

Как уже упоминалось в 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) в качестве получающейся альфыЯ не знаю, правильно ли это.

...