2014-03-29 3 views
0

VBW와 VAO를 사용하여 LWJGL에서 원을 만들고 오프셋을 사용하여 원을 만들려고했지만 한 정점이 화면 가운데에 붙어있는 것 같습니다. 새로운 위치로 이동하는 방법을 알 수 없습니다. 어떤 도움을 주셔서 감사합니다, 감사합니다!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 vertex (세분의 nr + 1 x 4) 중에서 단지 359 개의 꼭지점의 위치를 ​​설정하고있었습니다. 나머지 정점이 화면의 0,0에 붙어있는 것 같습니다. 두 FOR 문을 모두 404 허용주기 순환 문제를 해결할 것 같습니다 –

+0

당신은 대답을 가지고 그것을 받아들입니다. 당신은 당신 자신의 질문에 대답 할 수 있습니다. –

+0

팁 주셔서 감사. –

답변

0

"나는 내가 단지의 위치를 ​​설정하는 문제를 발견했습니다 생각합니다. 404 vertex (subdivisions의 nr + 1 times 4)의 vertex 359. 나머지 vertex는 화면에서 0,0으로 고정 된 것처럼 보입니다. 두 FOR 문을 모두 404까지 순환 시키면 문제가 해결되는 것 같습니다. "