您好我是OpenGL
使用C#
,Tao.Framework
和Tao.Plataform.Windows SimpleOpenGlControl
开始的,到目前为止,我附带了这个代码段:
// in Form.Load handler
Gl.glOrtho(0, 10, 0, 10, -1, 1);
Gl.glClearColor(0f, 0f, 0f, 0f);
Gl.glClear(Gl.GL_COLOR_BUFFER_BIT);
Gl.glBegin(Gl.GL_POLYGON);
Gl.glVertex2f(0f, 0f);
Gl.glVertex2f(0f, 1f);
Gl.glVertex2f(1f, 1f);
Gl.glVertex2f(1f, 0f);
Gl.glEnd();
到目前为止,这么好。现在我正在尝试添加一些动画效果。我正试图将广场像一个在我的客户区四肢反弹的球一样移动。我的代码是这样的:
Gl.glOrtho(0, 10, 0, 10, -1, 1);
new Thread(() =>
{
int x = 3, incX = 1;
int y = 7, incY = 1;
while (true)
{
Gl.glClearColor(0f, 0f, 0f, 0f);
Gl.glClear(Gl.GL_COLOR_BUFFER_BIT);
Gl.glBegin(Gl.GL_POLYGON);
Gl.glVertex2f(x + 0f, y + 0f);
Gl.glVertex2f(x + 0f, y + 1f);
Gl.glVertex2f(x + 1f, y + 1f);
Gl.glVertex2f(x + 1f, y + 0f);
Gl.glEnd();
simpleOpenGlControl1.SwapBuffers();
if (x == 0 || x == 9) incX *= -1;
if (y == 0 || y == 9) incY *= -1;
x += incX;
y += incY;
Thread.Sleep(1000);
}
}).Start();
但是有一些非常错误的东西。我的图片在两个特定帧之间切换。我打印了两个框架。看看:
http://www.jonataspiazzi.xpg.com.br/outpost/example_frame.png
仍然有以下细节。尽管上面的第一帧是正确的,但它没有变化,我的意思是方形不会移动。
我该如何解决?或者如何构建一个简单的动画?
答案 0 :(得分:2)
您不能从没有OpenGL上下文的线程发出OpenGL命令。
您有两种选择:
Application.Idle
事件并在其中循环。每当有新的Windows消息到达时,都会从循环中断。 Tao SimpleOpenGlControl
没有提供检查传入的Windows消息的方法。作为Tao框架的原始维护者之一,我建议改为OpenTK.GLControl。在这种情况下,你会写:
// in Form.Load handler - separate thread
glControl.Context.MakeCurrent(null);
Thread thread = new Thread(() =>
{
glControl.MakeCurrent();
while (!exit)
{
GL.ClearColor(0f, 0f, 0f, 0f);
GL.Clear(ClearBufferMode.ColorBufferBit);
GL.Begin(PrimitiveType.Quads);
GL.Vertex(x + 0f, y + 0f);
GL.Vertex(x + 0f, y + 1f);
GL.Vertex(x + 1f, y + 1f);
GL.Vertex(x + 1f, y + 0f);
GL.End();
glControl.SwapBuffers();
if (x == 0 || x == 9) incX *= -1;
if (y == 0 || y == 9) incY *= -1;
x += incX;
y += incY;
}
};
或(如果您不想使用单独的线程):
// in Form.Load handler - main thread
Application.Idle += (sender, e) =>
{
while (glControl.IsIdle)
{
GL.ClearColor(0f, 0f, 0f, 0f);
GL.Clear(ClearBufferMode.ColorBufferBit);
GL.Begin(PrimitiveType.Quads);
GL.Vertex(x + 0f, y + 0f);
GL.Vertex(x + 0f, y + 1f);
GL.Vertex(x + 1f, y + 1f);
GL.Vertex(x + 1f, y + 0f);
GL.End();
glControl.SwapBuffers();
if (x == 0 || x == 9) incX *= -1;
if (y == 0 || y == 9) incY *= -1;
x += incX;
y += incY;
}
};
编辑:在这两种情况下,您都需要使用以下指令。
using OpenTK;
using OpenTK.GLControl;
using OpenTK.Graphics;
using OpenTK.Graphics.OpenGL;
using OpenTK.Input;
您可以通过右键单击未知标识符并选择“Resolve”来要求Visual / Xamarin Studio添加缺少的using指令。
答案 1 :(得分:0)
如果您的SimpleOpenGlControl是smpl,则可以调用
smpl.SwapBuffers();
效果很好