トップページ > 過去ログ > 記事閲覧
GraphFilterの不具合?
名前:レモン茶 日時: 2012/08/21 15:30

初めて書き込ませていただきます。 GraphFilter関数でのレベル補正を毎フレーム呼び出すようなプログラムで、ウインドウモードの切り替えを行ったところ、GraphFilterの結果が正しく得られない現象が発生しました。 ライブラリのバージョンは3.08c、環境はOSはWindowXPHome、グラフィックボードはgeforce9800gtx+、IDEはVC++2010Expressです。 以下がソースコードです。 #include "DxLib.h" int gGraphHandle = -1; int gScreenHandle= -1; // 画像読み込み・復帰関数 void myRestoreGraph(){ gGraphHandle = LoadGraph(L"Texture.bmp"); gScreenHandle = MakeScreen(800,600,true); } /***************************** Main関数 ******************************/ int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ) { // ウインドウモード切替のフラグ bool WindowModeFlag = true; // 初期化 // ウインドウタイトルの設定 SetWindowText( _T("") ); // 多重起動防止 SetDoubleStartValidFlag( FALSE ); // ウインドウモード ChangeWindowMode( WindowModeFlag ); // クライアント領域サイズの設定 SetGraphMode( 800 , 600 , GetColorBitDepth() ) ; // 非アクティブでも実行 SetAlwaysRunFlag( true ); if( DxLib_Init() == -1 ) return -1; // 画像読み込み myRestoreGraph(); // プログラムメインループ for(;;){ if(ProcessMessage() != 0 || CheckHitKey(KEY_INPUT_ESCAPE)==1){ break; } // Fキーでウインドウモード切替 if(1 == CheckHitKey(KEY_INPUT_F)){ WindowModeFlag = !WindowModeFlag; ChangeWindowMode( WindowModeFlag ); myRestoreGraph(); } SetDrawScreen(gScreenHandle); ClearDrawScreen(); DrawGraph(0,0,gGraphHandle,true); GraphFilter( gScreenHandle, DX_GRAPH_FILTER_LEVEL, 60, 210, 120, 0, 255 ) ; DrawString(0,0,L"test",GetColor(255,255,255)); SetDrawScreen( DX_SCREEN_BACK ); ClearDrawScreen(); DrawGraph(0,0,gScreenHandle,true); ScreenFlip(); } DxLib_End() ; // DXライブラリ使用の終了処理 return 0 ; // ソフトの終了 } ウインドウモードを切り替えた後、GraphFilter( gScreenHandle...)を通るとgScreenHandleが真っ黒になってしまいます。(アルファチャンネルの情報は残っているようです) この現象を発見した実際の作業コードではレベル補正以外のフィルターでも発生を確認しており、ガウスフィルタでは画像が崩れたり、色情報がおかしくなったりしていました。 GraphFilterをこういう使い方をするのがいけないのでしょうか? よろしくお願いします。

Page: 1 |

Re: GraphFilterの不具合? ( No.1 )
名前:管理人 日時:2012/08/22 02:56

ご報告ありがとうございます いえ、何も使い方に問題はありません、DXライブラリのバグです 載せて頂いたプログラムで手元の環境でも症状を確認することができました 原因を調べてみます m(_ _)m
Re: GraphFilterの不具合? ( No.2 )
名前:管理人 日時:2012/08/23 00:38

DX_GRAPH_FILTER_LEVEL が ChangeWindowMode 後に正常に動作しなくなるバグを修正しました よろしければこちらの修正版をお試しください m(_ _)m http://homepage2.nifty.com/natupaji/DxLib/DxLibVCTest.exe // VisualC++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibBCCTest.exe // BorlandC++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibGCC_DevCppTest.exe // Dev-C++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibGCC_MinGWTest.exe // MinGW 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibMakeTest.exe // ソース (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』を、VCをお使いの場合は『リビルド』を、 Dev-C++をお使いの方は「Rebuild All(Ctrl+F11)」をして下さい) ただ、私の環境では DX_GRAPH_FILTER_GAUSS では今回の変更を施す前から問題なく ChangeWindowMode 後も動作していました 今回の問題は DX_GRAPH_FILTER_LEVEL の中で行っていた処理固有の問題だったので、 DX_GRAPH_FILTER_GAUSS でも同様の問題が発生しているということはありませんでした お手数で申し訳ないのですが、よろしければ DX_GRAPH_FILTER_GAUSS を使用すると 画像が崩れるという状況を再現するプログラムをご提供いただけないでしょうか?
Re: GraphFilterの不具合? ( No.3 )
名前:レモン茶 日時:2012/08/23 04:00

