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
|