こんにちは、いつもお世話になっております。
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 の様に動かした場合、はじめは書き込みがおかしいのですが、一度画像すべてが描画されると書き込みは期待した通りの結果になってくれます。