トップページ > 記事閲覧
SetMaskScreenGraphについての要望
名前:wodae 日時: 2015/11/07 12:12

はじめまして、以前よりDXライブラリを良く利用させていただいております。 ttp://hpcgi2.nifty.com/natupaji/bbs/patio.cgi?mode=view&no=3591 こちらの記事にて追加されたSetMaskScreenGraph関数につきまして要望なのですが、 記事後半で管理人様が触れている「アルファチャンネルのアルファ値ではなく"RGBの色"で判断」という機能を 追加して頂くことは叶いますでしょうか? 今回、RGBの各色毎に独立したマスク情報を持つ画像を用意して、それぞれ別個に使い分けて利用できればと思っています。 もし3色まとめてが厳しいとしても、例えばRのみ参照、Gのみ参照……など出来るような関数があると非常に助かります (マスク用の画像やマスクスクリーンには、なるべくアルファ情報を持たせたくない……というのが理由です) お忙しい所大変恐縮ですが、ご検討いただけますと幸いです。
メンテ

Page: 1 |

Re: SetMaskScreenGraphについての要望 ( No.1 )
名前:管理人 日時:2015/11/08 03:53

> 今回、RGBの各色毎に独立したマスク情報を持つ画像を用意して、それぞれ別個に使い分けて利用できればと思っています。 > もし3色まとめてが厳しいとしても、例えばRのみ参照、Gのみ参照……など出来るような関数があると非常に助かります すみません、Rのみ参照、Gのみ参照…はわかるのですが、「3色まとめて」とはどのような機能でしょうか? R * G * B の結果をアルファ値とする・・・のような機能でしょうか?
メンテ
Re: SetMaskScreenGraphについての要望 ( No.2 )
名前:wodae 日時:2015/11/08 09:52

すみません、言葉が不足しておりました。 自分が考えていたマスク処理のイメージは、まず「SetMaskScreenGraphのRGB参照に当たる関数(A)」を用いてマスクスクリーンを設定し、 その上にRGBのマスク画像を描画した後、「任意のカラー情報をマスク情報として設定出来る関数(B)」を指定する事でマスクの任意切替が出来るようになる、というものです。 「3色まとめて」という言葉が良く無かったですね……。あくまで各カラー単位で参照できれば構いません。 上記でいう「関数(A)」がもし「Rのみ参照、Gのみ参照、Bのみ参照」という扱いであったら、 「関数(A)でRをマスク>Rマスク描画>Rマスク利用>関数(A)でGをマスク>Gマスク描画>Gマスク利用>関数(A)でBをマスク>Bマスク描画>Bマスク利用」 というプロセスになって手間になるのでは……と思いました。 関数(A)(B)の併用であれば、 「関数(A)でRGBをマスク>RGBマスク描画>関数(B)でRマスク利用>関数(B)でGマスク利用>関数(B)でBマスク利用」 という流れになり描画回数を減らせるのでは、と考えているのですが如何でしょうか? 完全な素人意見ですので、もし素っ頓狂な事を書いてしまっているようでしたら申し訳ありません。
メンテ
Re: SetMaskScreenGraphについての要望 ( No.3 )
名前:管理人 日時:2015/11/08 21:41

