【发布时间】:2013-12-29 11:15:05
【问题描述】:
我正在尝试实现顶点缓冲区对象 (VBO),作为通过轻量级 Java 游戏库 (LWJGL) 使用 openGL 进行 3D 渲染的一种方式。我的特定程序允许每个具有图形表示的对象在屏幕上呈现和绘制自身。我的问题不在于这种渲染管理在什么情况下是否是一个好主意。我对LWJGL本身的绘制过程比较感兴趣。我准备了简单的绘制方法,比如说点云:
public void drawVBO(){
// enable Vertex Arrays (VBOs)
glEnableClientState(GL_VERTEX_ARRAY);
// tell OpenGL to draw the data supplied by the pointer method
// as points.length amount of points
glDrawArrays(GL_POINTS, 0, points.length);
// otherwise use GL_LINES, GL_TRIANGLES, GL_QUADS, etc.
// (http://wiki.delphigl.com/index.php/glDrawArrays)
// Disable Vertex Arrays (VBOs)
glDisableClientState(GL_VERTEX_ARRAY);
}
public void drawVBOBound(){
// enable Vertex Arrays (VBOs)
glEnableClientState(GL_VERTEX_ARRAY);
// tell OpenGL to use our VBO
glBindBuffer(GL_ARRAY_BUFFER, vertexBufferObject);
// tell OpenGL to draw the data supplied by the pointer method
// as points.length amount of points
glDrawArrays(GL_POINTS, 0, points.length);
// otherwise use GL_LINES, GL_TRIANGLES, GL_QUADS, etc.
// (http://wiki.delphigl.com/index.php/glDrawArrays)
// Unbind the VBO
glBindBuffer(GL_ARRAY_BUFFER, 0);
// Disable Vertex Arrays (VBOs)
glDisableClientState(GL_VERTEX_ARRAY);
}
它们之间的区别在于对象自身 VBO 的绑定和解除绑定。在我渲染和绘制大量不同点云对象的场景中,我将绑定多个顶点缓冲区。这表明我必须明确告诉 openGL 在渲染过程中使用哪个顶点缓冲区(如方法drawVBOBound 所示)。否则,openGL 将通过当前绘图对象绘制每个绑定的顶点缓冲区,该对象在程序的一个渲染/绘图周期内等于多个绘图(没有人会想要这样)。这个假设正确吗?
【问题讨论】:
-
是的,如果你只有一个 VBO,那么一直绑定它就足够了。尽管正如您所说,如果您有多个 VBO,则需要绑定它们,因为一次只能绑定一个 VBO。
标签: java opengl bind lwjgl vbo