トップページ > 過去ログ > 記事閲覧
2D の Z バッファを扱う非公開関数について
名前:トイトイ 日時: 2012/08/07 10:44

こんにちは、いつもお世話になっております。 SetUseZBufferFlag(), SetWriteZBufferFlag(), SetDrawZ() に関する報告なのですが、 これらを利用して描画を行ったとき Z バッファを無視した書き込みが発生していることが見受けられました。 以下にソースと私が発見した症状を記述しますので、ご確認をお願いいたします。 ・ソース #include <DxLib.h> using namespace DxLib; int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR pCmdLine, int showCmd){ // ウィンドウモードで起動 ChangeWindowMode( TRUE ); // DxLib の Log 出力をやめさせる SetOutApplicationLogValidFlag( FALSE ); // DxLib の初期化 DxLib_Init(); // 描画先は裏画面 SetDrawScreen( DX_SCREEN_BACK ); // Z バッファを使用する SetUseZBufferFlag( TRUE ); SetWriteZBufferFlag( TRUE ); int tex= LoadGraph("hoge.png"); int subY= 0; int frame= 0; // 終了メッセージがくるか、ESC が押されるまでループ while( ProcessMessage()!= -1 && CheckHitKey( KEY_INPUT_ESCAPE )== 0 ){ frame++; // sample1 : ある程度の範囲で上下 /* if( frame%30 >= 15 ){ subY--; }else{ subY++; } */ // sample2 : sample1 よりも広い範囲で上下 /* if( frame%40 >= 20 ){ subY--; }else{ subY++; } */ // 裏画面をクリア ClearDrawScreen(); // 全面を青で塗る ( 先に塗る場合 ) SetDrawZ( 0.1f ); DrawBox( 0, 0, 640, 480, GetColor( 0, 0, 128 ), TRUE ); // 画像を描画 SetDrawZ( 0.9f ); //DrawGraph( 0, -16 +subY, tex, FALSE ); DrawGraph() だと大丈夫 DrawExtendGraph( 0, -16 +subY, 32, 16 +subY, tex, FALSE ); // DrawExtendGraph() だと書き込みが変 //DrawExtendGraph( 0, 16 +subY, 32, -16 +subY, tex, FALSE ); // パラメータを変えると、書き込みが変になる部分が変わる // 全面を青で塗る ( 後から塗る場合 ) /* SetDrawZ( 0.1f ); DrawBox( 0, 0, 640, 480, GetColor( 0, 0, 128 ), TRUE ); */ // 裏画面を反映 ScreenFlip(); } // DxLib を終える DxLib_End(); } ・症状 通常なら Z バッファのおかげで画像を描画しても画面に反映されることはありませんが、ここでは画像の一部が描画されてしまっています。 青い四角を描画するタイミングを画像描画の後に変えても結果は同じでした。 また、画像の描画に DrawExtendGraph() を用いていますが DrawModiGraph() でも同様の結果が得られ、 DrawExtendGraph() のパラメータを変えると書き込みがおかしい部分が変わりました。 ところが、DrawGraph(), DrawBox() を使用した場合 Z バッファを無視した描画は行われていませんでした。 次に、描画する画像を動かしてみました。 sample1 の様に動かした場合、Z バッファの書き込みがおかしいまま変わらないです。 sample2 の様に動かした場合、はじめは書き込みがおかしいのですが、一度画像すべてが描画されると書き込みは期待した通りの結果になってくれます。

Page: 1 |

Re: 2D の Z バッファを扱う非公開関数について ( No.1 )
名前:埴輪 日時:2012/08/07 22:20

単なるDrawBox()ではなく DrawBoxToZBuffer()を使うべきだと思います。
Re: 2D の Z バッファを扱う非公開関数について ( No.2 )
名前:トイトイ 日時:2012/08/08 09:38

