gpt4 book ai didi

Java (LWJGL) - 在绘图之前/期间是否需要绑定(bind)特定的 VBO?

转载 作者:行者123 更新时间:2023-12-01 13:40:36 26 4
gpt4 key购买 nike

我正在尝试实现顶点缓冲区对象 (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的绑定(bind)和解除绑定(bind)。在渲染和绘制许多不同点云对象的场景中,我将绑定(bind)多个顶点缓冲区。这表明我必须明确告诉 openGL 在渲染过程中要使用哪个顶点缓冲区(如方法 drawVBOBound 中所示)。否则,openGL 将通过当前绘图对象来绘制每个绑定(bind)顶点缓冲区,这相当于程序的一个渲染/绘图周期内的多次绘图(没有人会希望这样)。这个假设正确吗?

最佳答案

您的两个代码变体缺少要点:顶点属性指针。

glDraw* 函数从不关心GL_ARRAY_BUFFER 绑定(bind)点当前绑定(bind)的内容。它关心的是顶点数组(对于 glDrawElements* 变体,当前绑定(bind)的 GL_ELEMENT_ARRAY_POINTER)。

您当前缺少的是,当您设置顶点 attrob 指针时,GL_ARRAY_BUFFER 绑定(bind)是相关的(在您的情况下可能通过 glVertexPointer)。在设置时绑定(bind)的 VBO 的引用将成为指针的一部分

因此,当您确实想要从不同的 VBO 进行绘制时,您必须重新指定 attrib 指针(为此,还需要重新绑定(bind) VBO)。请注意,现代 GL 使用 VAOs它封装了顶点数组状态并允许通过单个函数调用在不同的 VA 指针集之间进行切换。

附带说明:您也不需要一直启用和禁用这些 attrib 指针。只要您不打算在没有 GL_VERTEX 属性数组的情况下调用 glDraw*,就可以将其保留为打开状态。正如 Martijn Courteaux 已经指出的那样,它不会启用或禁用 VBO,它只是告诉 GL 数组要用于哪些属性,以及将使用当前值(对于绘图的所有顶点来说,该值将是常量)那就打电话吧)。

关于Java (LWJGL) - 在绘图之前/期间是否需要绑定(bind)特定的 VBO?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20824559/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com