将OpenGL立即模式渲染实用程序方法转换为使用VBO的最佳方法是什么?

时间:2014-02-02 06:05:53

标签: opengl lwjgl vertex-buffer utility-method immediate-mode

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

我正在使用LWJGL。

1 个答案:

答案 0 :(得分:1)

从begin..end块转换了我自己的代码并且还教了其他人,这是我推荐的。

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

第一步是让每个绘图操作为每个属性创建一个VBO。将glBegin..glEnd块替换为为每个顶点属性创建数组(实际上是ByteBuffer)的代码:坐标,颜色,tex coords等。在以前的glEnd之后,使用glBufferData将ByteBuffers复制到VBO。然后使用glEnableClientState,glBindBuffer,glVertex | Color | whateverPointer调用的块来设置属性。调用glDrawArrays实际绘制内容,最后恢复客户端状态并删除VBO。

现在,这不是一个好的OpenGL代码,而且非常低效且浪费。但它应该可以工作,编写起来相当简单,你可以一次改变一种方法。

如果你不需要画得太多,那么现代的GPU非常快,你可能不会觉得它效率低下。

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

第三步,如果你想进入OpenGL 4并使用着色器,可以用glVertexAttribPointer(0,glColorPointer和glVertexAttribPointer(1等)替换glVertexPointer。你还应该创建一个Vertex数组对象和VBO at初始时间。(您仍然需要根据每个绘制操作是否需要颜色,tex coords等单独启用/禁用attrib指针。)

最后一步,需要在程序的其他地方进行更改,将是3D“对象”而不是方法。您的实用程序类将不再包含绘图方法。而是创建一个线,四边形或立方体对象并绘制它。这些对象中的每一个(可能)都有自己的VBO。这是更多的工作,但是在很多3D几何体不会逐帧变化的常见情况下确实会得到回报。但同样,您可以从更“浪费”的方法开始,更换每个方法调用以从P1到P2绘制一条线,例如l = new Line3D(P1,P2); l.draw()。

希望这有帮助。