我有一个程序会画一条线,如下所示。
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();
}
我想在这个方法中画一些东西,但它不起作用。
出了什么问题。
由于
答案 0 :(得分:1)
你应该在Paint事件结束后的所有绘图之后调用 glControl1.SwapBuffers(); 。
SwapBuffers会将当前缓冲区显示在屏幕上。通常你有两个缓冲区在渲染循环中一直切换。你可以清除它来调用
GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);
你的第二种方法是什么,是在Paint循环之外绘画。您需要在该事件中使用SwapBuffers或将您的绘图排队并在绘制事件中处理队列。
根据绘图代码的复杂程度,可能适合引入“场景”的概念,其中包含要在每次绘制调用时绘制的所有对象。