java - OpenGL Java VBO

标签 java opengl vbo

我正在使用 LWJGL 并使用 glBegin/glEnd 绘制立方体,但我听说这种方法效率很低,我应该开始使用 VBO。我不知道它是如何工作的。

我想绘制不同大小和位置的立方体(无旋转),我认为我应该为此使用 VBO

任何人都可以给我一些示例代码或关于如何将 VBOJava 一起使用的见解,或者即使 VBO 是最好的选择?

最佳答案

这是我为使用 Java 测试 VBO 而编写的代码。它使用 JOGL 而不是 LWJGL,但这是小事。

除了 glVertexPointer,您还可以使用 glTexCoordPointer 和 glNormalPointer 来指定纹理坐标和法线的数据,并使用 glEnableClientState(GL.GL_TEXTURE_COORD_ARRAY) 和 glEnableClientState(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) {}
}

关于java - OpenGL Java VBO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6172308/

相关文章:

java - Android 的奇怪行为

java - Android - 从 UI 线程切换回来?

android - OpenGL ES VBO glgeterror 4242512 - 这是什么?

iphone - 如何在 iOS 上的 OpenGL ES 1.0 中使用顶点缓冲对象 (VBO) 而不是调用 glDrawArrays 数千次?

java - 检查字符串 C 是否是 A 和 B 的交错

java - 提示用户输入直到出现空行

java - 聚光灯不工作

objective-c - 禁用 GL_DEPTH_TEST 时,纹理消失

c++ - 如果我只需要它在其他线程中的值,我是否应该在一个线程中锁定一个变量,如果我不这样做,为什么它会起作用?

c++ - 仅更新选定三角形的颜色,VBO 更新