在Windows窗体中呈现时,我很难找到有关DirectX 11应用程序绘制顺序的详细信息。我知道我可以将SwapChain
分配给已经完成的控件(例如面板)的处理程序。这里的问题更着重于能够在同一控件中绘制通过DirectX呈现的内容。我已经知道我可以向面板添加控件,它们将在渲染的内容上绘画。我尝试将Paint
事件用于面板并进行简单绘制:
private void panel1_Paint(object sender, PaintEventArgs e) {
using (Pen p = new Pen(Brushes.Red))
e.Graphics.FillEllipse(p, new Rectangle(0, 0, 250, 250));
}
但是,我相信这是在DirectX渲染的场景内容之下绘制所需的内容。我无法找到有关绘制顺序以及要利用哪些事件的任何详细信息。如果有人对在渲染的场景上使用哪些事件有任何想法,那将很有帮助。如果可以在场景顶部渲染控件,那么我想相信也可以实现自定义绘画。
也许我需要走很长一段路?
更新
我在MSDN上发现了一个帖子,虽然该帖子不能完全回答当前的问题,但可以帮助我理解,并且可以阐明一条替代路线,该路线似乎需要在我的引擎的render方法(在通常遵循FIFO系统的情况下进行渲染很有意义)。
您可以在DX渲染顶部进行GDI(+)调用。 d3d设备可以 返回适合执行gdi调用的Graphics g。至少我已经做到了 在窗口模式下。
Microsoft.DirectX.Direct3D.Surface bb = device.GetBackBuffer(0, 0);
System.Drawing.Graphics g = bb.GetGraphics();
g.DrawRectangle(...); // or whatever
bb.ReleaseGraphics();
bb.Dispose();
此外,我看不出有什么方法可以阻止某人向该控件添加控件 面板用作DX面板。
已澄清的问题
但是,我最初的问题仍然存在。有谁知道Windows Forms和DirectX 11之间的绘制顺序是什么?有人知道一个事件可以作为此命令的一部分在绘制的内容之上绘制吗?