トップページ > 記事閲覧
MakeScreenのUseAlphaChannelに関連する質問
名前:たろう 日時: 2021/12/25 23:43

すみません、またたろうです。 お忙しい所すみません、三つ質問させてください<(_ _)> @以下のプログラムですが、test.bmpを読み込んで swtが0の時はMakeScreen(アルファ値不使用)にtest.bmpを貼ったものを描画 swtが1の時はMakeScreen(アルファ値使用)にtest.bmpを貼ったものを描画 swtが2の時はtest.bmpをそのまま描画 というものです。 スペースキーでswtが切り替わる様になっています。 swt0の時と、swt1及びswt2の時の描画結果の色味が変わってしまうのですが これはそういうものなのでしょうか? test.bmpは透明部分を持たないもので、カラフルな画像であれば何でもいいのですが、 透明部分がないのであれば結果は同じになるような気がするのですが どうでしょうか? #include "DxLib.h" int WINAPI WinMain(HINSTANCE hI,HINSTANCE hP,LPSTR lpC,int nC){ SetGraphMode(1920,1080,16); ChangeWindowMode(TRUE); if(DxLib_Init() == -1) return -1; SetUsePremulAlphaConvertLoad(1); SetFontCacheUsePremulAlphaFlag(1); int grp=LoadGraph("test.bmp"); int ms[2]; ms[0]=MakeScreen(1920,1080, 0); ms[1]=MakeScreen(1920,1080, 1); SetDrawScreen(ms[0]);DrawExtendGraph(0,0,1920,1080,grp,1); SetDrawScreen(ms[1]);DrawExtendGraph(0,0,1920,1080,grp,1); SetDrawScreen(DX_SCREEN_BACK); int swt=0,t=0; // メインループ while(ProcessMessage() == 0 && CheckHitKey(KEY_INPUT_ESCAPE) == 0){ // ESCキーで終了処理 ClsDrawScreen(); DrawExtendGraph(0,0,1920,1080,grp,1); if(t>15&&CheckHitKey(KEY_INPUT_SPACE)){t=0;swt++;if(swt>2)swt=0;} if(swt<2){DrawGraph(0,0,ms[swt],1);} DrawFormatString( 0,0,GetColor(255,255,255),"(%d)",swt ); t++; ScreenFlip(); } if(ProcessMessage() == -1){ DxLib_End();} // 強制終了時に黒画面が残らないようにする DxLib_End(); // DXライブラリ終了 return 0; } A「MakeScreenのUseAlphaChannelを0にして作った画像に例えば風景画を貼り付けて その上に加算ブレンド(DX_BLENDMODE_PMA_ADD?)で炎の画像などを貼り付けて、それを裏画面に貼る」と 「裏画面に、そのまま画像を貼って、加算ブレンドで炎の画像などを貼る」場合は 同じ見た目になるでしょうか? Bちょっと関係ないですが、SetDrawBlendMode( DX_BLENDMODE_PMA_ALPHA, 128 ) ; とやって半透明で描画をして、それを元に戻したい時は SetDrawBlendMode( DX_BLENDMODE_PMA_ALPHA, 255) ;と SetDrawBlendMode( DX_BLENDMODE_NOBLEND, 255 ) ;と どちらが正しいでしょうか?それとも同じなんでしょうか 散々使っている上に、関連で色々お聞きしてきたのに、乗算済みやその周辺の理解が いまだに頭が追い付かずすみません。教えていただけると助かります。 宜しくお願いいたします<(_ _)>
メンテ

Page: 1 |

Re: MakeScreenのUseAlphaChannelに関連する質問 ( No.1 )
名前:管理人 日時:2021/12/27 00:46

