如何让东西出现在我的窗口?

时间:2013-01-31 19:28:43

标签: opengl opentk

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

2 个答案:

答案 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上下文,并通过特定于操作系统(wglglx等)*MakeCurrent()调用使其在给定线程中保持最新状态。