RSSetViewports设置视窗磊小
2024-11-19
1
0
Direct3D中 的一个重点同时也是难点在于创建和设置视口。
视口定义了我们渲染到屏幕上的面积。在单人或者非分割画面的多人游戏中一般都为全屏,所以我们设置视口的宽度和高度即为交换链的宽度和高度。对于分屏游戏,我们可以创建两个视口,一个视口定义在屏幕上方,另一个定义在屏幕下方。为了渲染分屏视口,我们可以分别以两位不同玩家的角度来渲染。
视点的创建由填充D3D11_VIEWPORT函数和设置调用上下文的RSSetViewports函数将其设置到渲染上下文中来完成。RSSetViewports函数需要我们设置的视口数量和视口对象的列举。全屏视口的创建和设置的相关代码在代码段五中有列举,其中X和Y标明左侧和顶部屏幕的位置,最小和最大深度是0到1之间的值,表明了视口深度的最小和最大值。
D3D11_VIEWPORT vp;
memset(&vp, 0, sizeof(vp));
vp.MaxDepth = 1.0f;
vp.TopLeftX = (float)x;//视窗距窗口的X距离
vp.TopLeftY = (float)y; // 视窗距窗口的Y距离
vp.Width = (float)width;//视窗宽
vp.Height = (float)height;//视窗高
device->context->RSSetViewports(1, &vp);
Width和Height是光栅化后图像投影后在窗口的大小(不一致自动缩放)
TopLeftX和TopLeftY投射到窗口后中心点在窗口中的位置
RSSetViewports定义如下:
void RSSetViewports(
[in] UINT NumViewports,
[in, optional] const D3D11_VIEWPORT *pViewports
);