> @swt0の時と、swt1及びswt2の時の描画結果の色味が変わってしまうのですが > これはそういうものなのでしょうか? 載せていただいたプログラムで色味が変わる(色数が変わる)のは仕様となります 載せていただいたプログラムでは SetGraphMode の第三引数に 16 を指定されていますが、 この場合 16bitカラーの画像が作成されるか、32bitカラーの画像が作成されるかは以下の条件で分岐します SetUsePremulAlphaConvertLoad(1); を設定して LoadGraph = 32bitカラー SetUsePremulAlphaConvertLoad(1); を設定しないでアルファチャンネルなし画像を LoadGraph = 16bitカラー SetUsePremulAlphaConvertLoad(1); を設定しないでアルファチャンネルあり画像を LoadGraph = 32bitカラー MakeGraph(アルファチャンネルなし) = 16bitカラー MakeGraph(アルファチャンネルあり) = 32bitカラー 載せていただいたプログラムでは 最初の LoadGraph は SetUsePremulAlphaConvertLoad(1); を設定して LoadGraph をしているので、32bitカラーとなり、 MakeScreen(1920,1080,0); で作成される画像は 16bitカラーとなり MakeScreen(1920,1080,1); で作成される画像は 32bitカラーとなっています 16bitカラーは32bitカラーより色数が少ない( 16bitカラー = 65536色 32bitカラー = 16777215色 )ため、描画した時に 見た目に差が発生して、それが『色味が変わる』という印象になっている、という訳です SetGraphMode の第三引数を 32 にすることで、全ての画像を 32bitカラーにすることができ、 画像の種類によって bit数が違うということもなくなりますので、よろしければ SetGraphMode の 第三引数を 32 にするようにしてみてください m(_ _)m > A「MakeScreenのUseAlphaChannelを0にして作った画像に例えば風景画を貼り付けて > その上に加算ブレンド(DX_BLENDMODE_PMA_ADD?)で炎の画像などを貼り付けて、それを裏画面に貼る」と > 「裏画面に、そのまま画像を貼って、加算ブレンドで炎の画像などを貼る」場合は > 同じ見た目になるでしょうか? 同じ見た目になりません MakeScreen で作成した画像に DX_BLENDMODE_PMA_ALPHA で描画したものを裏画面に DX_BLENDMODE_PMA_ALPHA で 描画した場合は正しく半透明が適用されますが、 MakeScreen で作成した画像に DX_BLENDMODE_PMA_ALPHA で描画したものと DX_BLENDMODE_PMA_ADD で描画したものを 混在させて、その後裏画面に DX_BLENDMODE_PMA_ALPHA で描画したときは『MakeScreen で作成した画像に DX_BLENDMODE_PMA_ADD で描画したもの』の部分は『加算ブレンド』にはならないからです ( 全部 DX_BLENDMODE_PMA_ALPHA で描画されます ) なので、『MakeScreen で作成した画像に描画したものを裏画面に描画する』場合は、 アルファブレンドの描画と加算ブレンドの描画は混在させられないものとして考えてください m(_ _)m > Bちょっと関係ないですが、SetDrawBlendMode( DX_BLENDMODE_PMA_ALPHA, 128 ) ; > とやって半透明で描画をして、それを元に戻したい時は > SetDrawBlendMode( DX_BLENDMODE_PMA_ALPHA, 255) ;と > SetDrawBlendMode( DX_BLENDMODE_NOBLEND, 255 ) ;と > どちらが正しいでしょうか?それとも同じなんでしょうか 乗算済みアルファを使用している場合では SetDrawBlendMode( DX_BLENDMODE_PMA_ALPHA, 255) ; が正しい、となります ( SetDrawBlendMode( DX_BLENDMODE_NOBLEND, 255 ) ; では乗算済みアルファの画像を正しく描画できませんので… )
メンテ
Re: MakeScreenのUseAlphaChannelに関連する質問 ( No.2 )
名前:たろう 日時:2021/12/27 03:10

いつもありがとうございます。 @について32bitの色味になっている件、ありがとうございます<(_ _)>勉強になりました。 Bにつきまして安心しました。ありがとうございます。 Aにつきまして、すみません、説明が足りなかったかもしれません。 >MakeScreen で作成した画像に DX_BLENDMODE_PMA_ALPHA で描画したものを裏画面に DX_BLENDMODE_PMA_ALPHA で >描画した場合は正しく半透明が適用されますが、 の部分ですが、UseAlphaChannel=0は半透明を使わないという意味とは違うのでしょうか? 背景画像はそもそも半透明が無い物を想定していて 例えばその背景画像の、あるドットの色が(R125,G125,B125)だったとして、 それに加算で炎の色(50,0,0)を足して(175,125,125)にするイメージです。 それをしたところで、背景画像を貼り付けたScreenに半透明が無いのであれば 背景画面に炎を加算した時点で処理は(裏画面に張り付ける前に)完了しているので 同じになるのじゃないかと思いましたが やはり違うのでしょうか? もしくはその半透明がないScreenに加算を行ったものを裏画面に張り付ける時に DX_BLENDMODE_ALPHAに切り替えるなどすれば、どうでしょうか? 宜しくお願いいたします<(_ _)>
メンテ
Re: MakeScreenのUseAlphaChannelに関連する質問 ( No.3 )
名前:管理人 日時:2021/12/27 21:55

