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
> ②「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
> ③ちょっと関係ないですが、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の色味になっている件、ありがとうございます<(_ _)>勉強になりました。
③につきまして安心しました。ありがとうございます。
②につきまして、すみません、説明が足りなかったかもしれません。
>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
> ②につきまして、すみません、説明が足りなかったかもしれません。
すみません、私も文章の理解が足りませんでした
> ②「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
いつもありがとうございます。
①で色味が変わる原因も分かった事もあり、
これで安心して②の使用方法を試すことが出来ます。
お手数をおかけいたしました
ありがとうございました<(_ _)>
|
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になっているからだと思うのですが
期待通りの動作をします。
ところが下の「※ここです①」の行をコメントアウトすると
全て真っ黒になってしまいます。
またこのコメントアウトの状態で「※ここです②」の行の
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);//メイン幕//※ここです②
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
いつもありがとうございます。
またお手数をおかけしてしまいましたが
謎が解けて、安心して作業が続けられます。
ありがとうございました<(_ _)>
|
|