2014-03-27 145 views
0

你好我開始到目前爲止,我在這個片段中傳來:與Tao.Framework(C#的Open GL)簡單的動畫更新緩衝區不使用<code>C#</code>,<code>Tao.Framework</code>和<code>Tao.Plataform.Windows SimpleOpenGlControl</code>,<code>OpenGL</code>工作

// 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

仍具有以下細節。儘管上面的第一幀是正確的,但沒有顯示出任何變化,我的意思是平方不移動。

我該如何解決?或者如何構建一個簡單的動畫?

回答

2

您可能不會從沒有OpenGL上下文的線程發出OpenGL命令。

你有兩個選擇:

  • 使用wglMakeCurrent到OpenGL上下文移動到新的線程。 (在這種情況下,主線程可能不再發出OpenGL命令。)
  • 鉤住Application.Idle事件並在其中循環。每當有新的Windows消息到達時從循環中斷開。

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; 

你可以問視覺/ Xamarin Studio中右鍵單擊未知的標識,並選擇「解決」添加using指令失蹤。

+0

如何使用我需要使用此代碼工作? –

+0

我已將必要的使用指令添加到我的帖子中。 –

+0

謝謝小提琴手,花了一段時間來測試這個,但現在它工作。但我改變了框架,現在我不能把紋理。我打開這個新的問題:http://stackoverflow.com/questions/22771476/the-renderer-is-not-using-the-texture-in-open-tk請,如果你有時間,有一個看看我的問題。 –