トップページ > 過去ログ > 記事閲覧
GraphFilterのバグ?
名前:kao 日時: 2011/11/22 23:10

GraphFilter系、GraphBlend系の関数についてですが、 自作プログラム内で、 int scid0 = 0; int scid1 = 0; int scid2 = 0; scid0 = MakeScreen( 640,480,TRUE) ; scid1 = MakeScreen( 640,480,TRUE) ; scid2 = MakeScreen( 640,480,TRUE) ; //以下メインループ SetDrawScreen( scid0 ) ; (ポリゴンなどのシーンを描画) GraphFilterBlt(scid0,scid1,DX_GRAPH_FILTER_MONO, -60, 7 ) ;//scid1へセピア出力 GraphFilter( scid1, DX_GRAPH_FILTER_HSB, 0, 100, 90, -60 ) ;//光度調整 GraphFilter( scid1, DX_GRAPH_FILTER_GAUSS, 16, 1400 ) ;//ガウスぼかし GraphBlendBlt( scid0, scid1, scid2, 140, DX_GRAPH_BLEND_ADD ) ;//元画像と処理画像をscid2にブレンド出力 SetDrawScreen( DX_SCREEN_BACK ) ; DrawGraph( 0, 0, scid2, TRUE) ; ScreenFlip() ; という感じでブルームエフェクトをかけているんですが、一部のグラフィックボードで正常に機能していないようなのです・・・。 参考までにテストした環境を書いておきます。 ▽正常に機能したグラボ ATI RADEON X600 SE CORE i5 650 内蔵GPU ▽正常に機能しなっかたグラボ NVIDIA GeForce 8400 GS NVIDIA GeForce GTS 250

Page: 1 |

Re: GraphFilterのバグ? ( No.1 )
名前:いっち 日時:2011/11/22 23:51

どのように異常なのでしょうか? スクリーンショットなどがあればご提供下さい。 あわせて事象発生時の Log.txt があると事象究明の助けになると思います。
Re: GraphFilterのバグ? ( No.2 )
名前:kao 日時:2011/11/23 00:50

