我已经设置了顶点着色器和像素着色器。 然后我创建了一个向量来表示我的视口(本例中总共 4 个):
std::vector<CD3D11_VIEWPORT> view_ports;
我已经填充了向量,并且所有 4 个元素都具有相同的默认值:
view_port.Width = 400;
view_port.Height = 300;
view_port.MinDepth = 0;
view_port.MaxDepth = 1;
唯一不同的值是 TopLeftX 和 TopLeftY,因为我希望每个视口位于不同的位置。
现在,如果我像下面这样调用 RSSetViewports 和 DrawIndexed ,它只会绘制其中一个视口,为什么呢? 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() )
为什么会出现这种情况?
根据Simon Mourier的建议:
您需要在几何着色器中使用
SV_ViewportArrayIndex
语义。
根据文档:ID3D11DeviceContext::RSSetViewports
使用哪个视口由 SV_ViewportArrayIndex 决定 几何着色器的语义输出;如果几何着色器没有 指定语义,Direct3D 将使用第一个视口 数组。