【发布时间】:2019-04-16 16:15:11
【问题描述】:
我只是想知道 DirectX 11 是否允许我设置要渲染的区域而不是渲染整个窗口。 非常感谢!
【问题讨论】:
标签: c++ render directx-11
我只是想知道 DirectX 11 是否允许我设置要渲染的区域而不是渲染整个窗口。 非常感谢!
【问题讨论】:
标签: c++ render directx-11
终于搞定了,所以要渲染到你的主窗口应用程序的特定矩形区域。您首先需要创建第二个 childhWnd 让 DirectX 渲染到,然后使用 setParent() 将此 childhWnd 附加到您的主 hWnd 以总共只显示一个窗口。
【讨论】:
是的,使用ID3D11DeviceContext::RSSetViewports 和D3D11_VIEWPORT 结构。将TopLeftX、TopLeftY、Width 和Height 成员设置为部分窗口尺寸将导致渲染目标被绘制到后台缓冲区的该部分。
值得注意的是,如果您针对应用程序的主窗口句柄创建交换链,这不会阻止 DXGI 清除整个应用程序窗口。如果您需要混合 Win32 控件和 Direct3D 内容,请专门为 Direct3D 内容创建一个子窗口,针对该窗口创建一个交换链,并将子窗口添加到主应用程序窗口。
【讨论】:
RSSetViewports 在归一化坐标中设置映射到 (-1,-1) 到 (1,1) 的像素位置,因此这是正确的解决方案。 RSSetScissors 设置用于防止在特定矩形之外绘制的“剪裁”或“剪刀”矩形的像素位置。 DX11 的默认剪刀与视口相同,但您可以通过D3D11_RASTERIZER_DESC.ScissorEnable 状态使用特定的矩形。使用 DX12,您必须在所有情况下使用 RSSetScissorRects 显式设置“剪辑”。