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

Graphics 渲染到纹理时如何累积颜色?,graphics,directx,shader,lighting,Graphics,Directx,Shader,Lighting,我正在尝试使用MRT实现延迟着色。为此,我需要在两个渲染目标中累积颜色和法线。为此,我定义了两种R32G32B32A32纹理 像素缓冲区将输出到两个渲染目标。但是,我如何指示它累积值,而不是替换或混合值 我尝试定义以下混合状态: blendState.RenderTarget[0].BlendEnable = TRUE; blendState.RenderTarget[0].RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_

我正在尝试使用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;
但我得到的价值观很奇怪


请帮忙!如何累积值?

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


因此,只需将读取/写入的深度状态和比较函数设置为less/lessequal,而不进行任何混合即可。

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


因此,只需将深度状态设置为读/写,将比较函数设置为less/lessequal,而不设置任何混合,就可以了。

。你的意思是“如何添加颜色”?从某种意义上说,是的。我希望它们在渲染目标上累积,以便我可以在下一个过程中使用它们…你是说“如何添加颜色”?从某种意义上说,是的。我希望它们在渲染目标上累积,以便在下一个过程中使用它们。问题是我还有许多透明对象。这就是我需要累积颜色的原因。将颜色/法线累积为加法不会解决透明度问题。由于灯光计算依赖法线,因此在两个对象之间添加法线不会产生任何类型的已定义行为。颜色也是一样的,因为对象漫反射项将变得无效。有不同的透明技术(每层多个gbuffer,或透明的前向传递),这里有一些帮助链接:,我将查看它们,但我已经阅读了它们。实施OIT可能对我有好处。谢谢问题是我还有很多透明的对象。这就是我需要累积颜色的原因。将颜色/法线累积为加法不会解决透明度问题。由于灯光计算依赖法线,因此在两个对象之间添加法线不会产生任何类型的已定义行为。颜色也是一样的,因为对象漫反射项将变得无效。有不同的透明技术(每层多个gbuffer,或透明的前向传递),这里有一些帮助链接:,我将查看它们,但我已经阅读了它们。实施OIT可能对我有好处。谢谢