2011-08-03 3 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

이 장면의 나머지 부분에서 별도로 스프라이트를 처리하십시오. 당신이 모든 렌더링 할 사용자 정의 함수 것

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); 

} 

My3DRenderingRunction()와 MySpriteRenderingFunction() : 단일 렌더링 당신의 인생을 더 쉽게 만들 것 기능을 만들 수 있습니다. 콜백 함수 (함수 포인터)를 렌더링 함수에 전달할 수도 있습니다. 또한 두 개의 Clear() 호출이 필요없는 방법에 유의하십시오. 다음 중 하나만 사용하면됩니다.

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

분리형이란? 나는 네가 어떻게 게시했는지 정확히하고있다. 더 많은 소스 코드로 주제를 업데이트했습니다. – Neomex

관련 문제