トップページ > 記事閲覧
MakeScreenの透過
名前:kit it guy 日時: 2015/10/04 20:59

MakeScreenで作成したグラフィックハンドルに SetDrawBlendMode(DX_BLENDMODE_ALPHA,127) で半透明にした四角形を書き足したところ その部分だけ後ろの画像まで半透明になってしまいました。 半透明なし四角形を書き足すにはどうすればいいですか?
メンテ

Page: 1 |

Re: MakeScreenの透過 ( No.1 )
名前:管理人 日時:2015/10/05 00:14

「乗算済みアルファ」というものを使用すると解決することができます 試しに「乗算済みアルファ」を使用しないで MakeScreen で作成した画像に対して半透明の描画を行った場合と、 「乗算済みアルファ」を使用して MakeScreen で作成した画像に対して半透明の描画を行った場合との比較ができる サンプルプログラムを作成してみましたので、よろしければご覧ください #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int NormalScreen ; int PMAScreen ; // ウインドウモードで起動 ChangeWindowMode( TRUE ) ; SetUseDirectInputFlag( FALSE ) ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) return -1 ; // アルファチャンネルつきの描画先にできるグラフィックハンドルを二つ作成 NormalScreen = MakeScreen( 256, 256, TRUE ) ; PMAScreen = MakeScreen( 256, 256, TRUE ) ; // 乗算済みアルファを使用しない画像を描画対象に変更 SetDrawScreen( NormalScreen ) ; // 画面を初期化 ClearDrawScreen() ; // 赤い四角形を左上に描画 DrawBox( 0, 0, 160, 160, GetColor( 255,0,0 ), TRUE ) ; // 通常のアルファブレンド( 50% )で右下に緑の四角形を描画 SetDrawBlendMode( DX_BLENDMODE_ALPHA, 128 ) ; DrawBox( 100, 100, 256, 256, GetColor( 0, 255, 0 ), TRUE ) ; SetDrawBlendMode( DX_BLENDMODE_NOBLEND, 255 ) ; // 乗算済みアルファを使用する画像を描画対象に変更 SetDrawScreen( PMAScreen ) ; // 画面を初期化 ClearDrawScreen() ; // 赤い四角形を左上に描画 DrawBox( 0, 0, 160, 160, GetColor( 255,0,0 ), TRUE ) ; // 乗算済みタイプのアルファブレンド( 50% )で右下に緑の四角形を描画 SetDrawBlendMode( DX_BLENDMODE_PMA_ALPHA, 128 ) ; DrawBox( 100, 100, 256, 256, GetColor( 0, 255, 0 ), TRUE ) ; SetDrawBlendMode( DX_BLENDMODE_NOBLEND, 255 ) ; // 描画先を裏画面に変更 SetDrawScreen( DX_SCREEN_BACK ) ; // 半透明になってしまっているか分かるように画面全体に横線を描画 for( int i = 0 ; i < 480 / 4 ; i ++ ) { DrawBox( 0, i * 4, 640, i * 4 + 2, GetColor( 128,128,128 ), TRUE ) ; } // 通常のアルファブレンドで四角形を描画した画像を通常のアルファブレンドで描画 SetDrawBlendMode( DX_BLENDMODE_ALPHA, 255 ) ; DrawGraph( 16, 16, NormalScreen, TRUE ) ; // 乗算済みタイプのアルファブレンドで四角形を描画した画像を乗算済みタイプのアルファブレンドで描画 SetDrawBlendMode( DX_BLENDMODE_PMA_ALPHA, 255 ) ; DrawGraph( 300, 16, PMAScreen, TRUE ) ; // ブレンドモードも元に戻す SetDrawBlendMode( DX_BLENDMODE_NOBLEND, 255 ) ; // 裏画面の内容を表画面に反映 ScreenFlip() ; // キー入力待ち WaitKey() ; // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; } 実行結果の画像もアップしてみました https://dxlib.xsrv.jp/temp/PMATestScreen.png 画像中の左側の二つの四角形が「乗算済みアルファ」を使用しなかった場合で、 右側の二つの四角形が「乗算済みアルファ」を使用した場合です 左側はお書き込みの通り半透明の緑の四角形を描画した部分が半透明ではなかった 赤い四角形の部分まで半透明になってしまっていますが( しかも緑色の四角形の 透明度も変です )、右側の「乗算済みアルファ」を使用した場合はそのようなことが 発生していないのが分かると思います 「乗算済みアルファ」についてはこちらのページで詳しく解説していますので、 よろしければご覧になってみてください m(_ _)m <乗算済みアルファのすすめ> http://homepage2.nifty.com/natupaji/DxLib/lecture/PremulAlpha/PremulAlpha.html ( 描画先にできる画像に対して半透明描画を行った場合の話は後半にあります )
メンテ
Re: MakeScreenの透過 ( No.2 )
名前:kit it guy 日時:2015/10/05 17:13

解決しました。ありがとうございます。 ですがもう一つ、同じ状況でDX_FONTTYPE_ANTIALIASING_EDGE_4X4 の文字を表示すると、やはり透明になってしまいます。 これはどうすればいいでしょうか
メンテ
Re: MakeScreenの透過 ( No.3 )
名前:kit it guy 日時:2015/10/05 17:15

透明になるのは文字のエッジの部分です。
メンテ
Re: MakeScreenの透過 ( No.4 )
名前:管理人 日時:2015/10/07 02:14

「乗算済みアルファのすすめ」のページにも書いてありますが、フォントハンドルも「乗算済みアルファ」用の フォントハンドルというものがあり、CreateFontToHandle を呼び出す前に SetFontCacheUsePremulAlphaFlag( TRUE ) ;を 実行しておくことで、作成されるフォントハンドルが「乗算済みアルファ」用のフォントハンドルになります 更に、この「乗算済みアルファ」用フォントハンドルを使用して DrawStringToHandle などで文字を描画する際は事前に SetDrawBlendMode( DX_BLENDMODE_PMA_ALPHA, 255 ) ; を実行して、「乗算済みアルファ」用のアルファブレンドが 行われるようにする必要があります つまり 「乗算済みアルファ」用フォントハンドル + 「乗算済みアルファ」用ブレンドモード である必要があるわけです・・・ よろしければお試しください m(_ _)m
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存