我正在开发一个项目,我在WPF应用程序中托管了一个D3DImage。我在D3DImage上渲染了其他WPF控件,每个控件都有透明背景。但是,当我渲染场景时,我的UI会消失,直到我将鼠标悬停在控件上(可能会强制它们重新渲染)。
我知道这不应该是一个问题,因为我在没有这个问题的情况下最近完成了这个问题,但是我不再拥有那个项目,所以我无法比较我的代码。如果有人对这可能是什么有任何想法,我全都耳朵。我将创建一个小型测试项目,试图在明天早上重现这个问题;所以我会更新这个问题。
修改 我设法重现了我在一个简单项目中遇到的问题,可以下载here。注意:要运行项目,您需要安装最新的SlimDX。
修改 在该测试项目中注释掉对D3DImage.AddDirtyRect(...)的调用会导致UI被正确绘制。但是,当旋转对象时(随后在更新旋转时重新渲染3D内容),UI会闪烁,并且不会一直重新绘制。
答案 0 :(得分:0)
我找到了问题的原因。基本上,在WPF中使用D3DImage作为Direct3D内容的渲染表面时,您不能使用Device.Present()方法调用,因为它处理前缓冲区的呈现。这不应该这样做,因为D3DImage需要自己处理它,因此它可以应用正确的透明度(有关详细信息,请参阅here)。
简单来说,我的修复包括两部分:
Surface.CreateRenderTarget(...)
创建渲染表面后,我必须使用mDevice.SetRenderTarget(0, mSurface)
将目标传递给设备。这允许渲染在表面上进行。Device.Present()
的调用,以便WPF可以处理正确的缓冲区渲染。我敢说解释不是100%准确,但是阅读该链接以及D3DImage的MSDN文档应该清除它。