2011-12-09 11 views
3

DirectX9で描画するのに問題があります。それがあるように、これはその上に何もBackgroundColour画面を描画するZバッファが描画しないようにしています

// Create the D3D object, return failure if this can't be done. 
if (NULL == (g_pD3D = Direct3DCreate9(D3D_SDK_VERSION))) return E_FAIL; 

// Set up the structure used to create the D3DDevice 
D3DPRESENT_PARAMETERS d3dpp; 
ZeroMemory(&d3dpp, sizeof(d3dpp)); 
d3dpp.Windowed = TRUE; 
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; 
d3dpp.BackBufferFormat = D3DFMT_UNKNOWN; 
d3dpp.EnableAutoDepthStencil = TRUE; 
d3dpp.AutoDepthStencilFormat = D3DFMT_D16; 

// Create the D3DDevice 
if (FAILED(g_pD3D -> CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, 
            D3DCREATE_SOFTWARE_VERTEXPROCESSING, 
            &d3dpp, &g_pd3dDevice))) 
{ 
    return E_FAIL; 
} 

// Turn on the Z buffer 
g_pd3dDevice -> SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE); 

g_pd3dDevice -> SetRenderState(D3DRS_ZFUNC, D3DCMP_LESS); 
g_pd3dDevice -> SetRenderState(D3DRS_ZWRITEENABLE, TRUE); 

// Start with lighting off - we can add lights later. 
g_pd3dDevice -> SetRenderState(D3DRS_LIGHTING, FALSE); 

// Set transparencies 
g_pd3dDevice -> SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE); 
g_pd3dDevice -> SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); 
g_pd3dDevice -> SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA); 
g_pd3dDevice -> SetRenderState(D3DRS_BLENDOP, D3DBLENDOP_ADD); 




// Set culling 
g_pd3dDevice -> SetRenderState(D3DRS_CULLMODE,D3DCULL_CCW); 

return S_OK; 

void Render(GameWorld& world) 
{ 
    DWORD BackgroundColour = 0x00102010;  

    g_pd3dDevice -> Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, BackgroundColour, 1.0f, 0); 

    // Begin rendering the scene. 
    if (SUCCEEDED(g_pd3dDevice -> BeginScene())) 
    { 
     world.draw(); 

     g_pd3dDevice -> EndScene(); 
    } 

    // Present the backbuffer to the display. 
    g_pd3dDevice -> Present(NULL, NULL, NULL, NULL); 
} 

私はこのコードではDirectXを設定している:

は、ここに私のレンダリング機能です。

Zバッファをオフにすることによってg_pd3dDevice - > SetRenderState(D3DRS_ZENABLE、D3DZB_FALSE);]すべては、 "draw"関数が呼び出された順に描画されます。後で描画されるオブジェクトは、先に描画されたオブジェクトをあいまいにします

私もこれらの変更を行う試してみました:

g_pd3dDevice -> SetRenderState(D3DRS_ZFUNC, D3DCMP_GREATER); 

g_pd3dDevice -> Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, BackgroundColour, 0.0f, 0); 

効果が今あるのにかかわらず、その空間的位置の、後に描かれている最初の曖昧なオブジェクトを描画されたオブジェクト。

私が望む効果は、近くのオブジェクトが遠くのオブジェクトを隠すことです。

誰もがこれについていくつかの光を当てることができます。

ありがとうございます。

+0

これを解決する最も簡単な方法は、PIXを使用することです.PIXを入手する際には既にインストール済みです。 PIXデバッグでは、これはケーキウォークです(メモリから):P​​IXでプログラムを起動し、F12を押して、アプリケーションを閉じてフレームを分析します。最初の描画呼び出しを選択し、メッシュタブをクリックします。その時点で、デバイスを調査することができます。ドローコールの前と後に、添付のZターゲットを見てください。 Zバッファと一緒にデバイスを調べると、これが本当に速く絞り込まれ、何がダウンしているのかがわかります。 – Ylisar

+0

PIXでプログラムを実行すると、何も描画されず、テクスチャの読み込みに失敗します。 – Arkady

+0

実行ファイルを直接起動するとどうなりますか? VS内からではありません。 – Ylisar

答えて

0

は、これらの行を削除してください:

g_pd3dDevice -> SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE); 

g_pd3dDevice -> SetRenderState(D3DRS_ZFUNC, D3DCMP_LESS); 
g_pd3dDevice -> SetRenderState(D3DRS_ZWRITEENABLE, TRUE); 

zバッファはデフォルトで有効になっているので、それが動作するはずです。
オブジェクトが正しいWorldViewProjection行列で変換されていることを確認してください。
オブジェクトがレンダリングされない場合は、World.draw()が呼び出されているかどうかを確認します。 BeginScene()が失敗する可能性がありますか?

+0

私は決してこれの底を知ることはできませんでしたが、回避策を発見しました。以前は右利きの投影を使用するようにDirectXを設定しました。 (xは左から右へ、yは前後からzへ、zは上下に)、z値の高いものほどカメラに近づいていました。 (私は、zバッファはこれとは独立していると信じていますが...)とにかく、左利きの投影に切り替えて、すべてのz値を反転することで、現在動作します。 – Arkady

関連する問題