トップページ > 記事閲覧
SetDrawBlendModeで、画像のアルファ値のみ張り付けなど
名前:たろう 日時: 2023/10/05 00:41

いつもすみません。たろうです MakeScreenで作ったsc(赤で塗りつぶしています)に画像imの透明部分のみを張り付けたいのですが これは可能でしょうか? つまりimの透明部分の形でscの一部を消す用途で使用したいのですが、 imのr,g,b要素は無視してscのr,g,bを残し、もしscに透明部分があった場合は、scとimの両方の透明部分を生かす感じです。 scと同サイズのimを用意してGraphBlendとDX_GRAPH_BLEND_PMA_RGBA_SELECT_MIXやDX_GRAPH_BLEND_PMA_MULTIPLE_A_ONLY を使えば出来るのですが、すごく大きいscに小さなimの透明部分を貼りたい時は、 この方法だと処理にかなりの無駄が発生してしまうと思うので SetDrawBlendModeのモードで可能であれば行いたいのです。(imの不透明部分を透明部分とする逆バージョンもあると・・・) 可能であればで構いません。 ご検討いただけますでしょうかm(__)m #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { ChangeWindowMode( TRUE ) ; DxLib_Init(); SetUsePremulAlphaConvertLoad(1); SetDrawScreen( DX_SCREEN_BACK ) ; int im = LoadGraph("0001.png"); int sc=MakeScreen(400,400,1); while( ProcessMessage() == 0 ) { ClearDrawScreen(); SetDrawScreen(sc); SetDrawBlendMode(DX_BLENDMODE_PMA_ALPHA,255); DrawBox(0,0,400,400,GetColor(255,0,0),1); //SetDrawBlendMode(ここです,255); DrawGraph(100,0,im,1); SetDrawScreen(DX_SCREEN_BACK); DrawBox(0,0,1000,1000,GetColor(0,0,100),1); DrawGraph(0,0,sc,1); ScreenFlip(); } DxLib_End() ; return 0 ; } よろしくお願いいたしますm(__)m
メンテ

Page: 1 | 2 | 3 |

Re: SetDrawBlendModeで、画像のアルファ値のみ張り付けなど ( No.1 )
名前:管理人 日時:2023/10/04 23:58

すみません、現状では GraphBlend を使用する以外の方法はありません SetDrawBlendMode のブレンドモードを追加することでも可能ですが、少し作業量が多いので 週末の纏まった時間が必要です ただ、次の週末は別件の対応をする予定となっていますので、最速でも 次の次の週末になります( 10/14〜10/15 の土日 ) ( 更に、『最速で』なので、もしかしたら実装完了はもっと後になるかもしれません ) それでもよろしければブレンドモードを追加します ( もしもっと早く実装されないと問題があり、そこまで遅いのなら不要、という場合は実装は見送ります m(_ _)m )
メンテ
Re: SetDrawBlendModeで、画像のアルファ値のみ張り付けなど ( No.2 )
名前:たろう 日時:2023/10/05 00:48

すみません、相変わらず知識が足りず そこまで大変な作業になるものとは思いませんでした。 ですが、これがあると地面を崩したり、 キャラの頭を削ったりするときなどに、滅茶苦茶便利になりますし、 DXライブラリの初心者であってもお手軽にそういう事が出来るように なると思います。 GraphBlendで実行する方法で進めて もしブレンドモードを追加していただいたらその方法に切り替える形で 待ちますので、ぜんぜん待ちます。 年単位で待ちます。 是非よろしくお願いいたしますm(__)m
メンテ
Re: SetDrawBlendModeで、画像のアルファ値のみ張り付けなど ( No.3 )
名前:管理人 日時:2023/10/06 00:13

