Отображение 3D и 2D в DirectX

Я хочу визуализировать некоторые спрайты поверх моей 3D-сцены, но когда я включаю спрайты D3D, моя 3D-сцена исчезает, и я вижу только эти спрайты.

Настройки:

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

person Neomex    schedule 03.08.2011    source источник


Ответы (1)


Попробуйте обрабатывать свои спрайты отдельно от остальной части сцены. Вы можете создать одну функцию рендеринга, которая сильно облегчит вам жизнь:

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);
person Zayats    schedule 04.08.2011
comment
Что значит отдельно? Я делаю именно так, как вы написали. Обновлена ​​тема с большим количеством исходного кода. - person Neomex; 04.08.2011