> Aにつきまして、すみません、説明が足りなかったかもしれません。 すみません、私も文章の理解が足りませんでした > A「MakeScreenのUseAlphaChannelを0にして作った画像に例えば風景画を貼り付けて 貼り付ける風景画が MakeScreen で作成された画像を隙間なく埋めるものでしたら( 且つ 風景画にアルファチャンネルが無い( 若しくは全てのピクセルのα値が 255 であれば ) )、 UseAlphaChannel が 0 でも 1 でも関係なく 「MakeScreenのUseAlphaChannelを0にして作った画像に例えば風景画を貼り付けて その上に加算ブレンド(DX_BLENDMODE_PMA_ADD?)で炎の画像などを貼り付けて、それを裏画面に貼る」 と 「裏画面に、そのまま画像を貼って、加算ブレンドで炎の画像などを貼る」 の描画結果の見た目は同じになります
メンテ
Re: MakeScreenのUseAlphaChannelに関連する質問 ( No.4 )
名前:たろう(解決) 日時:2021/12/28 02:30

いつもありがとうございます。 @で色味が変わる原因も分かった事もあり、 これで安心してAの使用方法を試すことが出来ます。 お手数をおかけいたしました ありがとうございました<(_ _)>
メンテ
Re: MakeScreenのUseAlphaChannelに関連する質問 ( No.5 )
名前:たろう 日時:2022/09/25 23:28

すみません、たろうです 解決した件ですが、関連でわからないことがあるので また質問させてくださいm(__)m 以下のプログラムは スクリーンを3つ(1通常2加算3減算)作って 1に隙間なく四角を描画し、そこに小さい四角を描いた2,3を それぞれ加算、減算してかぶせて、それをDX_SCREEN_BACKに描画するというものです。 No.3で教えていただいた通り、1には隙間がないので 全ピクセルα値255になっているからだと思うのですが 期待通りの動作をします。 ところが下の「※ここです@」の行をコメントアウトすると 全て真っ黒になってしまいます。 またこのコメントアウトの状態で「※ここですA」の行の 1を作る際のMakeScrennでUseAlphaChannelを0にすると また期待通りの動作になります。 これはなぜなんでしょうか? 四角で敷き詰めても1にはアルファ値が残ってしまうとか そういう事でしょうか? お手すきの時でかまいません 教えていただけると助かります。 よろしくお願いいたしますm(__)m ----------------------------------------------------- #include "DxLib.h" #define ALP(val) SetDrawBlendMode(DX_BLENDMODE_PMA_ALPHA,val) #define ADD(val) SetDrawBlendMode(DX_BLENDMODE_PMA_ADD,val) #define SUB(val) SetDrawBlendMode(DX_BLENDMODE_PMA_SUB,val) //////////////////////////////////////////////////////////////////////////////////////////////////////////////// int MKx=500,MKy=500,MK[5]; int WINAPI wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR lpCmdLine, _In_ int nCmdShow ) { SetUseDirectInputFlag(FALSE); SetGraphMode(MKx,MKy,32); ChangeWindowMode(1); if(DxLib_Init()==-1)return -1; SetUsePremulAlphaConvertLoad(1); SetDrawBlendMode(DX_BLENDMODE_PMA_ALPHA,255); SetDrawScreen( DX_SCREEN_BACK ); MK[0]=DX_SCREEN_BACK; MK[1]=MakeScreen(MKx,MKy,1);//メイン幕//※ここですA MK[2]=MakeScreen(MKx,MKy,1);//加算※光 MK[3]=MakeScreen(MKx,MKy,1);//減算※血 while(ProcessMessage()==0) { ALP(255);SetDrawScreen(MK[1]); DrawBox(0,0,MKx,MKy,GetColor(150,150,150),1); ADD(255);SetDrawScreen(MK[2]); DrawBox(0,0,50,50,GetColor(50,50,50),1); ADD(255);SetDrawScreen(MK[3]); DrawBox(0,50,50,100,GetColor(50,50,50),1); SetDrawScreen(MK[1]);SUB(255);DrawGraph( 0,0,MK[3],1); SetDrawScreen(MK[1]);ADD(255);DrawGraph( 0,0,MK[2],1);//※ここです@ SetDrawScreen(MK[0]);ALP(255);DrawGraph( 0,0,MK[1],1); ALP(255); ScreenFlip(); ClearDrawScreen(); SetDrawScreen(MK[1]);ClearDrawScreen(); SetDrawScreen(MK[2]);DrawBox(0,0,MKx,MKy,GetColor(0,0,0),1); SetDrawScreen(MK[3]);DrawBox(0,0,MKx,MKy,GetColor(0,0,0),1); SetDrawScreen(MK[0]); } DxLib_End(); return 0; }
メンテ
Re: MakeScreenのUseAlphaChannelに関連する質問 ( No.6 )
名前:管理人 日時:2022/09/27 01:49

