0

我一直在玩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);
        }
    }
4

2 回答 2

2

是的,你肯定做错了什么,但首先是静态方法。

即使您使用静态方法,它知道将内容绘制到何处的方式是因为 OpenTKOpenTK.Graphics.OpenGL.GL在创建GameWindowOpenGL (这通过 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);
        }
    }
}
于 2013-01-31T19:40:57.730 回答
1

OpenGL 命令对当前的 GL 上下文进行操作。您从操作系统获取 GL 上下文,并通过特定于操作系统的 ( , 等) 调用使它们在给定线程中成为wgl当前glx*MakeCurrent()

于 2013-01-31T19:36:25.437 回答