2011-09-16 3 views
2

OpenGLでこのタグを付けているのは、そのスペースに関連していると思うからです(別の名前ですが)。Photoshopのような "lighten"フラグメントシェーダーの問題

私はOpenGL(ES2?)を使用するFlash 11でPhotoshopのようなブレンドを動作させようとしています。私は軽いもので特に問題があります。私はそうすべきだと信じています。

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

私のレイヤーに透明性があるため、問題が発生していると思います。しかし、レイヤーをあらかじめ乗算しても、まだ画像が暗すぎます。

ここにステップがありませんか?

[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 

答えて

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 
+0

ええ私はそれも動かそうとしたことを忘れていました、あるいはそれを0に設定しても、それでもなお間違っています。私はそれが元の倍率を持つ元の画像を扱わなければならないかもしれないと思う... – ansiart

+0

あなたは正しいかもしれません、そのイメージをpremultiply、それらをdemultiplying、remultiplyを最大限に試してみてください。どのようなOpenGLのブレンド状態を使用していますか? – crazyjul

+0

src_alpha:one_minus_src_alphaはい、それはそれを台無しにしている事前乗算値です。私はすべてのテクスチャをフレームバッファリングするか、またはそれらを手動で逆多重化する必要があるように見えます。 Thanskあなたの助けに! – ansiart

0

前述のように、あなたは元の色の値をアルファプレミックスされたものから復元する必要があります。私は、次のコードは動作するはずと信じています:

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はゼロアルファ値によってdivizionを避けるために必要です。 fc0は、0,0,0,0.001のようにsmthを含むように設定することができます。

また、アルファとして第2層のアルファ(ft1)を使用しています。私はそれが正しいかどうかわからない。

関連する問題