DirectX 11 - 使用 CD3D11_VIEWPORT 数组绘制多个视口 RSSetViewports

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

我已经设置了顶点着色器和像素着色器。 然后我创建了一个向量来表示我的视口(本例中总共 4 个):

std::vector<CD3D11_VIEWPORT> view_ports;

我已经填充了向量,并且所有 4 个元素都具有相同的默认值:

view_port.Width = 400;
view_port.Height = 300;
view_port.MinDepth = 0;
view_port.MaxDepth = 1;

唯一不同的值是 TopLeftXTopLeftY,因为我希望每个视口位于不同的位置。

现在,如果我像下面这样调用 RSSetViewportsDrawIndexed ,它只会绘制其中一个视口,为什么呢? RSSetViewports 根据其描述应该接受多个视口。

pContext->RSSetViewports( view_ports.size(), view_ports.data() )
pContext->DrawIndexed( static_cast< UINT > ( std::size( indices ) ), 0u, 0u )

如果我这样做,它确实可以工作并绘制所有 4 个视口:

pContext->RSSetViewports( 1u, &view_ports[0] );
pContext->DrawIndexed( static_cast<UINT> ( std::size( indices ) ), 0u, 0u );
pContext->RSSetViewports( 1u, &view_ports[1] );
pContext->DrawIndexed( static_cast<UINT> ( std::size( indices ) ), 0u, 0u );
pContext->RSSetViewports( 1u, &view_ports[2] );
pContext->DrawIndexed( static_cast<UINT> ( std::size( indices ) ), 0u, 0u );
pContext->RSSetViewports( 1u, &view_ports[3] );
pContext->DrawIndexed( static_cast<UINT> ( std::size( indices ) ), 0u, 0u );

如果你看看 RSSetViewports

的参数
void RSSetViewports(
  [in]           UINT                 NumViewports,
  [in, optional] const D3D11_VIEWPORT *pViewports
);

它确实需要一个视口数组,我不能像这样用我的向量调用它一次吗?:

pContext->RSSetViewports( view_ports.size(), view_ports.data() )

为什么会出现这种情况?

windows winapi directx directx-11
1个回答
0
投票

根据Simon Mourier的建议:

您需要在几何着色器中使用

SV_ViewportArrayIndex
语义。

根据文档:ID3D11DeviceContext::RSSetViewports

使用哪个视口由 SV_ViewportArrayIndex 决定 几何着色器的语义输出;如果几何着色器没有 指定语义,Direct3D 将使用第一个视口 数组。

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