ご返答ありがとうございます、意図が理解できました 早速機能を追加してみましたので、よろしければこちらをダウンロードしてください m(_ _)m https://dxlib.xsrv.jp/temp/DxLibVCTest.exe // VisualC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCCTest.exe // BorlandC++ 用 https://dxlib.xsrv.jp/temp/DxLibGCC_DevCppTest.exe // Dev-C++ 用 https://dxlib.xsrv.jp/temp/DxLibGCC_MinGWTest.exe // MinGW 用 https://dxlib.xsrv.jp/temp/DxLibDotNet.zip // .NET用 https://dxlib.xsrv.jp/temp/DxLibMakeTest.exe // ソース (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』を、VCをお使いの場合は『リビルド』を、 Dev-C++をお使いの方は「Rebuild All(Ctrl+F11)」をして下さい) 以下の関数を追加しました // マスクスクリーンとして使用するグラフィックの内でマスクとして使用するチャンネルを変更する // UseChannel : マスクとして使用するチャンネル // DX_MASKGRAPH_CH_A : アルファ( デフォルト ) // DX_MASKGRAPH_CH_R : 赤 // DX_MASKGRAPH_CH_G : 緑 // DX_MASKGRAPH_CH_B : 青 // ( 尚、DX_MASKGRAPH_CH_A以外を使用する場合はグラフィックスデバイスがシェーダーモデル2.0以降に対応している必要があります ) int SetMaskScreenGraphUseChannel( int UseChannel ) ; wodaeさんは SetMaskScreenGraph の時点でマスクとして使用するチャンネルを設定することを想定されて いましたが、今回追加した機能では SetMaskScreenGraph の時点では今まで通り特に何も指定せず、 描画の前に SetMaskScreenGraphUseChannel を使用してマスクとして使用するチャンネルを指定する ようになっています http://hpcgi2.nifty.com/natupaji/bbs/patio.cgi?mode=view&no=3591 ↑ こちらのスレッドのサンプルに「マスク用画像の赤色の部分をマスクとして使用する」ための SetMaskScreenGraphUseChannel( DX_MASKGRAPH_CH_R ) ; を追加しただけですが、以下のようになります #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int GraphHandle ; int ScreenHandle ; int x, add ; // ウインドウモードで起動 ChangeWindowMode( TRUE ) ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) return -1 ; // 画像を読み込み GraphHandle = LoadGraph( "Test1.bmp" ) ; // マスクスクリーンに使うアルファチャンネル付きの描画対象にできるグラフィックハンドルを作成 ScreenHandle = MakeScreen( 640, 480, TRUE ) ; // 描画先を裏画面にする SetDrawScreen( DX_SCREEN_BACK ) ; // マスク機能の初期化を行う CreateMaskScreen() ; // マスクスクリーンに使用するグラフィックハンドルとして MakeScreen で作成したグラフィックハンドルをセット SetMaskScreenGraph( ScreenHandle ) ; // マスクスクリーン中の赤色の部分をマスクとして使用する SetMaskScreenGraphUseChannel( DX_MASKGRAPH_CH_R ) ; // 画像の移動処理用の変数を初期化 x = 0 ; add = 8 ; // メインループ while( ProcessMessage() == 0 ) { // 画像の移動処理 x += add ; if( x < 0 || x > 640 ) { add = -add ; } // 描画先をマスク用の画像に変更 SetDrawScreen( ScreenHandle ) ; // マスク用の画像をクリア ClearDrawScreen() ; // 画像を横に2倍拡大して描画 DrawExtendGraph( x, 0, x + 119 * 2, 480, GraphHandle, TRUE ) ; // 描画先を裏画面に変更 SetDrawScreen( DX_SCREEN_BACK ) ; // 裏画面をクリア ClearDrawScreen() ; // マスクを有効にする SetUseMaskScreenFlag( TRUE ) ; // 画面いっぱいに黄色い四角形を描画 DrawBox( 0, 0, 640, 480, GetColor( 255,255,0 ), TRUE ) ; // マスクを無効にする SetUseMaskScreenFlag( FALSE ) ; // 裏画面の内容を表画面に反映 ScreenFlip() ; } // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; } このサンプルでは SetMaskScreenGraph の直後に SetMaskScreenGraphUseChannel を呼んでいますが、 特に呼ぶタイミングに制限はありませんので、DrawBox の直前でも ClearDrawScreen の前でも後でも 何時でも呼んで大丈夫です ちなみに注釈にあります通りアルファチャンネル以外のチャンネルをマスクとして使用する場合は グラフィックスデバイスがシェーダーモデル2.0以降に対応している必要がありますので、 もし6〜7年以上前に発売されたどんなPCでも確実に動作させたいということでしたら使用はできません・・・ ( 尚、ゲーム向けのPCでしたら多分10年以上前のPCでも大丈夫です )
メンテ
Re: SetMaskScreenGraphについての要望 ( No.4 )
名前:wodae 日時:2015/11/09 12:44