プログラム自体は問題なく動くのですが、フィルターエフェクトだけが適用されません。 ただ、元画像(上記でいうところのscid0の画像)だけは普通に表示されます。 以下、正常に機能しなかった環境(NVIDIA GeForce 8400 GS )でのログです。 0:システムの情報を出力します 0: DXライブラリ Ver3.06c 0: 論理プロセッサの数 : 2 0: OS WindowsXP ( Build 2600 Service Pack 3 ) 100: CPU動作速度:大体1.67GHz 100: MMX命令を使用します 101: SSE命令が使用可能です 102: SSE2命令が使用可能です 102: CPUベンダ:GenuineIntel 105: CPU名:Intel(R) Core(TM)2 Duo CPU E6550 @ 2.33GHz 106:COMの初期化... 成功しました 124:メモリ総量:2046.11MB 空きメモリ領域:1476.22MB 125:タイマーの精度を検査します 125:精度結果 更新回数 マルチメディアタイマー:0 パフォーマンスカウンター:60 125: パフォーマンスカウンターを使用します タイマー精度 : 2333380.000000 KHz 127: ソフトの二重起動検査... 二重起動はされていませんでした 128:ウインドウクラスを登録します... 登録に成功しました 130:ウインドウモード起動用のウインドウを作成します 133:ウインドウの作成に成功しました 236:IMEを無効にしました 237:ウインドウスタイルをウインドウモード用に変更します... 完了 238:DirectInput関係初期化処理 238: DirectInput7 の取得中... 成功 525: 引き続き初期化処理... 初期化成功 529: ジョイパッドの初期化... 531: ジョイパッドの初期化は正常に終了しました 532: マウスデバイスの初期化... 初期化成功 533: キーボードデバイスの初期化... 初期化成功 535:DirectInput 関連の初期化は正常に終了しました 557:DirectSound の初期化を行います 558:DirectSound インターフェースの取得を行います.... 成功 577:引き続きインターフェースの初期化処理... 成功 656: DirectSound デバイスを列挙します 657: モジュール名: ドライバ記述:プライマリ サウンド ドライバ 658: モジュール名: RtkHDAud.sys ドライバ記述:Realtek HD Audio output 658: 最大サンプリングレート:192.00KHz 最小サンプリングレート:8.00KHz 659: 総サウンドメモリ領域:0.00KB 空きサウンドメモリ領域:0.00KB 660: 利用可能サンプリング精度 660: プライマリ 16bit = OK 8bit = OK 661: セカンダリ 16bit = OK 8bit = OK 661: 利用可能チャンネル 662: プライマリ MONO = OK STEREO = OK 663: セカンダリ MONO = OK STEREO = OK 663:DirectSound の初期化は正常に終了しました 694:DirectDraw オブジェクトの取得を行います.... 成功 706:引き続き初期化処理... 初期化に成功しました 708:IDirect3D9Ex オブジェクトを取得します.... IDirect3D9 オブジェクトを取得します.... 成功 714:IDirect3DDevice9 オブジェクトを取得します.... ハードウエア頂点演算を使用します 1068:成功 1071:Driver:nv4_disp.dll Description:NVIDIA GeForce 8400 GS 1072:画面のフォーマットは D3DFMT_X8R8G8B8 です 1072:Zバッファのフォーマットは D3DFMT_D16 です 1073:16bit カラーフォーマットは D_D3DFMT_R5G6B5 です 1074:32bit カラーフォーマットは D_D3DFMT_X8R8G8B8 です 1074:アルファ付き 16bit カラーフォーマットは D_D3DFMT_A4R4G4B4 です 1075:アルファ付き 32bit カラーフォーマットは D_D3DFMT_A8R8G8B8 です 1075:アルファテスト用 16bit カラーフォーマットは D_D3DFMT_A1R5G5B5 です 1076:アルファテスト用 32bit カラーフォーマットは D_D3DFMT_A8R8G8B8 です 1077:DXT1テクスチャフォーマットは D_D3DFMT_DXT1 です 1077:DXT2テクスチャフォーマットは D_D3DFMT_DXT2 です 1078:DXT3テクスチャフォーマットは D_D3DFMT_DXT3 です 1078:DXT4テクスチャフォーマットは D_D3DFMT_DXT4 です 1079:DXT5テクスチャフォーマットは D_D3DFMT_DXT5 です 1080:描画用 16bit カラーフォーマットは D_D3DFMT_R5G5B5 です 1080:描画用 32bit カラーフォーマットは D_D3DFMT_X8R8G8B8 です 1081:描画用アルファ付き 32bit カラーフォーマットは D_D3DFMT_A8R8G8B8 です 1081:描画用ABGR浮動小数点16ビット型カラーフォーマットは D_D3DFMT_A16B16G16R16F です 1082:描画用ABGR浮動小数点32ビット型カラーフォーマットは D_D3DFMT_A32B32G32R32F です 1083:最大テクスチャサイズ 幅:8192 高さ:8192 1083:テクスチャステージテンポラリレジスタ:使用可 1083:減算合成のハードウェア対応:ネイティブ 1083:頂点シェーダーバージョンコード:300 1084:ピクセルシェーダーバージョンコード:300 1265:バックバッファロック転送の時間:58323nsec 一時的な描画可能バッファを使用した転送の時間:1033nsec 1266:バックバッファロックを使用しません 1266:Zバッファを作成します.... 成功 1339:プログラマブルシェーダーを使用します 1430:フォントの初期化を行います 1433:フォントの初期化は正常に終了しました 1434:文字コードバッファの初期化を行います... 完了しました 4038:ウインドウを閉じようとしています 4042:ウインドウが破棄されようとしています 4045:ソフトを終了する準備が整いました 4088:フォントの初期化を行います 4089:フォントの初期化は正常に終了しました 4094:フォントの初期化を行います 4094:フォントの初期化は正常に終了しました 4095:Direct3DDevice9 の解放 3 4112:Direct3D9 DLL の解放 4 4114:DirectInput 関連の終了処理... 完了 4168:DirectSound の終了処理は正常に終了しました 4168: 4169:Alloc memory dump
Re: GraphFilterのバグ? ( No.3 )
名前:管理人 日時:2011/11/27 21:24

すいません、一つご質問させてください > GraphFilterBlt(scid0,scid1,DX_GRAPH_FILTER_MONO, -60, 7 ) ;//scid1へセピア出力 こちらを実行した直後の scid1 には正常にフィルターの結果が出力されていますでしょうか? ともあれ思い当たる節が一つあるので、それに対する対処をしたバージョンを作成しました よろしければ正常にフィルターが掛かるかどうかお試しになってみてください 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/DxLibGCCTest.exe // Dev-C++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibMinGWTest.exe // MinGW 用 (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』を、VCをお使いの場合は『リビルド』を、 Dev-C++をお使いの方は「Rebuild All(Ctrl+F11)」をして下さい)
Re: GraphFilterのバグ? ( No.4 )
名前:kao 日時:2011/12/02 20:56

