我一直在玩OpenGL。我很困惑,因为大多数命令似乎都调用静态方法而不是我创建的窗口对象 - 通过编译器神圣的方法窗口的神秘方法,我无法理解。
我认为我在路上误解了一些东西,因为我无法让我的代码工作。下面的代码片段生成一个透明背景的窗口,而不是黑色背景;尝试绘制其他一些命令也没有给我什么。我做错了什么?
public static void Main()
{
using (OpenTK.GameWindow a = new OpenTK.GameWindow(800, 600, GraphicsMode.Default, "Sandboxy"))
{
a.Run(30);
OpenTK.Graphics.OpenGL.GL.ClearColor(0, 0, 0, 0);
OpenTK.Graphics.OpenGL.GL.ClearDepth(1.0);
OpenTK.Graphics.OpenGL.GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);
}
}
答案 0 :(得分:2)
是的,你肯定做错了什么,但首先是静态方法。
即使您正在使用静态方法,它知道在哪里绘制内容的方式是因为OpenTK告诉OpenGL(OpenTK.Graphics.OpenGL.GL
)在创建GameWindow
时将绘制到哪里,它将窗口绑定到静态OpenGL上下文(在Windows上,它通过Win32函数wglCreateContext(HDC)
和wglMakeCurrent(HDC, HGLRC)
执行此操作,如果您需要更多信息,请查看它们。)
它不起作用的原因是因为你在启动渲染循环后尝试清除所有内容:
a.Run(30);
不打开窗口,它也会进入渲染循环,这意味着它只会在窗口关闭时返回。这显然不是你想要的。你想在循环中渲染 ,而不是之后。
绘制它(对于OpenTK)的首选方法是创建一个派生自GameWindow
的类,并覆盖与循环相关的函数:
class MyGameWindow : GameWindow
{
public MyGameWindow() : base(800, 600, GraphicsMode.Default, "Sandboxy")
{
}
protected override void OnRenderFrame(FrameEventArgs e)
{
GL.ClearColor(0, 0, 0, 0);
GL.ClearDepth(1.0);
GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);
this.SwapBuffers();
}
public static void Main(string[] args)
{
using (GameWindow a = new MyGameWindow())
{
a.Run(30);
}
}
}
答案 1 :(得分:1)
OpenGL命令在当前 GL context上运行。您从操作系统获取GL上下文,并通过特定于操作系统(wgl
,glx
等)*MakeCurrent()
调用使其在给定线程中保持最新状态。