トップページ > 記事閲覧
DrawBoxとPMA付きのモードに関して
名前:たろう 日時: 2018/11/26 17:06

いつもすみません、たろうです。 以下のプログラムで、作った「幕」に減算でDrawBoxした物と 直接スクリーンにDrawBoxした物とで画像が変わってしまうのですが @同じ画像が表示されるようにしたいのですが、使い方を間違っていますでしょうか? ADX_SCREEN_BACKに直接DrawBoxした方も「PMA」入りになっていますが 「PMA」無しを使っても同じ画像になります。これはそういうものなのでしょうか? すみません、何度も似たような質問をしているのですが、未だ理解が乏しく また質問させていただこうと思いました。 お手すきのときでかまいません、よろしくお願いいたしますm(_ _)m ----------------------------------------------------------------------------------- #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { ChangeWindowMode( TRUE ); SetGraphMode(200,200,16); if( DxLib_Init() < 0 ) return -1; SetUsePremulAlphaConvertLoad( TRUE ) ; int 幕 = MakeScreen( 100 , 100 , TRUE ); int 地色= GetColor( 0 , 255 , 0 ); int 灰色= GetColor( 125 , 125 , 125 ); int 色1= GetColor( 0 , 50 , 60 ); SetDrawScreen(幕); DrawBox( 0,0,100,100,灰色, TRUE ); SetDrawBlendMode( DX_BLENDMODE_PMA_SUB, 125 ) ; DrawBox( 20,20,80,80,色1, TRUE ); SetDrawBlendMode( DX_BLENDMODE_PMA_ALPHA, 255 ) ; SetDrawScreen( DX_SCREEN_BACK ); while( ProcessMessage() == 0 ) { ClearDrawScreen() ; DrawBox( 0,0,300,300,地色, TRUE ); DrawBox( 0,0,100,100,灰色, TRUE ); SetDrawBlendMode( DX_BLENDMODE_PMA_SUB, 125 ) ; DrawBox( 20,20,80,80,色1, TRUE ); SetDrawBlendMode( DX_BLENDMODE_PMA_ALPHA, 255 ) ; DrawGraph( 100, 0 , 幕 , TRUE ); ScreenFlip(); } DxLib_End(); return 0; }
メンテ

Page: 1 |

Re: DrawBoxとPMA付きのモードに関して ( No.1 )
名前:管理人 日時:2018/11/27 00:47

> @同じ画像が表示されるようにしたいのですが、使い方を間違っていますでしょうか? はい これは乗算済みαが万能ではない残念な点なのですが、 『MakeScreen で作成したグラフィックハンドルに対して描画したものを、最終的にスクリーンに描画した場合』 と 『同じ描画を直接スクリーンに描画した場合』 の描画結果が一致するという乗算済みαの特性は、 『MakeScreen で作成したグラフィックハンドルに対する描画にαブレンド以外の描画を行わなかった場合のみ』 なのです というのも、最終的にスクリーンに対してαブレンド( DX_BLENDMODE_PMA_ALPHA )で描画するので、 MakeScreen に対して加算や減算で描画を行っても、最終的なスクリーンへの描画では、その加算や減算が行われないからです ( MakeScreen に対して加算や減算で描画を行った箇所はスクリーンへの描画でも加算や減算を行ってくれるといった  気の利いたことはしてくれません… ) なので、申し訳ありませんが加算や減算を使用する場合は直接スクリーンに描画するようにしてください m(_ _;m > ADX_SCREEN_BACKに直接DrawBoxした方も「PMA」入りになっていますが >  「PMA」無しを使っても同じ画像になります。これはそういうものなのでしょうか? はい、DrawBox や DrawLine などの図形描画関数で直接スクリーンに描画する場合は同じ結果になります 描画されるα値は異なるのでαチャンネル付きの MakeScreen で作成したグラフィックハンドルに対して 描画する場合は PMA 入りかどうかで結果が変わりますが、スクリーンにはαチャンネルは無いので、 同じ見た目になります
メンテ
Re: DrawBoxとPMA付きのモードに関して ( No.2 )
名前:たろう 日時:2018/11/27 01:44

ご返信いただきありがとうございます。 > 最終的なスクリーンへの描画では、その加算や減算が行われない の部分についてお聞きしたいのですが、 上のプログラムでは「幕」をまず灰色で100%の濃さで完全に覆っていて、 その部分の内側に、減算で色1を被せているので、 最終的なスクリーンへの描画の時に減算が行われなくとも (※つまり色1をかぶせた部分は画像に半透明部分がないので) やはりDX_SCREEN_BACKに直接同じ手順で描画を行った場合と 同じ画像になるように思えるのですが(※もちろん実際に試すとそうならないのですが) それは違いますでしょうか? すみません、なんども同じような質問をして 結局あまり理解できていないので、 上記のような場合であってもやはりMakeScreenしたものには 減算、加算は行えないという事であればその旨だけで結構です。 何度も蒸し返すようですみません よろしくお願いいたしますm(_ _)m
メンテ
Re: DrawBoxとPMA付きのモードに関して ( No.3 )
名前:管理人 日時:2018/11/28 00:02

> 最終的なスクリーンへの描画の時に減算が行われなくとも > (※つまり色1をかぶせた部分は画像に半透明部分がないので) > やはりDX_SCREEN_BACKに直接同じ手順で描画を行った場合と > 同じ画像になるように思えるのですが(※もちろん実際に試すとそうならないのですが) > それは違いますでしょうか? int 幕 = MakeScreen( 100 , 100 , TRUE ); こちらの MakeScreen の第三引数が FALSE であれば仰るとおり直接スクリーンに描画した場合と同じ結果になりますが、 こちらが TRUE の場合はグラフィックハンドルにはαチャンネルが存在することになりますので、 その場合はグラフィックハンドルに対して減算描画を行うとα値も減算され、それをスクリーンに対してαブレンドすると 減算された部分が透明になり、直接スクリーンに減算描画した場合とは異なる描画結果となります
メンテ
Re: DrawBoxとPMA付きのモードに関して ( No.4 )
名前:たろう(解決) 日時:2018/11/28 01:23

いつもありがとうございます キャラクターに対して減算で赤以外の色を描いて、 怪我をしたような表現に使おうと思っていたのですが FALSEにしてしまうと透明部分のあるキャラクターに対して使うことが出来ないので 例えば・・・ FALSEで作った幕に一旦キャラクターを描いて、その上に怪我の色(青緑)を減算で描き それをTRUEで作った別の幕2などに貼って、それをさらに キャラクターの形にDX_GRAPH_BLEND_PMA_RGBA_SELECT_MIX で切り抜くなどの方法で出来そうですが、ちょっと重そうですね^^; 減算は使わず、普通に赤色を貼ろうと思います。 ありがとうございましたm(_ _)m
メンテ

Page: 1 |

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

   クッキー保存