Re: MakeGraph() による背景の透明化 ( No.1 ) |
- 名前:いっち 日時:2011/06/12 18:48
Ver.3.00以降のDXライブラリでは透過色の機能を画像データからグラフィックハンドルを生成するときに
αチャンネルに変換することで擬似的に実現しています。
そのため、書き込み可能なグラフィックハンドルを透過色で埋めたとしても、透明にはなりません。
こういった場合 SetDrawValidAlphaChannelGraphCreateFlag を利用して、
αチャンネル付の描画可能なグラフィックハンドルを作成する必要があります。
> h t t p://hpcgi2.nifty.com/natupaji/bbs/patio.cgi?mode=view&no=2005
ちなみに、DXライブラリのバージョンは DxLib.h の先頭や、 Log.txt の出力で確認できます。
|
Re: MakeGraph() による背景の透明化 ( No.2 ) |
- 名前:ひまわり 日時:2011/06/13 10:53
いっちさんありがとうございます。
DxLib のバージョンは、3.02c でした。
SetDrawValidAlphaChannelGraphCreateFlag() 関数に TRUE を引き渡す事で、
無事透明化することができました。
しかし、tp://hpcgi2.nifty.com/natupaji/aska.cgi の記事No.2755 の管理人さんのレスで、
>アルファチャンネル付きの描画可能画像を使用することによって
>描画していない部分を透過させることができます
とあり、確かに SetDrawValidAlphaChannelGraphCreateFlag(TRUE) コール後に MakeGraph()で、
作成したグラフィックは、描画されていない部分については透明化してくれますが、
下記のコードを実行した場合、依然として透明化されません。
SetDrawValidAlphaChannelGraphCreateFlag(TRUE);
SetDrawValidGraphCreateFlag(TRUE);
SetTransColor(0, 255, 0);
int image = MakeGraph(100, 100);
FillGraph(image, 0, 255, 0);
SetDrawScreen(image);
DrawCircle(50, 50, 50, GetColor(255, 0, 0), TRUE);
SetDrawScreen(DX_SCREEN_BACK);
DrawGraph(0, 0, image);
SetTransColor() MakeGraph() をコールする順番を変えてみたりしたのですが、結果は同じでした。
透明にしたい形がいささか複雑なので、是非とも色で指定したいのですが、どのようにすればよいのでしょう。
よろしくお願いします。
|
Re: MakeGraph() による背景の透明化 ( No.3 ) |
- 名前:いっち 日時:2011/06/13 12:20
> 透明にしたい形がいささか複雑なので、是非とも色で指定したいのですが、どのようにすればよいのでしょう。
「透過色を使えば実現できるが、αチャンネルでは実現が難しい(orできない)」というシチュエーションが良く分かりません。
(No.2のコードであれば FillGraph をしなければ良いと思います)
出来れば懸案となっている具体的なコードとデータを提示して頂けますか?
どうしても、なにがなんでも、透過色(のような機能)を使いたいというのであれば、手段が無いことも無いですが、
デメリットもあるのであまりお勧めできません。
|
Re: MakeGraph() による背景の透明化 ( No.4 ) |
- 名前:ひまわり 日時:2011/06/13 12:48
具体的には、ファイルから読み込んだ画像に穴を開けたいといった場合です。
そのパターンは動的に決定されるものであり、大小様々な複数の円形の穴を開けます。
この場合画像に対し、透明色で円形に塗りつぶすのが、もっともシンプルな実装だと考えました。
マスクを利用する事も考えましたが、表示する画像の他にマスクを管理しなければならず、描画時のコストが高いので、出来れば使わずに済ませたいと思っております。
|
Re: MakeGraph() による背景の透明化 ( No.5 ) |
- 名前:いっち 日時:2011/06/13 19:24
以下のような感じでどうでしょうか?
(DX_BLENDMODE_SRCCOLOR は現時点で最新のテストバージョンでなければ使えません)
//- 以下、テストコード ("test1.bmp"を使用) -//
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE, HINSTANCE, LPSTR, int )
{
ChangeWindowMode( TRUE );
SetWindowText( _T("DxLib:") DXLIB_VERSION_STR );
if ( DxLib_Init( ) == -1 ) return -1;
int white = GetColor( 255, 255, 255 );
int gh = LoadGraph( "test1.bmp" );
SetDrawValidAlphaChannelGraphCreateFlag( TRUE );
int bgh = MakeScreen( 640, 480 );
SetDrawValidAlphaChannelGraphCreateFlag( FALSE );
SetDrawScreen( bgh );
ClearDrawScreen( );
DrawGraph( 0, 0, gh, TRUE );
SetDrawBlendMode( DX_BLENDMODE_MUL, 0 ); // 0 を指定するとαチャンネルは必ず 0 になる
// SetDrawBlendMode( DX_BLENDMODE_SRCCOLOR, 0 ); // こっちでも大丈夫なはずだが、描画先の色は上書きされる。速いかも?
DrawCircle( 65, 75, 25, white, TRUE ); // DX_BLENDMODE_MUL で 白を書くと描画先の色はそのまま。この場合、αチャンネルだけが 0 になる
SetDrawBlendMode( DX_BLENDMODE_NOBLEND, 255 );
SetDrawScreen( DX_SCREEN_BACK );
while ( ProcessMessage( ) == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 ) {
ClearDrawScreen( );
DrawBox( 0, 0, 640, 480, GetColor( 128, 128, 128 ), TRUE );
DrawGraph( 0, 0, bgh, TRUE ); // ここを FALSE にすると描画先の色がそのままなのが分かる。
DrawFormatString( 0, 0, white, "TEST" );
ScreenFlip( );
}
DxLib_End( );
return 0;
}
その他の手段として私が思いつくのは以下のようなものです。
1.Zバッファを利用する
2.ピクセルシェーダーを利用する(試していません)
3.マスクを利用する
4.ソフトイメージで地道に加工する
5.グラフィックハンドルからグラフィックハンドル以外に変換し、再度グラフィックハンドルにする
|
|