【问题标题】:How Do I Initialize OpenGL.NET with GLFW.Net?如何使用 GLFW.Net 初始化 OpenGL.NET?
【发布时间】:2020-08-02 16:45:38
【问题描述】:

我正在尝试在 C# 中使用 OpenGL 和 GLFW。我已经为 GLFW.Net 和 OpenGL.Net 安装了 NuGet 包。我一生无法弄清楚的是,如何使用 GLFW.Net 设置 OpenGL.Net 的上下文?当我尝试运行我非常基本的测试 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();
        }
    }

但没有渲染。这是否意味着我的上下文不存在,或者我很愚蠢并留下了一些东西?

【问题讨论】:

  • 在您的情况下,颜色是否清晰(变为蓝色)?
  • 没有。那么它可能是上下文创建?

标签: c# opengl openglcontext


【解决方案1】:

乍一看,我可以看到一个明显的问题。缓冲区数据的大小必须以字节为单位指定(请参阅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 Context 设为当前(无论出于何种原因)之前进行初始化:

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

【讨论】:

    【解决方案2】:

    我所要做的就是将Gl.Initialize() 移动到Glfw.MakeContextCurrent(window) 上方。我想你必须先创建 OpenGL 上下文,然后再使上下文成为当前的。这与 LWJGL 不同,LWJGL 在调用GL.createCapabilities() 之前必须先调用GLFW.glfwMakeContextCurrent()

    希望这有帮助! :)

    【讨论】:

    • 我确认。我已经验证过了。
    猜你喜欢
    • 1970-01-01
    • 2017-03-24
    • 2017-11-06
    • 2012-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多