> 四角で敷き詰めても1にはアルファ値が残ってしまうとか > そういう事でしょうか? はい、その通りです SetDrawScreen(MK[2]);DrawBox(0,0,MKx,MKy,GetColor(0,0,0),1); SetDrawScreen(MK[3]);DrawBox(0,0,MKx,MKy,GetColor(0,0,0),1); ↑ こちらでは『色は真っ黒、アルファ値は255のピクセルで敷き詰める』となりますので、次のループの SetDrawScreen(MK[1]);SUB(255);DrawGraph( 0,0,MK[3],1); ↑ こちらでMK[1]の全体のアルファ値を0にしてしまいます。( アルファ値に対しても減算が行われますので ) なので、こちらのように DrawBox ではなく ClearDrawScreen を使用するようにすると期待した結果になると思います SetDrawScreen(MK[2]);ClearDrawScreen(); SetDrawScreen(MK[3]);ClearDrawScreen(); よろしければお試しください m(_ _)m
メンテ
Re: MakeScreenのUseAlphaChannelに関連する質問 ( No.7 )
名前:たろう 日時:2022/09/27 02:34

いつもありがとうございます。 そういう事だったんですね。納得しましたm(__)m ただ、MK[3]のスクリーンは、例えば灰色の煙をいくつも重ねて、 濃い部分をより黒くする用途で使う予定なので 黒地のMK[3]にいくつも灰色を「加算」で重ねて白くしていくことでそれを表現するつもりです。 なのでMK[3]はClearDrawScreen();ではなく、黒で塗りつぶして消したいのですが、 その場合はMK[1]=MakeScreen(MKx,MKy,0);とする方法がベストという認識であっていますでしょうか? UseAlphaChannelが0なら SetDrawScreen(MK[1]);SUB(255);DrawGraph( 0,0,MK[3],1); としても、MK[1]の色だけが減算されて、アルファ値はMK[1]の255が維持されるという事だと思うのですが m(__)m
メンテ
Re: MakeScreenのUseAlphaChannelに関連する質問 ( No.8 )
名前:管理人 日時:2022/09/28 07:36

> なのでMK[3]はClearDrawScreen();ではなく、黒で塗りつぶして消したいのですが、 > その場合はMK[1]=MakeScreen(MKx,MKy,0);とする方法がベストという認識であっていますでしょうか? はい、その認識で合っています > UseAlphaChannelが0なら > SetDrawScreen(MK[1]);SUB(255);DrawGraph( 0,0,MK[3],1); > としても、MK[1]の色だけが減算されて、アルファ値はMK[1]の255が維持されるという事だと思うのですが はい、その通りです
メンテ
Re: MakeScreenのUseAlphaChannelに関連する質問 ( No.9 )
名前:たろう(解決) 日時:2022/09/28 15:39

いつもありがとうございます。 またお手数をおかけしてしまいましたが 謎が解けて、安心して作業が続けられます。 ありがとうございました<(_ _)>
メンテ

Page: 1 |

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

   クッキー保存