我们在WPF应用程序中使用可切换显卡(AMD Radeon 7670M + Intel 4000)的笔记本电脑上遇到以下问题:
我们用来显示某些视频的D3DImage只显示一个黑框.仅当独立图形(AMD)对应用程序处于活动状态(模式设置为高性能)时才会发生这种情况.英特尔图形处于活动状态(模式设置为省电模式)可以正常工作.看起来我们并不孤单这个问题.搜索谷歌在AMD论坛上发布了以下帖子:
我找到了一个使用D3DImage.CopyBackBuffer的解决方法- 看起来backbuffer确实包含正确的框架 - 所以我会尝试显示它.
但是为了只在必要时应用这种解决方法,这让我想到了这个问题的主题:如何确定系统是否真的具有可切换的图形?
我想可能有一些方法可以使用WMI或查看注册表,但如果有人能指出我正确的方向或者甚至可能有一个例子如何这样做,我会很高兴.
更新:
我尝试过EnumDisplayDevices和System.Management.ManagementObjectSearcher.第一个没有返回所有设备而后者没有.但也许还有更好的方法呢?
摘要(TL:DR版)
最终,我们的目标是能够在WPF应用程序中本地使用OpenGL ES代码(即不是SharpGL等),并且无需空域或驱动程序问题,可以使用Google的ANGLE项目.
背景:
我喜欢OpenGL而不是DirectX的一个原因是它的跨平台功能.它在OS X和Linux以及通过ES的Android和iOS上都提供了出色的支持.但是,在Windows上,使用它会受到驱动程序问题的影响,或者更糟糕的是,许多卡只是没有正确实现它.
输入Google的ANGLE项目或Almost-Native-Graphics-Layer-Engine.
ANGLE是围绕Direct3D实现的OpenGL ES 2.0包装器,这意味着您可以编写OpenGL ES 2.0代码以在Windows上运行,而无需实际的OpenGL驱动程序.它不仅通过了ES兼容性测试,而且实际上是Chrome如何完成所有图形渲染,包括WebGL,所以它绝对是一种经过验证的技术.
问题:
我们知道WPF有一个D3DImage控件,它允许你在WPF中托管Direct3D渲染,并且它可以通过将其输出正确地堆叠到WPF渲染线程来消除空域问题.我的问题是,因为ANGLE是通过Direct3D实现的,而D3DImage是Direct3D渲染的目标,是否可以将两者结合起来,允许我们编写OpenGL ES代码并将其托管在Windows上的WPF应用程序中,所有这些都没有驱动程序或空域问题?
这将是我们的"圣杯".
然而,由于ANGLE希望使用自己的D3Dmage控件创建的D3D表面上的ANGLE目标,因此我一直在围绕墙壁进行攻击.我不确定这是否可能.我甚至无法在任何人的任何地方找到一篇文章或参考文献,更不用说尝试它了.
尽管如此,我们的目标是让我们的共享,跨平台OpenGL(或ES)代码在WPF应用程序中工作,而不会出现空域问题或OpenGL驱动程序要求.我建议使用ANGLE/D3DImage只是......一次尝试.到目前为止,这是我提出的"手段",但这只是我们目标的潜在手段,而不是目标本身.任何能让我们得到同样解决方案的东西都会受到欢迎.
我正在使用D3DImage作为我的WPF用户控件的一部分.很少,在渲染时,D3DImage.TryLock失败.
到目前为止,我还没有找到任何关于为什么D3D.TryLock会失败的文档.有谁知道为什么会发生这种情况?
我有一个非常接近完成的SharpDX项目.它使用Kinect进行交互.因此,我的项目将WPF用于Kinect区域和KinectUserViewer对象.到目前为止,SharpDX已经为一切工作做得很好,然而,当它到达使用direct3D的程序的某个部分时,它开始闪烁.这显然与D3Dimage(由MainWindow.xaml中的SharpDXElement使用)可能"从根本上被破坏并且不适合WPF中的有效D3D渲染"这一事实有关[1].有没有办法保持我的WPF元素,而不是使用direct3D闪烁?
我试图使用D3DImage在DX11中获得MSAA,但似乎是不可能的,因为不允许共享多重采样纹理,如下所述:http://msdn.microsoft.com/en-us/library/windows/桌面/ ff476531(v = vs.85)的.aspx
实际上,我使用了D3DImage的SharpDX实现,它可以很好地用于DX11和DX10,因为只要有人反对就可以离开.
解决这个问题的方法在这个主题中描述:http://sharpdx.org/forum/5-api-usage/1000-d3d11-problem-with-usage-of-texture2d,这些方法都没有成功.还有另一个线程提出了类似的问题:多重采样和Direct3D10/D3DImage互操作
最后,问题实际上是,如果有人能够确认,那么绝对不可能使用D3DImage来渲染DX10/DX11的抗锯齿内容吗?
我将 SharpDX.WPF 项目用于 WPF 功能,与 SharpDX 附带的工具包(具有相同的问题!)相比,它似乎是一个易于理解的低开销库
首先:我使用以下方法修复了最新 SharpDX 的 SharpDX.WPF 项目: https
然后我对 DXElement.cs 进行了以下 hacky 调整,这里也完成了一个解决方案:
private Query queryForCompletion;
public void Render()
{
if (Renderer == null || IsInDesignMode)
return;
var test = Renderer as D3D11;
if (queryForCompletion == null)
{
queryForCompletion = new Query(test.Device,
new QueryDescription {Type = QueryType.Event, Flags = QueryFlags.None});
}
Renderer.Render(GetDrawEventArgs());
Surface.Lock();
test.Device.ImmediateContext.End(queryForCompletion);
// wait until drawing completes
Bool completed;
var counter = 0;
while (!(test.Device.ImmediateContext.GetData(queryForCompletion, out completed)
&& completed)) …Run Code Online (Sandbox Code Playgroud)