Я реализую 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;
};