OpenTK 4.0 + Gtk#绑定初始化

问题描述 投票:0回答:1

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

我现在尝试了好几天,想让最新的OpenTK的prerelease(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.的文档。

"如果你把OpenTK和第三方窗口工具箱(如GTK#)结合起来, 你必须调用这个方法. 在这种情况下,这应该是你的应用程序调用的第一个方法"

我在第4版中找不到这个功能或类似的东西。好像刚刚被删除了。

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

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

c# opentk gtk#
1个回答
0
投票

首先使用GLFW绑定需要一个活跃的Opengl上下文,其次你可能想使用其他的绑定上下文,可惜他们只提供GLFW的上下文,因为那是他们选择用来做窗口的。

我已经做了一个适用于Linux的绑定上下文,在某人的帮助下,我做了一些也能在两个窗口上工作的东西。你可以从这里获取它 https:/gist.github.comNepNete4e75defb3748f76f10302b585b9839b。. 我建议在GLArea的OnRealized事件中加载绑定,并且如果你使用NativeBindingsContext的话,让它的上下文成为当前的,因为Windows上的OpenGL需要一个活动的上下文来返回有效的指针,其他两个文件是它所需要的,但是如果你只想针对一个平台,你可以只使用linux的glx上下文和Windows的wgl上下文。

已编辑。


你可以在启动gtk应用程序之前加载绑定,因为glx不需要一个活动的上下文来返回函数指针,但我建议在GLArea的OnRealized事件中加载它们,并使用一个可选的静态布尔值,以避免加载它们超过一次,如果你想在onrealized中进行GL调用,我建议使该区域的上下文固化。 dll "和wglGetProcAddress,似乎大多数时候返回0,即使是在一个活动的上下文。

© www.soinside.com 2019 - 2024. All rights reserved.