ID3D10Device :: RSSetState будет вызываться каждый кадр? - PullRequest
2 голосов
/ 09 ноября 2011

Я пытаюсь создать ID3D10RasterizerState с direct3D10, а затем вызвать

ID3D10Device::RSSetState()

с правильной информацией. Однако всякий раз, когда окно масштабируется или когда приложение переходит в полноэкранный режим, растровое состояние, похоже, сбрасывается в состояние по умолчанию. Я попытался установить состояние с помощью сообщений WM_SIZE, но, как ни странно, ничего не происходит ...

Это работает правильно, когда я вызываю RSSetState () каждый кадр, но это кажется крайне неэффективным.

Кто-нибудь знает решение этой проблемы? Кажется, он плохо документирован на MSDN.

Код:

bool TestGameApp::InitGame()
{
    D3D10_RASTERIZER_DESC desc;
    desc.AntialiasedLineEnable = TRUE;
    desc.CullMode = D3D10_CULL_NONE;
    desc.DepthBias = 0;
    desc.DepthBiasClamp = 0.0f;
    desc.FillMode = D3D10_FILL_SOLID;
    desc.FrontCounterClockwise = false;
    desc.MultisampleEnable = true;
    desc.ScissorEnable = FALSE;
    desc.SlopeScaledDepthBias = 0.0f;

    m_pD3DDevice->CreateRasterizerState(&desc,m_pRSState);
    m_pD3DDevice->RSSetState(m_pRSState);

    //...more code
}

WndProc:

switch( message )
{
    case WM_SIZE:
    {
        m_pD3DDevice->RSSetState(m_pRSState);
        break;
    }
}

1 Ответ

2 голосов
/ 11 ноября 2011

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

...