将OpenGL即时模式渲染实用程序方法转换为使用VBOs的最佳方法?

将OpenGL即时模式渲染实用程序方法转换为使用VBOs的最佳方法?,opengl,lwjgl,vertex-buffer,utility-method,immediate-mode,Opengl,Lwjgl,Vertex Buffer,Utility Method,Immediate Mode,我为自己编写了一个小实用程序类,其中包含了在OpenGL中快速、轻松地渲染线条、四边形、立方体等的有用方法。到目前为止,我几乎完全使用即时模式,所以我可以专注于学习OpenGL的其他方面。转向使用VBOs似乎是明智的。但是,我希望保留我一直使用的大部分功能,例如我的实用程序类。有没有一种好方法可以将这些简单的即时模式调用转换为多功能VBO系统 我正在使用LWJGL。我已经从begin..end块转换了自己的代码,还教过其他人,这是我的建议 我假设您的实用程序类主要是静态方法,从这一点到那一点画一

我为自己编写了一个小实用程序类,其中包含了在OpenGL中快速、轻松地渲染线条、四边形、立方体等的有用方法。到目前为止,我几乎完全使用即时模式,所以我可以专注于学习OpenGL的其他方面。转向使用VBOs似乎是明智的。但是,我希望保留我一直使用的大部分功能,例如我的实用程序类。有没有一种好方法可以将这些简单的即时模式调用转换为多功能VBO系统


我正在使用LWJGL。

我已经从begin..end块转换了自己的代码,还教过其他人,这是我的建议

我假设您的实用程序类主要是静态方法,从这一点到那一点画一条线

第一步是让每个单独的绘图操作为每个属性创建一个VBO。使用为每个顶点属性(坐标、颜色、tex坐标等)创建数组(实际上是字节缓冲区)的代码替换glBegin..glEnd块。在使用GLBEGIND后,使用glBufferData将字节缓冲区复制到VBOs。然后使用glEnableClientState、glBindBuffer、glVertex | Color | whateverPointer调用的块设置属性。调用glDrawArrays来实际绘制一些东西,最后恢复客户端状态并删除VBO

现在,这不是一个好的OpenGL代码,而且效率低下,浪费严重。但它应该可以工作,编写起来相当简单,并且您可以一次更改一个方法

如果你不需要画很多,那么现代GPU是如此之快,也许你不会在意它的效率

第二步是开始重新使用VBO。让您的类在初始化或首次使用时为每个可能的属性创建一个VBO。图形代码仍然会创建ByteBuffer数据数组并将其复制,但不会删除VBO

第三步,如果您想进入OpenGL 4并使用着色器,将使用glVertexAttribPointer(0)替换glVertexPointer(0),使用glVertexAttribPointer(1)替换glColorPointer(1,等等)。您还应该在初始化时与VBO一起创建顶点数组对象。(根据每个绘制操作是否需要颜色、tex坐标等,您仍然需要单独启用/禁用attrib指针。)

最后一步,需要对程序的其他地方进行更改,将是使用3D“对象”而不是方法。实用程序类将不再包含绘图方法。而是创建一个直线、四边形或立方体对象并绘制该对象。这些对象中的每一个(可能)都会拥有自己的VBO。这需要更多的工作,但在通常情况下,当许多3D几何体在帧之间没有变化时,这确实是值得的。但同样,您可以从更“浪费”的方法开始,用类似l=new Line3D(P1,P2);l.draw()的内容替换从P1到P2的每个方法调用来绘制一条线


希望这能有所帮助。

这太刺耳了,无法作为答案发布,但我真的认为这就是答案。转换这类代码的最佳方法是使用VBOs进行设计。如果使用任何其他较差的方法,您将拥有(相对而言)一个需要维护的怪物。根据您想要得到的复杂程度,您可以在VBO中使用<50行代码重用立即模式命令流。
glBegin(…)
是一件非常简单的事情,它有一些允许在内部使用的命令。