2014-03-29 51 views
0

我試圖在LWJGL中創建一個使用VBO和VAO的圓,並使用偏移量來移動它,但似乎有一個頂點卡在屏幕的中心。我無法弄清楚如何將它移動到新的位置。任何幫助表示讚賞,謝謝!試圖用VBO創建一個圓 - LWJGL

PS:我已經嘗試調試程序,但我不能在我的陣列定位故障頂點

import java.nio.FloatBuffer; 

import org.lwjgl.BufferUtils; 
import org.lwjgl.LWJGLException; 
import org.lwjgl.opengl.*; 

public class Test { 

    // Setup variables 
    private int WIDTH = 800; 
    private int HEIGHT = 600; 
    private String title = "Circle"; 

    // Quad variables 
    private int vbo = 0; // Vertex Buffer Object 
    private int vao = 0; // Vertex Array Object 

    int SUBDIVISIONS = 100; 

    float[] vertex = new float[(SUBDIVISIONS + 1) * 4]; 

    public Test() { 

     // Initialize 
     setupOpenGL(); 
     setupQuad(); 

     while (!Display.isCloseRequested()) { 

      loop(); 
      Display.update(); 
      Display.sync(60); 

     } 

     Display.destroy(); 

    } 

    public void setupOpenGL() { 

     try { 

      Display.setDisplayMode(new DisplayMode(WIDTH, HEIGHT)); 
      Display.setTitle(title); 
      Display.create(); 

     } catch (LWJGLException e) { 
      e.printStackTrace(); 
      System.exit(-1); // If error , exit program 
     } 

     GL11.glClearColor(0.0f, 0.0f, 0.0f, 0.0f); 

    } 

    public void setupQuad() { 

     float r = 0.2f; 
     float x; 
     float y; 
     float offSetX = 0.3f; 
     float offSetY = 0.3f; 

     vertex[0] = (float) Math.sin(Math.PI*2*0/SUBDIVISIONS) * r + offSetX; 
     vertex[1] = (float) Math.cos(Math.PI*2*1/SUBDIVISIONS) * r + offSetY; 



     for (int i = 2; i < 360; i = i + 2) { 

      double angle = Math.PI * 2 * i/SUBDIVISIONS; 
      x = (float) Math.cos(angle) * r; 
      vertex[i] = x + offSetX; 

     } 

     for (int i = 3; i < 360; i = i + 2) { 

      double angle = Math.PI * 2 * i/SUBDIVISIONS; 
      y = (float) Math.sin(angle) * r; 
      vertex[i] = y + offSetY; 

     } 

     FloatBuffer vertexBuffer = BufferUtils.createFloatBuffer(vertex.length); 
     vertexBuffer.put(vertex); 
     vertexBuffer.flip(); 

     vao = GL30.glGenVertexArrays(); 
     GL30.glBindVertexArray(vao); 

     vbo = GL15.glGenBuffers(); 
     GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo); 
     GL15.glBufferData(GL15.GL_ARRAY_BUFFER,vertexBuffer,GL15.GL_STATIC_DRAW); 

     GL20.glVertexAttribPointer(0, 2, GL11.GL_FLOAT, false, 0, 0); 

     GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); 

     GL30.glBindVertexArray(0); 

    } 

    public void loop() { 

     GL11.glClear(GL11.GL_COLOR_BUFFER_BIT); 

     GL30.glBindVertexArray(vao); 
     GL20.glEnableVertexAttribArray(0); 

     // Draw the vertices 
     GL11.glDrawArrays(GL11.GL_TRIANGLE_FAN, 0, vertex.length/2); 

     // Put everything back to default (deselect) 
     GL20.glDisableVertexAttribArray(0); 
     GL30.glBindVertexArray(0); 

    } 

    public static void main(String[] args) { 

     new Test(); 

    } 

} 
+0

我想我已經找到了問題。我設定了404個頂點中只有359個頂點的位置(小區數n + 4)。看起來其餘的頂點在屏幕上被卡住了0,0。允許兩個FOR語句循環到404似乎可以解決問題 –

+0

如果您獲得了答案並接受它。你可以回答你自己的問題。 –

+0

感謝您的提示。 –

回答

0

「我想我已經找到了問題我設置的唯一位置。在404個頂點中有359個頂點(nr個細分+ 1個4個),看起來其餘的頂點在屏幕上都是0,0,允許兩個FOR語句循環到404似乎解決了這個問題「