OpenTK 4.0 + Gtk# 绑定初始化

OpenTK 4.0 + Gtk# bindings initialization

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

我现在正在尝试几天,以获得最新的 OpenTK 预发布版 (4.0.0-pre.10) 与 Gtk# 的 GLArea 一起工作。

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 的文档:

"You must call this method if you are combining OpenTK with a third-party windowing toolkit (e.g. GTK#). In this case, this should be the first method called by your application"

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

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

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

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

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

的 wgl

已编辑:


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