ご多忙の中の早急な対応、ありがとうございます。 テスト版でビルドしたところ、DX_GRAPH_FILTER_LEVELが問題なく動作していることを確認しました。 DX_GRAPH_FILTER_GAUSSの症状なのですが、最初に投稿したコードをいじり、同じ症状を起こそうと試してみたのですが、どうにも再現できませんでした。 なので作業しているほうのソースコードなのですが、少々お待ちいただけないでしょうか。 データがごちゃごちゃしており、少し整理したいのです。 ソースコードと必要なデータは、メールに添付する形でよろしければ、用意でき次第、送信致します。 作業コードの方で、復帰処理の後にフラグ変数を立てて、現象が発生する箇所のGraphFilterやGraphBlendの処理をしないように一回飛ばす動作をいれると、問題なく動作しました。 使うタイミングが悪かったのかもしれません。
Re: GraphFilterの不具合? ( No.4 )
名前:管理人 日時:2012/08/23 23:42

DX_GRAPH_FILTER_LEVEL は正常に動作したようで何よりです DX_GRAPH_FILTER_GAUSS の件についてはメールでいただけるということで、お手数お掛けします こちら BQE00322(あっとまーく)nifty.com ( (あっとまーく)を@に置き換えてください ) に送ってください m(_ _)m > 作業コードの方で、復帰処理の後にフラグ変数を立てて、現象が発生する箇所のGraphFilterやGraphBlendの処理をしないように一回飛ばす動作をいれると、問題なく動作しました。 > 使うタイミングが悪かったのかもしれません。 特定の手順で呼ばれた場合のみ発生する問題という可能性が高そうです
Re: GraphFilterの不具合? ( No.5 )
名前:管理人 日時:2012/08/25 23:57

メールありがとうございます 添付のプログラムを拝見いたしました 早速実行してみたのですが、画面モードを変更しても特に画面に変化はありませんでした もし可能でしたら症状が発生した際のスクリーンショットを頂けないでしょうか?
Re: GraphFilterの不具合? ( No.6 )
名前:管理人 日時:2012/09/02 05:12

スクリーンショットを添付していただいたメールを確認しました、ありがとうございます 不具合が発生しない、と思っていたら、私の使用しているディスプレイが 1280x720 の解像度に 対応していなくて画面モードの変更が行われていないだけでした、失礼しました orz ( 今はあまり販売されていない縦横比 16:10 のモニタで、1280x720 の代わりに 1280x800 に対応していました ) 原因は画面モード変更後に GraphFilter で使用するシェーダーの読み込みがフィルターを使用する 順番次第で正常に行われないことがある、というのものでした 修正版をアップしましたので、よろしければお試しください m(_ _)m http://homepage2.nifty.com/natupaji/DxLib/DxLibVCTest.exe // VisualC++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibBCCTest.exe // BorlandC++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibGCC_DevCppTest.exe // Dev-C++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibGCC_MinGWTest.exe // MinGW 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibDotNet.zip // .NET用 http://homepage2.nifty.com/natupaji/DxLib/DxLibMakeTest.exe // ソース (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』を、VCをお使いの場合は『リビルド』を、 Dev-C++をお使いの方は「Rebuild All(Ctrl+F11)」をして下さい)
Re: GraphFilterの不具合? ( No.7 )
名前:レモン茶(解決) 日時:2012/09/07 18:44

返信が遅くなって申し訳ありません。 テスト版でビルドしてテストしたところ、問題は発生しませんでした。 お忙しい中、ご対応ありがとうございました。

Page: 1 |