ID3D10Device::RSSetState будет вызываться каждый кадр?

Я пытаюсь создать 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 ответ

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

Другие вопросы по тегам