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

はい、あなたは間違いなく何か間違ったことをしていますが、まず、静的メソッドのことです。

静的メソッドを使用している場合でも、どこに描画するかを知る方法は、OpenTKがOpenGL(OpenTK.Graphics.OpenGL.GL)に、作成時に描画先を指示GameWindowするため、ウィンドウを静的OpenGLコンテキストにバインドします(ウィンドウでは、これは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コンテキストを取得し、OS固有の(、など)呼び出しを介して特定のスレッドでそれらを最新にwglglxます*MakeCurrent()

于 2013-01-31T19:36:25.437 に答える