渲染到纹理时如何积累颜色?

时间:2012-09-23 13:53:34

标签: graphics directx shader lighting

我正在尝试使用MRT实现延迟着色。为此,我需要在两个渲染目标中累积颜色和法线。我为此定义了两个R32G32B32A32纹理。

像素缓冲区输出到两个渲染目标。但是,如何指示它累积值,而不是替换或混合它们?

我尝试定义以下混合状态:

blendState.RenderTarget[0].BlendEnable =            TRUE;
blendState.RenderTarget[0].RenderTargetWriteMask =  D3D11_COLOR_WRITE_ENABLE_ALL;
blendState.RenderTarget[0].SrcBlend =               D3D11_BLEND_ONE;
blendState.RenderTarget[0].DestBlend =              D3D11_BLEND_ONE;
blendState.RenderTarget[0].BlendOp =                D3D11_BLEND_OP_ADD;
blendState.RenderTarget[0].SrcBlendAlpha =          D3D11_BLEND_ONE;
blendState.RenderTarget[0].DestBlendAlpha =         D3D11_BLEND_ONE;
blendState.RenderTarget[0].BlendOpAlpha =           D3D11_BLEND_OP_ADD;
blendState.RenderTarget[1].BlendEnable =            TRUE;
blendState.RenderTarget[1].RenderTargetWriteMask =  D3D11_COLOR_WRITE_ENABLE_ALL;
blendState.RenderTarget[1].SrcBlend =               D3D11_BLEND_ONE;
blendState.RenderTarget[1].DestBlend =              D3D11_BLEND_ONE;
blendState.RenderTarget[1].BlendOp =                D3D11_BLEND_OP_ADD;
blendState.RenderTarget[1].SrcBlendAlpha =          D3D11_BLEND_ONE;
blendState.RenderTarget[1].DestBlendAlpha =         D3D11_BLEND_ONE;
blendState.RenderTarget[1].BlendOpAlpha =           D3D11_BLEND_OP_ADD;

但我得到的价值观很奇怪。

请帮忙!我如何积累价值?

1 个答案:

答案 0 :(得分:1)

要实现延迟着色,技术上不应累积法线或颜色,因为当您执行延迟处理(光计算/遮挡/景深......)时,每个MRT纹理像素(颜色/深度/法线) ,需要从视点表示最近的对象。

因此,只有将读取/写入和比较功能的深度状态设置为较小/较小,并且根本不应该进行混合。