Как инициализировать OpenGL. NET с GLFW. Net? - PullRequest
1 голос
/ 20 апреля 2020

Я пытаюсь использовать OpenGL и GLFW в C#. Я установил пакеты NuGet для GLFW. Net и OpenGL. Net. Что я не могу понять в своей жизни, так это как настроить контекст для OpenGL. Net с GLFW. Net ?? При попытке запустить мой базовый c тестовый код OpenGL не было сообщений об ошибках. то есть

    class Program
    {
        [STAThread]
        static void Main(string[] args)
        {
            Glfw.Init();
            GLFWwindow window = Glfw.CreateWindow(1080, 720, "Yeet", null, null);
            Glfw.MakeContextCurrent(window);
            Gl.Initialize();

            uint vao = Gl.CreateVertexArray();
            Gl.BindVertexArray(vao);

            uint vbo = Gl.CreateBuffer();
            Gl.BindBuffer(BufferTarget.ArrayBuffer, vbo);
            Gl.BufferData(BufferTarget.ArrayBuffer, 6, new float[] { -0.5f, -0.5f, 0.5f, -0.5f, 0.0f, 0.5f }, BufferUsage.StaticDraw);
            Gl.VertexAttribPointer(0, 2, VertexAttribType.Float, false, 0, null);

            while (Glfw.WindowShouldClose(window) != 1)
            {
                Glfw.PollEvents();

                Gl.ClearColor(0.0f, 1.0f, 1.0f, 1.0f);
                Gl.Clear(ClearBufferMask.ColorBufferBit);
                Gl.BindVertexArray(vao);
                Gl.EnableVertexAttribArray(0);
                Gl.DrawArrays(PrimitiveType.Triangles, 0, 3);
                Gl.DisableVertexAttribArray(0);
                Gl.BindVertexArray(0);

                Glfw.SwapBuffers(window);
            }

            Glfw.DestroyWindow(window);
            Glfw.Terminate();
        }
    }

но ничего не рендерит. Значит ли это, что моего контекста не существует или я был глуп и что-то оставил?

Ответы [ 2 ]

1 голос
/ 20 апреля 2020

Все, что мне нужно было сделать, это переместить Gl.Initialize () выше Glfw.MakeContextCurrent (window). Я предполагаю, что вы должны сначала создать контекст OpenGL, а затем сделать его текущим. В отличие от LWJGL, в котором необходимо вызвать GLFW.glfwMakeContextCurrent () перед вызовом GL.createCapabilities (). :) Надеюсь, это помогло!

1 голос
/ 20 апреля 2020

На первый взгляд, я вижу очевидную проблему. Размер данных буфера должен быть указан в байтах (см. glBufferData). Следовательно, размер должен быть 6 * 4, а не 6:

var vertices = new float[] { -0.5f, -0.5f, 0.5f, -0.5f, 0.0f, 0.5f };
Gl.BufferData(BufferTarget.ArrayBuffer, (uint)(4 * vertices.Length),
    vertices, BufferUsage.StaticDraw);

Оказывается, библиотека OpenGL. NET должна быть инициализирована перед выполнением Контекст OpenGL текущий (по любой причине):

Gl.Initialize();
Glfw.MakeContextCurrent(window);
...