Direct3D11 (C ++): рендеринг (базовый) вопрос - PullRequest
4 голосов
/ 06 сентября 2011

Я следил за книгой об основах программирования игр с D3D11.Теперь я понимаю абсолютные основы Direct3D:)

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

В книге мне всегда приходилось определять (struct VertexPos с элементами texcoord и position) ИЛИ (struct VertexPos только сЧлен позиции XMFLOAT3).В своей игре я хочу рисовать как сплошные поверхности без текстур, так и поверхности с текстурами.Я не уверен, как это сделать, не говоря уже о том, чтобы сделать это эффективно.

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

void GameSpriteDemo::Render()
{
    if (m_pD3DContext == 0)
    {return;}

    float ClearColor[4] = {0.0f, 0.0f, 0.25f, 1.0f};
    m_pD3DContext->ClearRenderTargetView(m_pBackBufferTarget,ClearColor);

    UINT stride = sizeof(VertexPos);
    UINT offset = 0;

    m_pD3DContext->IASetInputLayout(m_pInputLayout);
    m_pD3DContext->IASetVertexBuffers(0,1,&m_pVertexBuffer, &stride, &offset);
    m_pD3DContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);

    m_pD3DContext->VSSetShader(m_pSolidColorVS,0,0);
    m_pD3DContext->PSSetShader(m_pSolidColorPS,0,0);
    m_pD3DContext->PSSetShaderResources(0,1,&m_pColorMap);
    m_pD3DContext->PSSetSamplers(0,1,&m_pColorMapSampler);

    for(int i=0; i < 2; ++i)
    {
        XMMATRIX world = m_Sprites[i].GetWorldMatrix();
        XMMATRIX mvp = XMMatrixMultiply( world, m_VpMatrix );
        mvp = XMMatrixTranspose(mvp);

        m_pD3DContext->UpdateSubresource(m_pMvpCB,0,0,&mvp,0,0);
        m_pD3DContext->VSSetConstantBuffers(0,1,&m_pMvpCB);

        m_pD3DContext->Draw(6,0);
    }

    m_pSwapChain->Present(0,0);
}

Итак, как мне эффективно справиться с этим с несколькими буферами вершин,схемы ввода, шейдеры, блендеры и т. д.

Должен ли я просто создать несколько версий этих версий, а затем установить сброс входной сборки, шейдеров и т. д. после вызова Draw?Или это не работает / это не эффективно?

Спасибо:)

1 Ответ

4 голосов
/ 07 сентября 2011

Простой ответ - да, вы должны создать несколько буферов вершин, входные макеты, шейдеры и т. Д. И устанавливать соответствующие перед каждым соответствующим вызовом отрисовки.Это будет работать и достаточно эффективно (должно быть достаточно эффективно для 2D-игр на современном оборудовании).

В полноценном движке 3D-игр все становится немного сложнее.Обычно в движке рендеринга есть несколько дополнительных внутренних уровней абстракции, наслоенных поверх примитивных объектов, таких как буферы вершин и индексов, входные макеты, шейдеры и т. Д.

Довольно простой способ структурирования состоит в том, чтобы иметь класс Meshон знает обо всех буферах вершин, индексных буферах, входных макетах, шейдерах, текстурах и т. д., которые составляют часть трехмерной модели, которая может быть нарисована за один вызов отрисовки, и отвечает за их установку (часто вместе сдругие биты состояния рендеринга, такие как режимы наложения, режимы отбраковки и т. д.) и выдача соответствующего вызова отрисовки.

С изменением любого состояния устройства связаны затраты, и поэтому механизмы рендеринга часто разрабатываются для того, чтобы попытаться отсортировать всеобъекты, которые нужно рисовать в определенном кадре, чтобы минимизировать количество требуемых изменений состояния.Например, в рендере Dawn of War 2 мы сортировали всю геометрию сетки, чтобы мы могли рисовать, например, все шлемы космического корабля с минимальными изменениями состояния, прежде чем рисовать все тела космического корабля с различными вершинными и индексными буферами, текстурами,и т. д.

Современное 3D-оборудование и API имеют несколько меньшие издержки при изменении состояния, чем в прошлом, поэтому сортировка для минимизации изменений состояния менее важна, чем когда-то, но это все еще является обычной практикой для игр, которым необходимополучить максимальную производительность на ПК.

В механизме рендеринга данных, который поддерживает гибкую модель освещения и материалов, а также анимацию кожи, рельеф, системы частиц, полноэкранные эффекты, 2D пользовательский интерфейс и т. д., подходящий дизайн дляуправление всем состоянием, требуемым для рисования игровых объектов, и для его сортировки таким образом, чтобы его можно было нарисовать с максимальной эффективностью, может быть довольно сложным, и существует множество различных подходов к структурированию.Код для всего, что может быть классифицировано как «управление состоянием визуализации», часто составляет значительную часть кода в типичном механизме рендеринга.

...