OpenGL Java VBO - PullRequest
       21

OpenGL Java VBO

4 голосов
/ 30 мая 2011

Я использую LWJGL и рисую кубы с glBegin/glEnd, но я слышал, что этот метод очень неэффективен, и я должен начать использовать VBO.Я понятия не имею, как это работает.

Я хочу рисовать кубы разных размеров и положений (без вращения), и я думаю, что я должен использовать VBO s для этого.

Может кто-нибудьмогли бы привести пример кода или понять, как использовать VBO s с Java или даже если VBO s - лучший выбор?

Ответы [ 3 ]

8 голосов
/ 30 мая 2011

Это код, который я написал для тестирования VBO с Java.Он использует JOGL вместо LWJGL, но это второстепенная вещь.

В дополнение к glVertexPointer вы также можете использовать glTexCoordPointer и glNormalPointer, чтобы указать данные для текстурных координат и нормалей и активировать их с помощью glEnableClientState (GL.GL_TEXTURE_COORET_COOR).(GL.GL_NORMAL_ARRAY).

import com.sun.opengl.util.*;

import javax.media.opengl.*;
import javax.swing.*;
import java.nio.*;


public class VBOTest implements GLEventListener {
    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        GLCanvas canvas = new GLCanvas();
        canvas.addGLEventListener(new VBOTest());
        frame.add(canvas);
        frame.setSize(640, 480);
        frame.setVisible(true);
    }

    private FloatBuffer vertices;
    private ShortBuffer indices;
    private int VBOVertices;
    private int VBOIndices;

    public void init(GLAutoDrawable drawable) {
        float[] vertexArray = {-0.5f,  0.5f, 0,
                                0.5f,  0.5f, 0,
                                0.5f, -0.5f, 0,
                               -0.5f, -0.5f, 0};
        vertices = BufferUtil.newFloatBuffer(vertexArray.length);
        vertices.put(vertexArray);
        vertices.flip();

        short[] indexArray = {0, 1, 2, 0, 2, 3};
        indices = BufferUtil.newShortBuffer(indexArray.length);
        indices.put(indexArray);
        indices.flip();

        GL gl = drawable.getGL();
        int[] temp = new int[2];
        gl.glGenBuffers(2, temp, 0);

        VBOVertices = temp[0];
        gl.glBindBuffer(GL.GL_ARRAY_BUFFER, VBOVertices);
        gl.glBufferData(GL.GL_ARRAY_BUFFER, vertices.capacity() * BufferUtil.SIZEOF_FLOAT,
                            vertices, GL.GL_STATIC_DRAW);
        gl.glBindBuffer(GL.GL_ARRAY_BUFFER, 0);

        VBOIndices = temp[1];
        gl.glBindBuffer(GL.GL_ELEMENT_ARRAY_BUFFER, VBOIndices);
        gl.glBufferData(GL.GL_ELEMENT_ARRAY_BUFFER, indices.capacity() * BufferUtil.SIZEOF_SHORT,
                            indices, GL.GL_STATIC_DRAW);
        gl.glBindBuffer(GL.GL_ELEMENT_ARRAY_BUFFER, 0);
    }

    public void display(GLAutoDrawable drawable) {
        GL gl = drawable.getGL();

        gl.glEnableClientState(GL.GL_VERTEX_ARRAY);

        gl.glBindBuffer(GL.GL_ARRAY_BUFFER, VBOVertices);
        gl.glVertexPointer(3, GL.GL_FLOAT, 0, 0);
        gl.glBindBuffer(GL.GL_ELEMENT_ARRAY_BUFFER, VBOIndices);
        gl.glDrawElements(GL.GL_TRIANGLES, indices.capacity(), GL.GL_UNSIGNED_SHORT, 0);

        gl.glDisableClientState(GL.GL_VERTEX_ARRAY);
    }

    public void reshape(GLAutoDrawable drawable, int x, int y, int width, int height) {}
    public void displayChanged(GLAutoDrawable drawable, boolean modeChanged, boolean deviceChanged) {}
}
0 голосов
/ 12 марта 2016

Jzy3d позволяет легко рисовать VBO на Java на основе JOGL.

Здесь - пример Я написал, показывая, как создать график рассеяния VBO. Этот разброс основан на общей DrawableVBO , которую можно расширить, чтобы установить собственную геометрию / сетку.

0 голосов
/ 30 мая 2011

Googling для OpenGL VBO дает полезные результаты, такие как this

...