试图用VBO创建一个圆圈--LWJGL

时间:2014-03-29 22:33:46

标签: lwjgl offset geometry vbo vertex

我试图在LWJGL中创建一个圆圈,使用VBO和VAO,并使用偏移移动它,但似乎一个顶点卡在屏幕的中心。我无法弄清楚如何将它移动到新位置。感谢任何帮助,谢谢!

P.S:我已经尝试过调试程序,但我无法在数组中找到错误的顶点

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();

    }

}

1 个答案:

答案 0 :(得分:0)

&#34;我想我已经发现了这个问题。我在404顶点中设置了仅359个顶点的位置(细分nr + 1乘4)。看起来其余的顶点都停留在屏幕上的0,0处。允许两个FOR语句循环到404可能会解决问题&#34;