Z-буфер заставляет вещи не рисовать - PullRequest
3 голосов
/ 10 декабря 2011

У меня есть некоторые проблемы с получением объектов для рисования в DirectX9.

Вот моя функция рендеринга:

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 с этим кодом:

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

На самом деле, это рисует экран BackgroundColour, на котором ничего нет.

Выключив Z-буфер [т.е.В порядке их «розыгрыша» вызываются функции.Объекты, нарисованные позже, затемняют объекты, нарисованные ранее.

Я также попытался внести следующие изменения:

g_pd3dDevice -> SetRenderState(D3DRS_ZFUNC, D3DCMP_GREATER);

и

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

Теперь эффект отрисовывается для объектов, которые нарисованыпервые затемняющие объекты, которые рисуются позже, независимо от их пространственного положения.

Эффект, который я хочу получить, заключается в том, чтобы близкие объекты затемняли удаленные объекты.

Может ли кто-нибудь пролить на это свет.

Спасибо.

1 Ответ

0 голосов
/ 10 декабря 2011

Попробуйте удалить эти строки:

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 () завершится ошибкой?

...