我目前正在尝试绘制成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绑定有什么见解?我的意思是,一定要有一个方法,否则对于很多用例来说,绑定基本上是无用的。
首先使用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,即使是在一个活动的上下文。