トップページ > 記事閲覧
キャラクター画像に穴を開けたい
名前:たろう 日時: 2018/10/04 01:14

すみません、また たろうです 透明部分のあるキャラクター画像の一部に穴を開けたいのですが GraphBlend( 画1, 画2, 255, DX_GRAPH_BLEND_PMA_MULTIPLE_A_ONLY ) ; とすれば用意した穴用画像「画2」(黒塗り下地の真ん中に透明部分の穴が空いたものなど)で 「画1」に穴を開けることが出来ると思います。ですがこれだと「画1」と「画2」が縦横サイズが同じでないと だめですし、穴を好きなところに開けることができません。 GraphBlendRectBltも考えたのですが、これは 上で言うところのSrcGrHandleが画1で、BlendGrHandleが画2。 DestGrHandleが画1とすれば良い気がしますが またこの場合多分「画1」の一部分を「画2」でくり抜いた画像を、「画1」に貼っているだけなので穴は 開かない気がします 実用レベルの処理速度が得られるかはわかりませんが一応すごく回りくどい方法としては・・・ 「画1」と同じサイズの「画3」をMakeScreenして、 穴を開けたい場所に「画2」を貼り(※描画対象は3)、隙間をDrawRectで黒く埋めて GraphBlend( 画1, 画3, 255, DX_GRAPH_BLEND_PMA_MULTIPLE_A_ONLY ) ; とする方法で出来そうですが、 攻撃を受けたキャラクターの頭が欠けるなどの演出で ゲーム中に何度もキャラクターを削る事を想定していて 出来る限り早い処理をしたいと思っています 効率的な方法がございましたら アドバイスをいただけますでしょうか? よろしくお願いいたします。
メンテ

Page: 1 |

Re: キャラクター画像に穴を開けたい ( No.1 )
名前:管理人 日時:2018/10/04 01:47

恐らく『実用レベルの処理速度が得られるかはわかりませんが一応すごく回りくどい方法』で実現できるのではないかと思います ( 尚、『穴を開けたい場所に「画2」を貼り(※描画対象は3)』の際には SetDrawBlendMode( DX_BLENDMODE_SRCCOLOR ) ; という 特殊なブレンドモードにする必要があります ) ただ、高速な処理速度を得るためには GraphBlend ではなく GraphBlendBlt を使用して、且つ SrcGrHandle と DestGrHandle は 別のグラフィックハンドルで、且つ DestGrHandle は MakeScreen で作成したグラフィックハンドルである必要があります ( LoadGraph で作成した『描画先に指定できない画像』を出力先とした場合は低速( VRAM にある出力結果を一度システムメモリに  転送した後、改めて VRAM に転送するという非常に低速な処理が発生します )なのと、合成処理した結果を SrcGrHandle に  出力する場合は、まず作業用のグラフィックハンドルに出力した後、SrcGrHandle に転送するという余計な処理が発生する為 ) ただ、ゲーム中に何度も削れるとのことですが、1フレームで何十回もこの処理を行うようなことが無ければ恐らく GraphBlend を使用して、SrcGrHandle と DestGrHandle のグラフィックハンドルが同じで、SrcGrHandle が MakeScreen で作成した グラフィックハンドルではなくても速度的には問題ないのではないかと思います( どのくらいの動作環境を想定されているかにもよりますが… )
メンテ
Re: キャラクター画像に穴を開けたい ( No.2 )
名前:たろう 日時:2018/10/04 04:29

