首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否可以通过OpenGL和角度将D3DImage ES代码与WPF应用程序一起使用?

是否可以通过OpenGL和角度将D3DImage ES代码与WPF应用程序一起使用?
EN

Stack Overflow用户
提问于 2013-10-01 04:18:05
回答 1查看 3.8K关注 0票数 9

摘要(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只是.一次尝试。这是我到目前为止想出的“意思”,但这只是实现我们目标的一种潜在手段,而不是目标本身。任何能让我们找到同样的解决方案的事情都将是非常受欢迎的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-15 00:04:22

我上传了一个github项目,演示如何通过OpenTK.GLControl将OpenGL呈现集成到WPF应用程序中。

代码非常简单:

  1. 向WPF应用程序添加一个WindowsFormsHost
  2. 构造一个OpenTK.GLControl并将其附加到WindowsFormsHost
    • 传递桌面GraphicsContextFlags.Default上下文的OpenGL
    • GraphicsContextFlags.Embedded传递给OpenGL ES (角度)上下文

  1. 使用普通OpenGL或OpenGL ES命令进行呈现

提示:OpenTKOpenTK.GLControl也可作为NuGet包使用。有一个新的发行到期明天与改进的角度支持。

请注意,WindowsFormsHost方法受空域限制。如果这是一个问题,请参阅我在这里的回答以获得解决方案。

代码语言:javascript
复制
// 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();
        }
    }
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19107890

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档