如何在OpenTk中从另一个方法绘制一条线

时间:2013-07-09 08:22:05

标签: opentk

我有一个程序会画一条线,如下所示。

private void glControl1_Paint(object sender, PaintEventArgs e)
    {
        GL.glClear(GL.GL_DEPTH_BUFFER_BIT | GL.GL_COLOR_BUFFER_BIT);

        GL.glMatrixMode(GL.GL_MODELVIEW);
        GL.glLoadIdentity();
        GL.glColor(Color.Yellow);

        GL.glBegin(GL.GL_LINES);
        GL.glVertex3f(100.0f, 100.0f, 0.0f); // origin of the line
        GL.glVertex3f(200.0f, 140.0f, 5.0f); // ending point of the line
        GL.glEnd();

        glControl1.SwapBuffers();
    }

在Paint事件期间调用上述方法。

但我有另一种方法如下所示:

    private void glControl1_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
    {
            GL.glClear(GL.GL_DEPTH_BUFFER_BIT | GL.GL_COLOR_BUFFER_BIT);
            GL.glMatrixMode(GL.GL_MODELVIEW);
            GL.glLoadIdentity();
            GL.glColor(Color.Yellow);

            GL.glBegin(GL.GL_LINES);
            GL.glVertex3f(100.0f, 100.0f, 0.0f); // origin of the FIRST line
            GL.glVertex3f(200.0f, 140.0f, 5.0f); // ending point of the FIRST line
            GL.glVertex3f(120.0f, 170.0f, 10.0f); // origin of the SECOND line
            GL.glVertex3f(240.0f, 120.0f, 5.0f); // ending point of the SECOND line
            GL.glEnd();
    }

我想在这个方法中画一些东西,但它不起作用。

出了什么问题。

由于

1 个答案:

答案 0 :(得分:1)

你应该在Paint事件结束后的所有绘图之后调用 glControl1.SwapBuffers();

SwapBuffers会将当前缓冲区显示在屏幕上。通常你有两个缓冲区在渲染循环中一直切换。你可以清除它来调用

GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);

你的第二种方法是什么,是在Paint循环之外绘画。您需要在该事件中使用SwapBuffers或将您的绘图排队并在绘制事件中处理队列。

根据绘图代码的复杂程度,可能适合引入“场景”的概念,其中包含要在每次绘制调用时绘制的所有对象。