摘要(TL:DR版本)
最终,我们的目标是能够在WPF应用程序中(即不是SharpGL等)使用WPF ES代码。并且没有空域或司机问题,可能使用谷歌的角度项目。
背景:
关于OpenGL over DirectX,我喜欢的一点是它的跨平台功能。它在OS和Linux上都有很好的支持,通过ES在安卓和iOS上也有很好的支持。然而,在Windows上,使用它会受到驱动程序问题的影响,或者更糟糕的是,许多卡根本无法正确地实现它。
进入谷歌的角度工程,或几乎-本机图形层引擎.
OpenGL是一个围绕Direct3D实现的OpenGL es2.0包装器,这意味着您可以编写要在OpenGL上运行的OpenGL es2.0代码,而无需实际的OpenGL驱动程序。它不仅通过了ES兼容性测试,而且它实际上是Chrome所有图形渲染的方式,包括WebGL,所以它肯定是一项经过验证的技术。
问题:
我们知道WPF有一个D3DImage控件,它允许您在WPF中托管Direct3D呈现,它应该通过将其输出适当地组合到WPF呈现线程来消除空域问题。我的问题是,由于角度是通过Direct3D实现的,而D3DImage是Direct3D呈现的目标,那么是否可以将这两者结合起来,允许我们编写OpenGL ES代码并在WPF应用程序中托管它,所有这些都没有驱动程序或空域问题?
这是我们的“圣杯”。
但是,我一直围绕着获取角度来实现由D3D控件创建的D3DImage表面的渲染,因为ANGLE想要使用它自己的。我不确定这是否可能。我在任何地方都找不到任何人讨论这个问题的任何一篇文章或参考资料,更不用说尝试了。
不过,同样明确的是,我们的目标是使共享的跨平台OpenGL (或ES)代码在没有空域问题或OpenGL驱动程序需求的WPF应用程序中工作。我建议使用角度/D3DImage只是.一次尝试。这是我到目前为止想出的“意思”,但这只是实现我们目标的一种潜在手段,而不是目标本身。任何能让我们找到同样的解决方案的事情都将是非常受欢迎的。
发布于 2014-03-15 00:04:22
我上传了一个github项目,演示如何通过OpenTK.GLControl将OpenGL呈现集成到WPF应用程序中。
代码非常简单:
WindowsFormsHost。OpenTK.GLControl并将其附加到WindowsFormsHost GraphicsContextFlags.Default上下文的OpenGLGraphicsContextFlags.Embedded传递给OpenGL ES (角度)上下文
提示:OpenTK和OpenTK.GLControl也可作为NuGet包使用。有一个新的发行到期明天与改进的角度支持。
请注意,WindowsFormsHost方法受空域限制。如果这是一个问题,请参阅我在这里的回答以获得解决方案。
// This code is public domain
#define USE_ANGLE
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Forms;
using System.Windows.Forms.Integration;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using OpenTK;
using OpenTK.Graphics;
#if USE_ANGLE
using OpenTK.Graphics.ES20;
#else
using OpenTK.Graphics.OpenGL;
#endif
namespace WPF.Angle
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
GLControl glControl;
public MainWindow()
{
InitializeComponent();
}
private void WindowsFormsHost_Initialized(object sender, EventArgs e)
{
var flags = GraphicsContextFlags.Default;
#if USE_ANGLE
flags = GraphicsContextFlags.Embedded;
#endif
glControl = new GLControl(new GraphicsMode(32, 24), 2, 0, flags);
glControl.MakeCurrent();
glControl.Paint += GLControl_Paint;
glControl.Dock = DockStyle.Fill;
(sender as WindowsFormsHost).Child = glControl;
}
private void GLControl_Paint(object sender, PaintEventArgs e)
{
GL.ClearColor(
(float)Red.Value,
(float)Green.Value,
(float)Blue.Value,
1);
GL.Clear(
ClearBufferMask.ColorBufferBit |
ClearBufferMask.DepthBufferBit |
ClearBufferMask.StencilBufferBit);
glControl.SwapBuffers();
}
private void Slider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
{
glControl.Invalidate();
}
}
}https://stackoverflow.com/questions/19107890
复制相似问题