Сбой OpenTK, как только я использую OpenGL

Я использую 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()).

Любая идея о том, что может происходить, почему и как это решить? :)


person xtrium    schedule 01.07.2014    source источник
comment
это звучит действительно странно; Вы пытались распечатать содержимое адреса CreateProgram?   -  person phaazon    schedule 01.07.2014


Ответы (1)


Забудь, я нашел свою ошибку :)

В OpenTK необходимо загрузить GraphicsContext после его создания и сделать текущим. Для этого сразу после context_.MakeCurrent(window_.WindowInfo); я добавил:

(context_ as IGraphicsContextInternal).LoadAll()

Мне пришлось выяснить это из исходного кода класса GameWindow на Github, потому что этот способ создания окна вообще не задокументирован ^^

И теперь это работает как шарм. :)

person xtrium    schedule 01.07.2014