こんばんは、いつもDXライブラリを利用させて頂いております。
さっそく質問ですが、タイトルの通りDrawRotaGraph3Dについてです。
現在、ビットマップなどの【画像】,【平面のポリゴン(DrawPolygon3D系)】,Xファイルなどの【モデル】データを用いて、Zバッファを使った描画の優先度の実験をしています。(ライブラリのバージョンは3.01です)
その為、SetUseZBuffer3DとSetWriteZBuffer3D、およびMV1SetUseZBufferとMV1SetWriteZBufferをTRUEに設定して上記の画像などを表示してみたところ、ビットマップから読み込んだ【画像】だけが表示されませんでした。
原因を調べてみると、SetUseZBuffer3DをTRUEに設定してDrawRotaGraph3Dを実行すると、うまく表示されないことが分かりました。
このDrawRotaGraph3Dでは、Zバッファ関係の処理は使えないのでしょうか?
念のため、実験に使ったソースを載せておきます(サンプルプログラム実行用フォルダで実行できると思います)
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int GraphID; //画像用のハンドル
int ModelID; //モデル用のハンドル
VERTEX3D ver[4]; //平面ポリゴン用の頂点データ
VERTEX3D dver[4]; //描画用の一時頂点データ
unsigned short index[6]; //Index用の配列
VECTOR drawgraphPos; //画像の位置を表すベクトル
VECTOR polygonPos; //平面ポリゴンの位置を表すベクトル
VECTOR modelPos; //モデルの位置を表す
int i; //汎用のイテレータ(for文用)
SetGraphMode(640,480,32);//画面を640×480 32bitにする
SetDrawScreen(DX_SCREEN_BACK);//描画先をバックバッファへ
ChangeWindowMode(TRUE); //ウィンドウモードで起動する
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
GraphID = LoadGraph("test1.bmp"); //画像"test1.bmp"を読み込む
ModelID = MV1LoadModel("AddressTest.mqo");//モデル"AddressTest.mqo"を読み込む
MV1SetScale(ModelID,VGet( 0.2f, 0.2f, 0.2f));//モデルが大きいので、元の20%まで縮小させる
//--------------平面ポリゴンの頂点情報をセットする--------------------------
ver[0].pos = VGet(-50.0f ,50.0f ,0.0f );
ver[1].pos = VGet(50.0f ,50.0f ,0.0f );
ver[2].pos = VGet(-50.0f ,-50.0f ,0.0f );
ver[3].pos = VGet(50.0f ,-50.0f ,0.0f );
index[0] = 0;
index[1] = 1;
index[2] = 2;
index[3] = 1;
index[4] = 3;
index[5] = 2;
for(i = 0;i < 4;i++)
{
ver[i].norm = VGet(0.0f ,0.0f ,-1.0f );
ver[i].dif = GetColorU8(255,255,255,255);
ver[i].spc = GetColorU8( 0, 0, 0, 0);
ver[i].u = 0.0f;
ver[i].v = 0.0f;
ver[i].su = 0.0f;
ver[i].sv = 0.0f;
}
//------------------ここまで-------------------------------------------------
drawgraphPos = VGet(270,240,0);//画像の位置を設定
polygonPos = VGet(320,240,0);//平面ポリゴンの位置を設定
modelPos = VGet(370,240,0);//モデルの位置を設定
MV1SetRotationXYZ(ModelID, //モデルの立体が分かりやすいように、Y軸に少し回転
VGet( 0.0f,(45.0f * PHI_F / 180.0f),0.0f ) );
while(ProcessMessage() != -1)//ループ開始、エラーが出たらループを抜ける
{
//----------------------------キー入力処理--------------------------------------------
//--------Zキーの処理----------------------------
if( CheckHitKey(KEY_INPUT_Z) == 1)
{
if( CheckHitKey(KEY_INPUT_UP) == 1)
{
drawgraphPos.z -= 10.0f;
}else if( CheckHitKey(KEY_INPUT_DOWN) == 1)
{
drawgraphPos.z += 10.0f;
}
}
//--------Xキーの処理-------------------------
if( CheckHitKey(KEY_INPUT_X) == 1)
{
if( CheckHitKey(KEY_INPUT_UP) == 1)
{
polygonPos.z -= 10.0f;
}else if( CheckHitKey(KEY_INPUT_DOWN) == 1)
{
polygonPos.z += 10.0f;
}
}
//---------Cキーの処理-----------------------
if( CheckHitKey(KEY_INPUT_C) == 1)
{
if( CheckHitKey(KEY_INPUT_UP) == 1)
{
modelPos.z -= 10.0f;
}else if( CheckHitKey(KEY_INPUT_DOWN) == 1)
{
modelPos.z += 10.0f;
}
}
//-------------------------------ここまで-----------------------------------------------
//------------------------------描画用前処理--------------------------------------------
for(i = 0;i < 4;i++)//描画用一時頂点データにコピー
{
dver[i] = ver[i];
}
MATRIX moveMAT;//移動用行列
moveMAT = MGetTranslate(polygonPos);//単位行列生成
for(i = 0;i < 4;i++)//行列を用いて頂点を変換
{
dver[i].pos = VTransform(ver[i].pos,moveMAT);
}
MV1SetPosition( ModelID, modelPos);//モデルの位置を設定する
//----------------------------描画処理----------------------------------------------------
ClearDrawScreen();//画面をクリア
SetUseZBuffer3D(TRUE); //DrawPolygonIndexed3Dの描画にZバッファを使用する
SetWriteZBuffer3D(TRUE); //DrawPolygonIndexed3DのZバッファへの書き込みを許可
DrawPolygonIndexed3D(dver,4,index,2
,DX_NONE_GRAPH,FALSE);//平面のポリゴンを表示
MV1SetUseZBuffer(ModelID,TRUE); //モデルの描画にZバッファを使用する
MV1SetWriteZBuffer(ModelID,TRUE);//モデルのZバッファへの書き込みを許可
MV1DrawModel(ModelID); //モデルを表示
//*****************************問題の箇所**********************************************
//*************************************************************************************
// ↓のコメントをはずすと正常に表示される
// SetUseZBuffer3D(FALSE); //画像の表示にZバッファを使用しない(?)
DrawRotaGraph3D(drawgraphPos.x //画像を表示(DrawRotaGraph3Dを使用)
,drawgraphPos.y
,drawgraphPos.z
,1.0f,0.0,GraphID,FALSE,FALSE);
//*************************************************************************************
//*************************************************************************************
//画面を更新
ScreenFlip();
}
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}