ご返信いただきありがとうございます > ( 尚、『穴を開けたい場所に「画2」を貼り(※描画対象は3)』の際には SetDrawBlendMode( DX_BLENDMODE_SRCCOLOR ) ; という > 特殊なブレンドモードにする必要があります ) すみません、DX_BLENDMODE_SRCCOLORとはどういうものでしょうか?調べたのですが、難しく・・・ 画1と 画2はともにSetUsePremulAlphaConvertLoad( TRUE ) ;にした上での MakeScreen で作成したグラフィックハンドルなのですが SetDrawBlendMode( DX_BLENDMODE_PMA_ALPHA, 255 );の状態で GraphBlend( 画1, 画2, 255, DX_GRAPH_BLEND_PMA_MULTIPLE_A_ONLY ) ; とPMA付きのモードを使う事で、問題なく使えると認識していました。いままでそれで問題なかったのですが これは誤りでしょうか?、知識が足りず教えていただけると助かります。 ※追記:以前の質問でDX_BLENDMODE_SRCCOLORについては 「描画元の色をそのまま描画先に書き込むモード」とお答えいただいていたようでした 理解が足りず、その時結局使用しなかったので忘れていたようなのですが、これは乗算済みアルファを使う場合は 不要という認識であっていますでしょうか? > ただ、高速な処理速度を得るためには GraphBlend ではなく GraphBlendBlt を使用して、且つ SrcGrHandle と DestGrHandle は > 別のグラフィックハンドルで、且つ DestGrHandle は MakeScreen で作成したグラフィックハンドルである必要があります この場合穴を開けるたびに、まず「画1」をGetGraphSizeで図ってそのサイズで「画3」(※DestGrHandleに入れる用)をMakeScreenで作り そしてGraphBlendBltで「画1」を「画2」の形で穴を開けたものが「画3」に入り、その後「画1」をDeleteGraphで削除 「画1」=「画3」として完成画像を入れ替えるという作業になると思います。 結構重そうな処理のようでも、GraphBlendで行えば内部でそれ以上の処理をしているので GraphBlendBltを使うほうが早い、という認識であっていますでしょうか? なんども質問をすみません、よろしくお願いいたします。
メンテ
Re: キャラクター画像に穴を開けたい ( No.3 )
名前:管理人 日時:2018/10/05 01:02

>  画1と 画2はともにSetUsePremulAlphaConvertLoad( TRUE ) ;にした上での >  MakeScreen で作成したグラフィックハンドルなのですが > SetDrawBlendMode( DX_BLENDMODE_PMA_ALPHA, 255 );の状態で > GraphBlend( 画1, 画2, 255, DX_GRAPH_BLEND_PMA_MULTIPLE_A_ONLY ) ; > とPMA付きのモードを使う事で、問題なく使えると認識していました。いままでそれで問題なかったのですが > これは誤りでしょうか?、知識が足りず教えていただけると助かります。 あ、すみません、画2は何も描かれていない MakeScreen で作成したグラフィックハンドルを使用するのでしたね それでしたら SetDrawBlendMode( DX_BLENDMODE_PMA_ALPHA, 255 ); で問題ありません > ※追記:以前の質問でDX_BLENDMODE_SRCCOLORについては > 「描画元の色をそのまま描画先に書き込むモード」とお答えいただいていたようでした はい、その通りです > 理解が足りず、その時結局使用しなかったので忘れていたようなのですが、これは乗算済みアルファを使う場合は > 不要という認識であっていますでしょうか? 何も描かれていない MakeScreenで作成したグラフィックハンドルに対して描画を行う場合は不要という認識であっています ただ、描画速度は DX_BLENDMODE_SRCCOLOR の方が高速かもしれません > この場合穴を開けるたびに、まず「画1」をGetGraphSizeで図ってそのサイズで「画3」(※DestGrHandleに入れる用)をMakeScreenで作り > そしてGraphBlendBltで「画1」を「画2」の形で穴を開けたものが「画3」に入り、その後「画1」をDeleteGraphで削除 > 「画1」=「画3」として完成画像を入れ替えるという作業になると思います。 この処理を行う度に MakeScreen と DeleteGraph を行うのは非効率なので、この処理を採用する場合は予め 画2と画3として使用するグラフィックハンドルは事前に MakeScreen で作成しておき、一回ごとに MakeScreen と DeleteGraph を呼ばないようにする必要があります 仮に毎回 MakeScreen と DeleteGraph を呼ぶ場合は GraphBlend を使用するのと同じくらいの重さになると思います ( 処理の質が異なるので環境によってどちらが重いかは変わるかもしれませんが… )
メンテ
Re: キャラクター画像に穴を開けたい ( No.4 )
名前:たろう 日時:2018/10/05 02:40