DrawBoxToZBuffer() は「Z バッファへの書き込み」を行うだけで四角形自体は描画しませし、マスクをかけるかかけないかの 2 択しかありません。 SetDrawZ() を行った後の DrawBox() 等の 2D 描画関数は「Z バッファを考慮したうえで、書き込み可能なら書き込む」というものなはずです。( もし、勘違いで仕様が違うならすみません ) また、sample1, sample2 のように画像の描画位置によって描画のされ方に違いがあることから 初期化系のバグである可能性を含んでいるので報告させていただきました。 追記: DrawExtendGraph() の x1, x2 パラメータを -10 ずつすると、sample2 のように動かしても Z バッファへの書き込みが正しく行われないことから 描画する画像のある端点がウィンドウ外 ( または、描画指定範囲外 ) に指定された場合におこるものと思われます。 DrawExtendGraph( 10, 10, 30, 30, ... ) とした場合は、きちんと Z バッファは考慮されています。
Re: 2D の Z バッファを扱う非公開関数について ( No.3 )
名前:トイトイ 日時:2012/08/08 09:50

さらに追記: 申し訳ありません。Z バッファへの書き込みの何がおかしいかを詳しく書いていませんでした。 ・予想している動作 深度 0.9f で描画を行おうとしている画像に対して 深度 0.1f で描画を行った青い四角形の方が画像より手前に位置しています。 なので、画像は一切表示されずに青い画面だけが表示されるはず ・実際の挙動 深度 0.1f の DrawBox() を先に行おうが後に行おうが深度 0.9f の画像が手前に描画される。 また、その描画された画像の一部が青くなっていることからその青い部分は DrawBox() による書き込みがあったものと思われる さらに、描画される画像が一度ウィンドウ内にすべて描画されるとき ( DrawExtendGraph() の x1, y1, x2, y2 パラメータが 0 <= x1, x2 <= 640 かつ 0 <= y1, y2 <= 480 を満たすとき ) 画像は Z バッファにしたがって表示されなくなり、以降挙動がおかしくなるパラメータを与えても予想している動作が行われる
Re: 2D の Z バッファを扱う非公開関数について ( No.4 )
名前:トイトイ 日時:2012/08/08 10:00

何度も何度も申し訳ないです。 最後の行「画像は Z バッファにしたがって表示されなくなり」の部分が日本語的に誤解を生みそうなので訂正 「先に 0.1f で書き込まれた青い四角の Z バッファを考慮するようになって、画像は画面に描画されなくなり、」 でお願いいたします。 0.1f で描いたはずの青い四角を 0.9f で描こうとしている画像が上書きしなくなる。 という事が伝えたいことです
Re: 2D の Z バッファを扱う非公開関数について ( No.5 )
名前:埴輪 日時:2012/08/08 16:48

すみません。 SetDrawZ()の使い方を勘違いしていました。 DrawExtendGraph()のバグという可能性もありえない事ではないので 管理人さまの見解を待ちましょう。
Re: 2D の Z バッファを扱う非公開関数について ( No.6 )
名前:管理人 日時:2012/08/12 08:14

バグのご報告ありがとうございます 載せて頂いた再現プログラムで私の環境でも症状を確認できました DrawGraph や DrawExtendGraph は画面外の座標が指定されているかどうかで描画処理を分岐しているのですが、 DrawExtendGraph の画面外の座標が指定された場合の描画Z値の設定処理にバグがありました DrawModiGraph は長方形の座標が指定された場合は描画負荷を抑えるために DrawExtendGraph を実行するので、 指定座標次第では DrawModiGraph でも現象が発生する状態でした 修正版をアップしましたので、よろしければお試しになってみてください 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)」をして下さい)
Re: 2D の Z バッファを扱う非公開関数について ( No.7 )
名前:トイトイ(解決済) 日時:2012/08/12 12:24

早急な対応ありがとうございます。 私の環境でも症状の改善が確認できました。 ところで、少し関係ない話ですが修正版のリビルドを行う際に DxCompileConfig.h の include で DxDataType.h が指定されていますが DxDataType.h が見つかりませんでした。 DxDataTypeWin.h と間違っているのではないかと思うので、確認をお願いします。 コンパイラは Visual C++ 2008 ですので、落とした修正ライブラリも VC のものです。
Re: 2D の Z バッファを扱う非公開関数について ( No.8 )
名前:管理人 日時:2012/08/12 17:22

すみません、DxDataType.h を入れていない状態でアップしてしまっていました DxDataType.h を入れた状態でアップしなおしました m(_ _;m
Re: 2D の Z バッファを扱う非公開関数について ( No.9 )
名前:トイトイ(解決済) 日時:2012/08/13 07:11

確認しました。 度々のご修正誠にありがとうございます。

Page: 1 |