如何解决OpenGL Java VBO
| 我正在使用LWJGL
,并使用glBegin/glEnd
绘制多维数据集,但是我听说这种方法效率很低,应该开始使用VBO。我不知道那是怎么回事。
我想绘制不同大小和位置(不旋转)的立方体,我想为此使用use2ѭs。
谁能给我一些示例代码或关于如何将ѭ2与ѭ4结合使用的见解,甚至ѭ2是最佳选择?
解决方法
这是我编写的用于使用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.5f,0};
vertices = BufferUtil.newFloatBuffer(vertexArray.length);
vertices.put(vertexArray);
vertices.flip();
short[] indexArray = {0,1,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);
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) {}
}
, 谷歌搜索OpenGL VBO会给出类似这样的有用结果
, Jzy3d允许在基于JOGL的Java中轻松绘制VBO。
这是我编写的示例,显示了如何创建VBO散点图。此散布基于通用的DrawableVBO,可以将其扩展以设置您自己的几何形状/网格。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。