Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
OpenGL Java VBO_Java_Opengl_Vbo - Fatal编程技术网

OpenGL Java VBO

OpenGL Java VBO,java,opengl,vbo,Java,Opengl,Vbo,我正在使用LWJGL和glBegin/glEnd绘制立方体,但我听说这种方法效率很低,我应该开始使用VBOs。我不知道这是怎么回事 我想画不同大小和位置的立方体(没有旋转),我想我应该使用VBOs来实现这一点 有谁能给我一些示例代码或见解,告诉我如何在Java中使用VBOs,或者即使VBOs是最好的选择?谷歌搜索OpenGL VBO会得到有用的结果,比如这是我用Java测试VBO的代码。它使用JOGL而不是LWJGL,但这是一件小事 除了glVertexPointer,您还可以使用glTexCo

我正在使用
LWJGL
glBegin/glEnd
绘制立方体,但我听说这种方法效率很低,我应该开始使用VBOs。我不知道这是怎么回事

我想画不同大小和位置的立方体(没有旋转),我想我应该使用
VBO
s来实现这一点


有谁能给我一些示例代码或见解,告诉我如何在
Java
中使用
VBO
s,或者即使
VBO
s是最好的选择?

谷歌搜索OpenGL VBO会得到有用的结果,比如这是我用Java测试VBO的代码。它使用JOGL而不是LWJGL,但这是一件小事

除了glVertexPointer,您还可以使用glTexCoordPointer和glNormalPointer为纹理坐标和法线指定数据,并使用glEnableClientState(GL.GL_纹理_坐标_数组)和glEnableClientState(GL.GL_法线_数组)启用它们


Jzy3d允许在基于JOGL的Java中轻松绘制VBO


这里我写了一篇文章,展示了如何创建VBO散点图。此散布基于通用的,可以扩展以设置自己的几何体/网格

我认为你的术语有些混乱。VAO是VBO和属性绑定状态的集合。它们根本不在代码中使用。您使用的VBOs的回退仅依赖于固定功能顶点处理,并在客户端内存中存储顶点数组(顶点数组只是数据的集合,当它们处于活动状态时存储在VBOs中)。我不知道有没有这个名字,但不是VAOs。作为旁注,所有固定函数处理,包括使用客户机内存作为属性位置的目标,在OpenGL 3+中都不推荐使用。@Bethor:感谢您指出这一点。我编辑了答案以删除这些错误信息。这是一个在JOGL中快速启动和运行VBO的非常好的示例。万分感谢!为什么不在网上搜索呢?我确信有很多关于VBOs的教程(甚至是Java)。你不会从一个简短的答案中学到太多东西,其中有几行示例代码没有解释任何东西。然后明天你会问,如何更改此代码以实现不同的效果。glBegin/glEnd immediate mode样式的命令比VBOs慢,但总体来说还是相当快-除非你真的在每帧绘制大量对象,否则你可能不会注意到差异。。。。。
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) {}
}