お待ち頂ける旨了解しました 思えば次の週末は3連休なので、早ければ次の週末中に実装できるかもしれません というわけで少々お待ち下さい m(_ _)m > すみません、相変わらず知識が足りず > そこまで大変な作業になるものとは思いませんでした。 すみません、変更箇所が多いだけで技術的には全然大変な部分はありません 単純に現在私が平日に作業に使える時間が全然無いだけで… m(_ _;m
メンテ
Re: SetDrawBlendModeで、画像のアルファ値のみ張り付けなど ( No.4 )
名前:たろう 日時:2023/10/06 00:58

ありがとうございますm(__)m いつもお手数をおかけしてすみません。 正座して何年でも待ちますm(__)m
メンテ
Re: SetDrawBlendModeで、画像のアルファ値のみ張り付けなど ( No.5 )
名前:管理人 日時:2023/10/07 23:33

思っていたより必要な作業が少なく、想定外の問題なども発生しなかったので 早目に画像のアルファ値のみ描画するブレンドモードの実装が完了しました よろしければこちらの機能追加版をダウンロードしてください m(_ _)m https://dxlib.xsrv.jp/temp/DxLibVCTest.zip // Windows版 VisualC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCCTest.zip // Windows版 BorlandC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCC2Test.zip // Windows版 C++ Builder 11.3 用 https://dxlib.xsrv.jp/temp/DxLibGCC_MinGWTest.zip // Windows版 MinGW 用 https://dxlib.xsrv.jp/temp/DxLibDotNet.zip // Windows版 .NET用 https://dxlib.xsrv.jp/temp/DxLibMakeTest.zip // ソース (中身を既存のライブラリのファイルに上書きして『リビルド』をして下さい) 以下のブレンドモードを追加しました DX_BLENDMODE_DST_RGB_SRC_A こちらのブレンドモードに変更した上で DrawGraph などで描画すると 画像のアルファ値のみが描画先に書き込まれます よろしければお試しください m(_ _)m
メンテ
Re: SetDrawBlendModeで、画像のアルファ値のみ張り付けなど ( No.6 )
名前:たろう 日時:2023/10/08 22:23

いつもありがとうございます。 すみません、お願いしている立場で大変恐縮ではありますが 少し思っていた動作と違うようです。 それで、テストプログラムのようなものを書いてみました。 @「もしscに透明部分があった場合は、scとimの両方の透明部分を生かす感じ」を想定していたのですが 下のプログラムを起動していただくと分かるとおり、imの透明部分だけが生かされてしまっているようで scの透明部分かつimの不透明部分が真っ黒として表示されてしまっています。 Aいまだに私が無能すぎて理解不能な部分ですが、たぶん乗算済みアルファが考慮されていないようで imのアルファ値の度合いに見合わない濃さでscが描画されてしまっているようです。 すみません、私のチェック方法が間違っていたらごめんなさいm(__)m ご確認いただけるとありがたいですm(__)m よろしくお願いいたしますm(__)m #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { ChangeWindowMode( TRUE ) ; DxLib_Init(); SetUsePremulAlphaConvertLoad(1); //アルファ値にグラデーションのあるimを作る int im=MakeScreen(400,400,1); SetDrawScreen(im);ClearDrawScreen(); for(int i=1;i<=10;i++){SetDrawBlendMode(DX_BLENDMODE_PMA_ALPHA,(int)(255*(i/10.0)));DrawBox(30*i,0,30*i+30,300,GetColor(255,255,255),1);} //アルファ値にグラデーションのあるscを作る int sc=MakeScreen(400,400,1); SetDrawScreen(sc);ClearDrawScreen(); for(int i=1;i<=5;i++){SetDrawBlendMode(DX_BLENDMODE_PMA_ALPHA,(int)(255*(i/5.0)));DrawBox(0,60*i,300,60*i+60,GetColor(255,0,0),1);} //scにDX_BLENDMODE_DST_RGB_SRC_Aでアルファ値だけ貼り付け SetDrawBlendMode(DX_BLENDMODE_DST_RGB_SRC_A,255); DrawGraph(0,0,im,1); //DX_SCREEN_BACKに戻す SetDrawBlendMode(DX_BLENDMODE_PMA_ALPHA,255); SetDrawScreen(DX_SCREEN_BACK); while( ProcessMessage() == 0 ) { ClearDrawScreen(); DrawBox(0,0,1000,1000,GetColor(0,0,100),1); DrawGraph(0,0,sc,1); ScreenFlip(); } DxLib_End() ; return 0 ; }
メンテ
Re: SetDrawBlendModeで、画像のアルファ値のみ張り付けなど ( No.7 )
名前:管理人 日時:2023/10/09 00:40

すみません、私がたろうさんの最初のご投稿をちゃんと読めていませんでした 今回実装したのは GraphBlend の DX_GRAPH_BLEND_RGBA_SELECT_MIX で DX_RGBA_SELECT_BLEND_R, DX_RGBA_SELECT_BLEND_G, DX_RGBA_SELECT_BLEND_B, DX_RGBA_SELECT_SRC_A を指定して実行した場合と同じ効果があるブレンドモードです たろうさんが希望されていた描画先と描画元のaを合成する機能はブレンドモードの仕組みでは 実装することはできません m(_ _;m ( Direct3D の『描画先の値と描画元の値をどのように合成するか』の 機能に『加算』と『減算』しかなく、合成に必要な『乗算』が存在しないため ) GraphBlendRectBlt を使用することで画像の一部分だけを合成することができますので、 申し訳ありませんが GraphBlendRectBlt を使用するようにしてください m(_ _;m <GraphBlendRectBlt> https://dxlib.xsrv.jp/function/dxfunc_graph1.html#R3N31
メンテ
Re: SetDrawBlendModeで、画像のアルファ値のみ張り付けなど ( No.8 )
名前:たろう(解決) 日時:2023/10/09 02:19

ご返信ありがとうございます。 そのような事情があるとはつゆ知らず、こちらこそ大変申し訳ございません、 確かにGraphBlendRectBltでも、貼る画像のサイズさえ測っておけば、 かなり近い形でできそうですm(__)m 反省の上、また、無い頭をふりしぼり、 GraphBlendRectBltで実行する方法で頑張ります。 今回もとんでもないお手数を おかけしてしまいました。 m(__)m
メンテ
Re: SetDrawBlendModeで、画像のアルファ値のみ張り付けなど ( No.9 )
名前:よこ 日時:2023/10/10 20:01

こんにちは横からすみません 管理人様へ 今回追加されたモードは内部ではGraphBlendを実行したときと同じ処理をしているのでしょうか? もし何らかの最適化により多少なりとも負荷軽減が見込めるのであればほかにも追加していただきたい似たモードがあるのですが.. 同じ処理をしている場合や作業時間が取れないなどであればGraphBlendを使用しますので追加していただかなくて大丈夫です
メンテ
Re: SetDrawBlendModeで、画像のアルファ値のみ張り付けなど ( No.10 )
名前:管理人 日時:2023/10/11 01:55

> 今回追加されたモードは内部ではGraphBlendを実行したときと同じ処理をしているのでしょうか? いえ、全く別の処理をしています GraphBlend   ピクセルシェーダーを使用して2つの画像をブレンドする計算を行ったあと、描画先にベタ書き込み DX_BLENDMODE_DST_RGB_SRC_A   Direct3D の『描画先と描画元をブレンドする機能』を使用して実現、ピクセルシェーダーは使用せず となっています > もし何らかの最適化により多少なりとも負荷軽減が見込めるのであればほかにも追加していただきたい似たモードがあるのですが.. ブレンドモードは Direct3D の『描画先と描画元をブレンドする機能』によって実現できるもののみで構成 されているのですが、GraphBlend にある機能の殆どはこの『描画先と描画元をブレンドする機能』では 実現できないものばかりとなっています なので、ご希望のモードも実現できないかもしれませんが、よろしければご希望のモードについて教えてください m(_ _)m
メンテ

Page: 1 | 2 | 3 |

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

   クッキー保存