使用OMSetRenderTargets时,能否为不同渲染目标设置不同的Draw函数参数?
问题解答:多渲染目标下能否为不同RT设置不同绘制参数?
结论:不可行
DrawInstanced/DrawIndexedInstanced这类绘制命令的参数(比如VertexCountPerInstance、StartIndexLocation)是全局生效的——同一批次绘制中,所有绑定的渲染目标都会使用相同的参数执行绘制,GPU不会针对单个渲染目标拆分或修改这些参数逻辑。
替代解决方案
分两次绘制(推荐)
- 仅绑定第一个渲染目标,调用绘制命令时传入完整的顶点参数,完成全顶点缓冲区的绘制。
- 切换绑定到第二个渲染目标,调整绘制参数为仅覆盖一半顶点缓冲区,执行第二次绘制。
如果需要同时输出到多个RT但仅部分内容有差异,也可以先一次性绘制到所有RT,再单独针对第二个RT执行覆盖绘制,用半顶点数据重写对应区域。
片元着色器控制输出
如果顶点数据可以通过顶点ID、实例ID等标识区分范围(比如前半部分顶点的ID小于某个阈值),可以在片元着色器中通过目标渲染目标的输出语义判断是否输出像素:struct PSOutput { float4 color0 : SV_Target0; float4 color1 : SV_Target1; }; PSOutput PS(PSInput input) { PSOutput output; // 第一个RT正常输出所有像素 output.color0 = float4(1.0, 0.0, 0.0, 1.0); // 第二个RT仅保留前半部分顶点对应的像素 if (input.vertexID >= halfVertexCount) { discard; // 丢弃超出范围的像素 } output.color1 = float4(0.0, 1.0, 0.0, 1.0); return output; }这种方式可以用一次Draw调用完成,但如果需要丢弃大量像素,可能会带来不必要的性能开销,仅适合顶点范围容易区分的场景。
内容的提问来源于stack exchange,提问作者Tom Huntington
相关产品推荐
相关产品推荐

