2

OpenGLでこれにタグを付けているのは、そのスペースに関連していると思うからです(名前は異なりますが)。

OpenGL(ES2?)を使用するFlash11でフォトショップのようなブレンディングを機能させようとしています。私はlightenで特定の問題を抱えていますが、それは次のようになるはずです。

outputColor.rgb = max(base.rgb、blend.rgb);

レイヤーに透明性があるため、問題が発生していると思います。ただし、レイヤーを事前に乗算しても、問題が発生します(画像がまだ暗すぎます)。

私はここで一歩を逃していますか?(これは、AdobeのglアセンブリであるAGALです)

[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
4

2 に答える 2

3

注意してください、あなたはそれ自体でアルファも掛けています。

したがって、(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
于 2011-10-04T16:29:48.300 に答える
0

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, fc0max ft1, ft1, fc0は、ゼロのアルファ値による除算を避けるために必要です。fc0のようなsmthを含むように定数を設定できます0,0,0,0.001

ft1また、結果のアルファとして2 番目のレイヤーのアルファ ( ) を使用することに注意してください。それが正しいかどうかはわかりません。

于 2013-01-19T10:43:30.767 に答える