2011-08-03 11 views
0

私は3Dシーンにいくつかのスプライトを描画したいのですが、D3Dスプライトを有効にすると3Dシーンが消えてしまい、それらのスプライトしか見ることができません。DirectXの3Dと2Dディスプレイ

セッティング:

LPDIRECT3D9 d3d = NULL; 
LPDIRECT3DDEVICE9 d3ddev = NULL; 
D3DPRESENT_PARAMETERS d3dpp; 
LPD3DXSPRITE d3dspt; 

// Create Direct3D and the Direct3D Device 
void InitDirect3D(GAMEWINDOW* gw) 
{ 
    d3d = Direct3DCreate9(D3D_SDK_VERSION); 

    ZeroMemory(&d3dpp, sizeof(d3dpp)); 
    d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; 
    d3dpp.BackBufferFormat = D3DFMT_X8R8G8B8; 
    d3dpp.Windowed = gw->Windowed; 
    d3dpp.BackBufferWidth = gw->Width; 
    d3dpp.BackBufferHeight = gw->Height; 
    d3dpp.EnableAutoDepthStencil = TRUE; 
    d3dpp.AutoDepthStencilFormat = D3DFMT_D16; 

    d3d->CreateDevice(D3DADAPTER_DEFAULT, 
           D3DDEVTYPE_HAL, 
           gw->hWnd, 
           D3DCREATE_SOFTWARE_VERTEXPROCESSING, 
           &d3dpp, 
           &d3ddev); 

    d3ddev->SetRenderState(D3DRS_LIGHTING, FALSE); 
    d3ddev->SetRenderState(D3DRS_ZENABLE, TRUE); 
    d3ddev->SetRenderState(D3DRS_CULLMODE, TRUE); 

    D3DXCreateSprite(d3ddev, &d3dspt); 

    return; 
} 

レンダリング:

// Start rendering 
void StartRender() 
{ 

    d3ddev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0); 
    d3ddev->Clear(0, NULL, D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0); 
    d3ddev->BeginScene(); 
    d3dspt->Begin(D3DXSPRITE_ALPHABLEND); // when enabled, 3d scene dissapears 

    return; 
} 

// Stop rendering 
void EndRender() 
{ 
    d3dspt->End(); // disabling sprites 
    d3ddev->EndScene(); 
    d3ddev->Present(NULL, NULL, NULL, NULL); 

    return; 
} 

レンダリング機能:

void Render() 
{ 
    static int frame = 0; 
    if (frame == 36) frame = 0; 

    StartRender(); 

    DrawSprite(&interceptor, frame++, 100, 100, 0); 

    DrawModel(&a, 0.0f, 0.0f, 0.0f); 



    EndRender(); 

    return; 
} 

答えて

0

は、あなたのシーンの残りの部分とは別に、あなたのスプライトを処理して試してみてください。 (My3DRenderingRunction

void Render() 
{ 
    d3ddev->Clear(0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, 
        D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0); 
    d3ddev->BeginScene(); 
    d3dspt->Begin(D3DXSPRITE_ALPHABLEND); 

    My3DRenderingFunction(); 

    MySpriteRenderingFunction(); 

    d3dspt->End(); // disabling sprites 
    d3ddev->EndScene(); 
    d3ddev->Present(NULL, NULL, NULL, NULL); 

} 

)とMySpriteRenderingFunction()あなたはすべてをレンダリングするでしょう、あなたのカスタム関数のようになります。あなたは、あなたの人生ははるかに容易になるだろう、単一のレンダリング機能を作成することができます。レンダリング関数にコールバック関数(関数ポインタ)を渡すことさえ可能です。また、2つのClear()呼び出しが不要であることに注意してください。

d3ddev->Clear(0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, 
        D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0); 
+0

別名としてはどういう意味ですか?私はあなたがどのように投稿したか正確にやっている。より多くのソースコードでトピックを更新しました。 – Neomex

関連する問題