如何用GLFW.Net初始化OpenGL.NET?
How Do I Initialize OpenGL.NET with GLFW.Net?
我正在尝试在 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();
}
}
但没有渲染。这是否意味着我的 Context 不存在或者我已经愚蠢并留下了一些东西?
乍一看,我可以看出一个明显的问题。缓冲区数据的大小必须以字节为单位指定(请参阅 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 library has to be initialized before making the OpenGL Context 当前(无论什么原因):
Gl.Initialize();
Glfw.MakeContextCurrent(window);
我所要做的就是将 Gl.Initialize()
移动到 Glfw.MakeContextCurrent(window)
以上。我猜你必须先创建 OpenGL 上下文,然后使上下文成为当前上下文。这与 LWJGL 不同,后者在调用 GL.createCapabilities()
.
之前必须先调用 GLFW.glfwMakeContextCurrent()
希望对您有所帮助! :)
我正在尝试在 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();
}
}
但没有渲染。这是否意味着我的 Context 不存在或者我已经愚蠢并留下了一些东西?
乍一看,我可以看出一个明显的问题。缓冲区数据的大小必须以字节为单位指定(请参阅 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 library has to be initialized before making the OpenGL Context 当前(无论什么原因):
Gl.Initialize();
Glfw.MakeContextCurrent(window);
我所要做的就是将 Gl.Initialize()
移动到 Glfw.MakeContextCurrent(window)
以上。我猜你必须先创建 OpenGL 上下文,然后使上下文成为当前上下文。这与 LWJGL 不同,后者在调用 GL.createCapabilities()
.
GLFW.glfwMakeContextCurrent()
希望对您有所帮助! :)