対応バージョンで試したところ、今までフィルターが掛からなかった環境でも正常に動作しました。 管理人様、対応ありがとうございました。
Re: GraphFilterのバグ? ( No.5 )
名前:kao(解決) 日時:2011/12/02 21:01

あ、ちなみに前のバージョンではモノトーンフィルタは正常に機能していませんでした。
Re: GraphFilterのバグ? ( No.6 )
名前:管理人 日時:2011/12/04 03:59

正常に動作した様でなによりです > あ、ちなみに前のバージョンではモノトーンフィルタは正常に機能していませんでした。 すいません、ご質問の内容が不十分でした GraphFilterBlt(scid0,scid1,DX_GRAPH_FILTER_MONO, -60, 7 ) ;//scid1へセピア出力 こちらを実行直後の scid1 を DrawGraph した場合も、scid0 がセピア化された画像は 描画されなかったでしょうか? というのも、今回の問題の対処として追加した処理が GraphFilter の入力画像と 出力画像が同じである場合は一度テンポラリ画像に出力した後、出力画像に転送するようにした ( いままでは入力画像と出力画像が同じ場合も、テンポラリを介さずに直接出力画像に出力していた ) というものなので、 GraphFilterBlt(scid0,scid1,DX_GRAPH_FILTER_MONO, -60, 7 ) ;//scid1へセピア出力 こちらのように入力画像と出力画像が違う場合は今回の変更の影響を受けないはずなんです なので、今回のライブラリの変更で正常に出力されるようになったということは、 こちらの行の処理は変更を加える前から正常に動作していたはず と考えられるのですが・・・
Re: GraphFilterのバグ? ( No.7 )
名前:kao 日時:2011/12/06 20:43

>>こちらを実行直後の scid1 を DrawGraph した場合も、scid0 がセピア化された画像は 描画されなかったでしょうか? ごめんなさい。そういう意味だったんですね。 一応、ライブラリを元のバージョンに戻して実行してみたところ、モノトーンは掛かっていました。 と、いうことはフィルタ自体ではなくGraphBlendBltなどに問題があった・・・ということなんでしょうか? ちなみにGraphBlendBltではなく SetDrawBlendModeで加算ブレンドしてみましたが、 やはり一部環境ではフィルタは掛かりませんでした。 (新バージョンではSetDrawBlendModeでも大丈夫でした)
Re: GraphFilterのバグ? ( No.8 )
名前:管理人 日時:2011/12/11 18:21

ご返答ありがとうございます 推測通りで安心しました 今回の不具合はフィルターを掛ける画像と、掛けた結果を代入する画像が同じであった場合に発生します Direct3D は描画先の画像と描画する画像を同じにすることを禁止しているので、本来ならフィルターを掛けた 結果を元の画像に反映させる場合は   フィルターを掛けたい画像 × フィルター処理 → 結果をテンポラリ画像へ出力   テンポラリ画像 → フィルターを掛けたい画像に転送 というように、テンポラリ画像を介する必要があるのですが、テンポラリ画像に出力して、 それをまたフィルターを掛けたい画像に転送するというのが無駄なので   フィルターを掛けたい画像 × フィルター処理 → フィルターを掛けたい画像に出力 としてみました この場合の動作は Microsoft は保証していないので動作結果は不定なのですが、私の手元の環境では 無事意図した結果が得られたので「保証されてないけど普通に動作するかも?」と思ってそのまま リリースしたのですが、今回の kaoさんが遭遇されたケースのように、やはり意図した結果が得られないことがあるようです というわけで、テンポラリ画像を介する手順に変更することで解決しました ご迷惑お掛けしました m(_ _;m > ちなみにGraphBlendBltではなく > SetDrawBlendModeで加算ブレンドしてみましたが、 > やはり一部環境ではフィルタは掛かりませんでした。 > (新バージョンではSetDrawBlendModeでも大丈夫でした) 修正前では SetDrawBlendMode( DX_BLENDMODE_ADD, 255 ) の設定をした状態で画像を描画しても 加算ブレンド描画にならなかったということでしょうか? 修正後のバージョンでは正常に動作したということで問題ないと思いますが・・・ SetDrawBlendMode に関わる部分は何も手をつけていないので何故直ったのかは謎です・・・

Page: 1 |