ご返信いただきありがとうございます。 追加で質問をお許しください。 「何も描かれていない MakeScreen で作成したグラフィックハンドル」という部分がわかりにくいのですが これには 「MakeScreen で作成したグラフィックハンドルに何かを書き込んだ画像」も含まれるのでしょうか? 例えば画1はSetUsePremulAlphaConvertLoad( TRUE ) ;にした上での MakeScreen で作成したグラフィックハンドルにキャラクターを貼り付けたもので、何も描かれていない わけではないので・・・・ また、たとえば画2が、SetUsePremulAlphaConvertLoad( TRUE ) ;にした上でLoadGraphで読み込んだ画像の場合でも DX_BLENDMODE_SRCCOLORは不要だと思っているのですが、これは正しいでしょうか? またDX_BLENDMODE_SRCCOLORの「描画元の色をそのまま描画先に書き込むモード」という部分が私には難しいのですが これはアルファ値は描画先の物がそのまま使われて、そこに描画元の色だけがかぶさるという意味でしょうか? また、DX_BLENDMODE_SRCCOLORを使う場合は、 MakeScreen や LoadGraphの前にSetUsePremulAlphaConvertLoad( TRUE ) ;は不要という認識で正しいでしょうか? なんどもすみません、お手すきのときで結構です。 よろしくお願いいたします。
メンテ
Re: キャラクター画像に穴を開けたい ( No.5 )
名前:管理人 日時:2018/10/07 02:03

> 追加で質問をお許しください。 > 「何も描かれていない MakeScreen で作成したグラフィックハンドル」という部分がわかりにくいのですが > これには 「MakeScreen で作成したグラフィックハンドルに何かを書き込んだ画像」も含まれるのでしょうか? > 例えば画1はSetUsePremulAlphaConvertLoad( TRUE ) ;にした上での > MakeScreen で作成したグラフィックハンドルにキャラクターを貼り付けたもので、何も描かれていない > わけではないので・・・・ 言葉足らずですみません こちらのご返答を書いたのですが、書いていて、ますます話がこんがらがる未来しか想像できなかったので ご返答は差し控えます、たろうさんの思われる方法で期待する結果が得られなかった際は改めてご質問ください m(_ _)m > また、たとえば画2が、SetUsePremulAlphaConvertLoad( TRUE ) ;にした上でLoadGraphで読み込んだ画像の場合でも > DX_BLENDMODE_SRCCOLORは不要だと思っているのですが、これは正しいでしょうか? はい、No.3 のご返答でも述べていますが、『DX_BLENDMODE_SRCCOLORを使用したほうが高速かもしれない』というだけで、 『DX_BLENDMODE_SRCCOLORを使用しなければ希望の処理が実現できない』わけではありません > またDX_BLENDMODE_SRCCOLORの「描画元の色をそのまま描画先に書き込むモード」という部分が私には難しいのですが > これはアルファ値は描画先の物がそのまま使われて、そこに描画元の色だけがかぶさるという意味でしょうか? いえ、R(赤)・G(緑)・B(青)・A(アルファ)全て描画元の物が使用され、描画先の物は一切残らないモードです 描画先の物と一切計算が行われないので DX_BLENDMODE_PMA_ALPHA などよりも高速に処理が行われる可能性があるということです > また、DX_BLENDMODE_SRCCOLORを使う場合は、 > MakeScreen や LoadGraphの前にSetUsePremulAlphaConvertLoad( TRUE ) ;は不要という認識で正しいでしょうか? いえ、違います たろうさんが最初に述べられた > 実用レベルの処理速度が得られるかはわかりませんが一応すごく回りくどい方法としては・・・ > 「画1」と同じサイズの「画3」をMakeScreenして、 > 穴を開けたい場所に「画2」を貼り(※描画対象は3)、隙間をDrawRectで黒く埋めて > GraphBlend( 画1, 画3, 255, DX_GRAPH_BLEND_PMA_MULTIPLE_A_ONLY ) ; > とする方法で出来そうですが、 こちらの方法の『穴を開けたい場所に「画2」を貼り』の際に『SetDrawBlendMode( DX_BLENDMODE_PMA_ALPHA, 255 );』の 代わりに『SetDrawBlendMode( DX_BLENDMODE_SRCCOLOR, 255 );』が使用できる、というだけのものです
メンテ
Re: キャラクター画像に穴を開けたい ( No.6 )
名前:たろう(解決) 日時:2018/10/07 23:39

ご返信いただきありがとうございます。 今の所期待した結果が得られているので 頂いた情報を参考に色々試してみたいと思います。 ありがとうございましたm(_ _)m
メンテ

Page: 1 |

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

   クッキー保存