Многопроходный прямой рендеринг в DirectX10

Я реализую Forward Renderer с DirectX 10. Я хочу, чтобы он обрабатывал неограниченное количество источников света, чтобы позже я мог сравнить его производительность с Deferred Renderer. Итак, в основном алгоритм, который я использую, таков: для каждого объекта, для каждого источника света -> установить свет, нарисовать объект. Используя аддитивное смешивание, я визуализирую объект для каждого источника света, суммируя вклад каждого источника света. Все работает с использованием аддитивного смешивания и отключения записи глубины. У меня проблема в том, что, используя этот простой подход, разные объекты смешиваются вместе (поскольку записи глубины отключены), в то время как я просто хочу, чтобы один объект смешивался с различным вкладом света на нем, но все же скрывал другие объекты позади него. . Как я могу это сделать? Является ли предварительный проход Z решением? Любое предложение будет очень признательно. Спасибо.

Это состояния смешивания и глубины/трафарета, которые я использую в своем шейдере HLSL:

DepthStencilState NoDepthWritesDSS
{
    DepthEnable = true;
    DepthWriteMask = Zero;
    StencilEnable = true;
    StencilReadMask = 0xff;
    StencilWriteMask = 0xff;
    FrontFaceStencilFunc = Always;
    FrontFaceStencilPass = Incr;
    FrontFaceStencilFail = Keep;
    BackFaceStencilFunc = Always;
    BackFaceStencilPass = Incr;
    BackFaceStencilFail = Keep;
};

BlendState BlendingAddBS
{
    AlphaToCoverageEnable = false;
    BlendEnable[0] = true;
    SrcBlend = ONE;
    DestBlend = ONE;
    BlendOp = ADD;
    SrcBlendAlpha = ZERO;
    DestBlendAlpha = ZERO;
    BlendOpAlpha = ADD;
    RenderTargetWriteMask[0] = 0x0F;
};

person user1844578    schedule 29.11.2012    source источник


Ответы (1)


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

Этот подход, скорее всего, будет довольно неэффективным при большом количестве источников света/объектов.

Я рекомендую эту статью который объясняет, как рендерить несколько источников света, у него есть разные интересные реализации. Вычислительный тайл не будет работать в directx10, но версия спрайта геометрии может быть легко портирована (у меня есть версия dx9).

Если вам все еще нужен предварительный рендеринг, есть также метод облегченного индексирования, пример реализации здесь

person mrvux    schedule 01.12.2012