【问题标题】:OpenTK 4.0 + Gtk# bindings initializationOpenTK 4.0 + Gtk# 绑定初始化
【发布时间】:2020-05-10 16:03:38
【问题描述】:

我目前正在尝试绘制 Gtk# 的 GLArea。遗憾的是,Gtk# 没有附带 GL 函数,只提供上下文创建。

我现在正在尝试使用 Gtk# 的 GLArea 获得最新的 OpenTK 预发布版(4.0.0-pre.10)。

using Gtk;
using OpenToolkit.Graphics.OpenGL4;
using OpenToolkit.Windowing.GraphicsLibraryFramework;

namespace Test
{
    class Viewport : GLArea
    {
        protected override bool OnRender(Gdk.GLContext context)
        {
            GL.ClearColor(0.3f, 0.3f, 0.3f, 1.0f);
            GL.Clear(ClearBufferMask.ColorBufferBit);

            return true;
        }
    }

    class MainWindow : Gtk.Window
    {
        public MainWindow() : base(WindowType.Toplevel)
        {
            this.Add(new Viewport());
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            GLFW.Init();
            GL.LoadBindings(new GLFWBindingsContext());

            Application.Init();

            var window = new MainWindow();
            window.ShowAll();

            Application.Run();
        }
    }
}

问题是 GL 函数似乎没有被加载,第一次尝试调用其中一个函数会产生 System.AccessViolationException。

我真的找不到任何关于如何初始化 OpenTK 4.0 绑定的信息。 OpenTK 3 有 OpenTK.Toolkit.Init() 这似乎正是我所需要的。

OpenTK.Toolkit.Init 的文档:

“如果您将 OpenTK 与第三方窗口工具包(例如 GTK#)结合使用,则必须调用此方法。在这种情况下,这应该是您的应用程序调用的第一个方法”

我在第 4 版中找不到此功能或类似功能。它似乎刚刚被删除。

我也不能使用 OpenTK 3,因为它缺乏对 .Net Core 的支持。我通过创建一个 OpenTK 虚拟窗口并立即将其丢弃,从而使一切正常工作。这会初始化 GL.* 函数,但您会看到第二个窗口打开和关闭一秒钟。我真的不想使用这样的解决方法。

有人对如何正确初始化 OpenTK 4.0 绑定有任何见解吗?我的意思是,必须有一种方法,否则绑定对于很多用例来说基本上是无用的。

【问题讨论】:

    标签: c# opentk gtk#


    【解决方案1】:

    首先,使用 GLFW 绑定需要一个由它创建的活动 Opengl 上下文,其次您可能想要使用其他一些绑定上下文,遗憾的是它们只为 GLFW 提供了一个,因为这是他们选择用于窗口的。

    我已经制作了一个适用于 Linux 的绑定上下文,并且在某人的帮助下,我制作了一些适用于两个 Windows 的东西。你可以从这里https://gist.github.com/NepNet/e4e75defb3748f76f10302b585b9839b 获取它。我建议在 GLArea 的 OnRealized 事件中加载绑定,如果您使用 NativeBindingsContext 则使其成为当前上下文,因为 Windows 上的 OpenGL 需要一个活动上下文才能返回有效指针,但如果您想定位其他 2 个文件,则它需要其他两个文件只有一个平台,你只能使用 linux 的 glx 上下文和 windows 的 wgl

    编辑:


    您可以在启动 gtk 应用程序之前加载绑定,因为 glx 不需要活动上下文来返回函数指针,但我建议在 GLArea 的 OnRealized 事件中加载它们,并使用可选的静态布尔值不加载他们不止一次,如果你想在 onrealized 中进行 GL 调用,我建议使该区域的上下文成为当前的,至于 windows 我还没有解决方案,尝试使用 'opengl32.dll' 和 wglGetProcAddress 并且似乎即使有一个活跃的上下文,大部分时间都返回 0

    【讨论】:

    • 说实话,我觉得这很奇怪。他们甚至提到“使用 3D 加速为 GUI 增添趣味”作为他们的主要功能之一。大多数 GUI 框架都带有自己的 Window 系统。不需要像这样需要加载特定于平台的系统库以将 OpenTK 集成到您的 GUI 中的变通方法。谢谢你的帮助。如果事情就是这样,我将不得不为我当前的项目寻找其他东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-22
    • 1970-01-01
    • 2012-07-25
    • 2022-06-19
    • 2019-10-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多