なでしこでアルファブレンディングをするには

8 views
Skip to first unread message

ちび

unread,
Nov 27, 2011, 9:16:59 AM11/27/11
to Tatumak...@googlegroups.com
なでしこでアルファブレンディングをすれば表現の幅がひろがるのではないかと考えて試行錯誤してみました。

結果的になでしこ本体の構造について詳しくないためにどのように画像を扱えばα値が取り出せるのかわからないという状況に陥りました。

α値だけをうまく取り出すことができさえすればあとは簡単だと思うのですが…

難しいようならアルファブレンディング・半透明の部分だけLuaに頼る、ということにもなりそうです

技術的な情報提供をお願いします。

ちび

unread,
Nov 27, 2011, 9:30:49 AM11/27/11
to Tatumak...@googlegroups.com
追記です。

一応、アルファブレンディングみたいなことも既存の関数群でできるといえばできないこともないです。

背景画像、背景一色の画像(境界はくっきりしているのが望ましい)を用意し、

背景画像のコピーにコピーしたい画像をXORコピー。

そしたら、背景画像を透過率を指定して透過コピーすれば擬似的な半透明もできるはずです。

Gen Tatumaki

unread,
Nov 27, 2011, 10:19:12 AM11/27/11
to tatumak...@googlegroups.com
ドット単位での制御なら、今回の場合ならLUAに一任するのが良いかもしれません。
その場合でもLUAはピクセルデータを取得する術を持たないので、WinAPI経由の取得になります。
あとはピクセルデータを取り出し、指定の割合でブレンドし、1ドットずつ描画するだけです。
この場合でも恐らくGPUの支援を受けられないなでしこには現実的な話ではありません。

なでしこは元々画像半透明コピー という関数を持っています。
実は画像コピーとBitBltは内部ではほぼ同じ処理をしていると考えてよいでしょう。
ORコピー等もラスタオペレーションコードを切り替えるだけなので、APIの支援を受けていると考えられます。

さらに、イメージやフォーム部品の背景描画領域等もWinAPIのDCを取得して作られており、なでしこはウィンドウプロシージャへ応答する際にDCを再取得しています。
従って、ウィンドウが書き換えられる度にDCは書き換えられるため、描画を行った直後であっても再取得する必要があります。
これを回避するには別途メモリDCを取得し、それを裏画面とすれば良いのですが、GLへの実装はGL11が予定されています。

同様に半透過についてですが、先述の通り、なでしこは画像半透明コピーというものを持っています。
関数を参照してもらえれば分かると思いますが、2つの部品を指定して使うものです。(内部でDCが受け渡される)

未実装版のため、GL11では変更が加わる恐れがありますが、暫定版は以下の通りです。

●DrawBlendGraph(x,y,hnd,alpha)
    BG_IMAGE[hnd]をBG_IMAGE_BASEのx,yへalphaで画像半透明コピー


また、WinAPIのmsimg32.dllの中にも、実はAlphaBlend関数が存在します。
しかし、現在のところ原因不明で使用することができません。
APIの描画系ではuser32.dllやgdi.dllを使うことが多いのですが、msimg.dllというのは滅多に使われません。
この関数だけ別格かつ、構造体:BLENDFUNCTIONを渡さないといけないため、専用の関数が作ってあります。
実際に実行してみると、APIが返す値はTRUEを示しており、関数的には成功しています。
にも関わらず、描画が為されていないため、原因不明 という扱いになっています。

ちなみに、一般的にAlphaBlendでは透過色を指定できないため、描画には最低3回の描画を繰り返す必要があります。
まずは半透過したい描画対象の範囲だけ、描画対象の背面の画像を切り取って新たに取得したDC、もしくはイメージ部品に描画します。
背景となったバッファイメージに、半透過したい描画対象を論理和(SRCPAINT)で転送します。
その画像を、AlphaBlendで透過値を指定して描画してやれば完了です。

この方法を使って表現できる現実的な解像度は描画回数にもよりますが、320*240程度が目安です。
これ以上の場合、実行するPCに具体的なスペックを要求する必要が出てきます。


ついでに言ってしまえば、透明化を1にしたイメージ部品を転送すれば背景の透明化一連の処理無しで半透過できます。
この辺の内部関数については私も一切不明です。
なでしこ2のリポジトリで公開されているC#のコードを覗けば分かるかもしれませんが。。。


現在回答できる内容は以上です。
できればAlphaBlend関数を完成させて頂けるとありがたいです。(GL7からの課題)

ちび

unread,
Dec 3, 2011, 12:27:21 PM12/3/11
to Tatumak...@googlegroups.com, tatumak...@googlegroups.com
なでしこ本家で掲示板に投稿してみたところちゃんとした画像が表示されるようになりました

png32にもバッチリ対応しています

描画速度は評価試験を別途執り行う必要があると思いますが

これでもだいぶ表現の幅が広がったと思います

http://nade.jp-pro.net/bbs/bbs1/mbbs.php?m=thread&threadid=115
Reply all
Reply to author
Forward
0 new messages