迅速なご対応ありがとうございます! 早速試してみましたが、想定していたものよりもずっと使いやすくて良い感じです。 シェーダーモデルは元々2.0以上必須にする予定でしたので問題ありません。ご指摘ありがとうございます。 ただマスクとは関係のない箇所なのですが、上記ライブラリを適用したところ、 透過色付き8ビットPNG画像が画面に一切表示されないようになりました。 24ビットPNGや、透過なし8ビットPNGでは問題なく表示されているのですが、最新版ではこのような挙動になるのでしょうか? (画像ロード時のエラーログ出力は特にされておりませんでした)
メンテ
Re: SetMaskScreenGraphについての要望 ( No.5 )
名前:管理人 日時:2015/11/10 00:49

すみません、最近透過色付き8ビットPNG画像に対応した(つもり)なのですが、 それがうまく動作していないのだと思います よろしければ正常に読み込むことができない透過色付き8ビットPNG画像をメールでこちら BQE00322(あっとまーく)nifty.com ( (あっとまーく)を@に置き換えてください ) に送っていただけないでしょうか? 原因を調べてみたいと思います m(_ _;m
メンテ
Re: SetMaskScreenGraphについての要望 ( No.6 )
名前:wodae 日時:2015/11/10 10:29

先程メールの方送らさせていただきました。ご確認下さい。 メールの方にも書きましたが、おそらく原因はカラーテーブルの色数(?)に関係しているものと思われます。 現象を確認したPNG画像は、グラフィッカーがカラーテーブルを汎用的に利用していた為に色数が膨大でした。 そこで試しに色数を使用色のみに削減した同PNG画像を用意したところ、 そちらはDXライブラリ上で正常に描画されるのを確認できました。 ひとまずこちらとしては回避策が分かったので問題ないのですが、 ご確認いただけますと幸いです。
メンテ
Re: SetMaskScreenGraphについての要望 ( No.7 )
名前:管理人 日時:2015/11/11 01:30

メールありがとうございます、現象を確認できました 透過色付き8ビットPNG画像はRGBのテーブルとアルファのテーブルが別々に保存されているのですが、 頂いたPNG画像は何れもRGBのテーブルは 256個あるのに対して、アルファのテーブルは 1個や 4個と、 RGBのテーブルよりも数が少なかったです なので数が足りない分のアルファ値を 255 とすることで頂いた「正常に読み込めなかったPNG画像」も 正常に読み込むことができるようになりました なのでカラーテーブルの色数は直接的な原因ではない( カラーテーブルの編集の過程でアルファの テーブルに変化が生じて、たまたま正常に読み込めるようになっただけ、などの )可能性がありますので、 お手数で申し訳ありませんが、よろしければこちらの修正バージョンをお使いください m(_ _;m https://dxlib.xsrv.jp/temp/DxLibVCTest.exe // VisualC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCCTest.exe // BorlandC++ 用 https://dxlib.xsrv.jp/temp/DxLibGCC_DevCppTest.exe // Dev-C++ 用 https://dxlib.xsrv.jp/temp/DxLibGCC_MinGWTest.exe // MinGW 用 https://dxlib.xsrv.jp/temp/DxLibDotNet.zip // .NET用 https://dxlib.xsrv.jp/temp/DxLibMakeTest.exe // ソース (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』を、VCをお使いの場合は『リビルド』を、 Dev-C++をお使いの方は「Rebuild All(Ctrl+F11)」をして下さい)
メンテ
Re: SetMaskScreenGraphについての要望 ( No.8 )
名前:wodae(解決) 日時:2015/11/11 06:13

ご対応ありがとうございます。なるほどRGBとアルファは別々のテーブル扱いだったのですね…… 修正バージョンを早速試しましたが、表示されなかった画像も無事全て表示されるようになりました! これにて本件解決とさせていただきます。重ね重ねありがとうございました。
メンテ

Page: 1 |

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

   クッキー保存