我使用OpenTK制作C#OpenGL应用程序。
我试图不使用GameWindow类打开上下文 - 这是我的类管理窗口+上下文:
using OpenTK;
using OpenTK.Graphics;
using OpenTK.Graphics.OpenGL4;
using OpenTK.Platform;
using OpenTK.Input;
class Window
{
private INativeWindow window_;
private IGraphicsContext context_;
private bool isExiting_;
public Window(int width, int height, bool fullscreen, string title = "StormEngine application")
{
window_ = new NativeWindow(width, height, title, fullscreen ? GameWindowFlags.Fullscreen : GameWindowFlags.FixedWindow, GraphicsMode.Default, DisplayDevice.Default);
context_ = new GraphicsContext(GraphicsMode.Default, window_.WindowInfo, 4, 4, GraphicsContextFlags.Default);
context_.MakeCurrent(window_.WindowInfo);
window_.Visible = true;
window_.KeyDown += (sender, e) =>
{
if (e.Keyboard[Key.Escape])
window_.Close();
};
isExiting_ = false;
}
public Window(int width, int height) : this(width, height, false) { }
public bool EndFrame()
{
context_.SwapBuffers();
window_.ProcessEvents();
return (window_.Exists && !isExiting_);
}
}
然后我打电话给Window w = new Window(800, 480);
打开一个窗口。
但是只要我调用OpenGL方法,在我的情况int programId = GL.CreateProgram();
中,我就会得到一个AccessViolationException。
我的猜测是OpenGL函数指针没有正确加载,但我找不到问题发生的地方(我没有得到GL.CreateProgam()
内发生的事情的信息。)
知道可能发生的事情,原因以及如何解决这个问题? :)
答案 0 :(得分:0)
算了,我发现了我的错误:)。
在OpenTK中,一旦创建并创建了当前的GraphicsContext,就需要加载它。
为此,在context_.MakeCurrent(window_.WindowInfo);
之后,我添加了:
(context_ as IGraphicsContextInternal).LoadAll()
我不得不从Github上的GameWindow类源中弄明白,因为这种创建窗口的方式根本没有记录^^
它现在就像一个魅力。 :)