DrawIndexed 和多个渲染目标

问题描述 投票:0回答:1

OMSetRenderTargets
允许您设置多个渲染目标。我想在第一个渲染目标上绘制整个顶点缓冲区,但在第二个渲染目标上只绘制一半顶点缓冲区。

即我想根据渲染目标改变

VertexCountPerInstance
/
StartIndexLocation
DrawInstanced
/
DrawIndexedInstanced
参数。

这可能吗?

directx direct3d
1个回答
0
投票

严格来说,这是不可能的。通过多个 RT,每个像素调用一次像素着色器,并为所有渲染目标生成值。

但是,根据您的用例,您也许可以使用混合状态来解决问题。请注意,

D3D11_BLEND_DESC
结构对于每个 RT 都有独立的
D3D11_RENDER_TARGET_BLEND_DESC

因此,您可以设置

IndependentBlendEnable = TRUE
,在第二个 RT 上启用 alpha 混合,在像素着色器中将
SV_PrimitiveID
与常量进行比较,如果图元 ID 超过阈值,则为第二个 RT 输出零向量。然后 Alpha 混合将忽略网格第二部分的输出值。在调用
uint
DrawInstanced
方法之前,您需要使用该
DrawIndexedInstanced
值更新像素着色器的动态常量缓冲区。

但请注意,所有 RT 共享相同的深度/模板视图。如果您在该通道上写入深度,则通过 Alpha 混合丢弃的像素仍会影响深度缓冲区。这可能会在您的第二个 RT 上导致奇怪的伪影,这取决于变换矩阵以及您正在渲染的网格中三角形的顺序。

© www.soinside.com 2019 - 2024. All rights reserved.