我为自己编写了一个小型实用程序类,其中包含用于在 OpenGL 中快速轻松地渲染线条、四边形、立方体等的有用方法。到目前为止,我一直在使用几乎完全即时的模式,所以我可以专注于学习 OpenGL 的其他方面。改用 VBO 似乎是谨慎的做法。但是,我想保留我一直在使用的大部分功能,例如我的实用程序类。有没有将这些简单的立即模式调用转换为通用 VBO 系统的好方法?
我正在使用 LWJGL。
我为自己编写了一个小型实用程序类,其中包含用于在 OpenGL 中快速轻松地渲染线条、四边形、立方体等的有用方法。到目前为止,我一直在使用几乎完全即时的模式,所以我可以专注于学习 OpenGL 的其他方面。改用 VBO 似乎是谨慎的做法。但是,我想保留我一直在使用的大部分功能,例如我的实用程序类。有没有将这些简单的立即模式调用转换为通用 VBO 系统的好方法?
我正在使用 LWJGL。
从 begin..end 块转换了我自己的代码并教了其他人,这是我推荐的。
我假设您的实用程序类主要是静态方法,从这一点到该点画一条线。
第一步是让每个单独的绘图操作为每个属性创建一个 VBO。将 glBegin..glEnd 块替换为为每个顶点属性创建数组(实际上是 ByteBuffer)的代码:坐标、颜色、tex 坐标等。在使用 glEnd 之后,使用 glBufferData 将 ByteBuffers 复制到 VBO。然后使用 glEnableClientState、glBindBuffer、glVertex|Color|whateverPointer 调用的块设置属性。调用 glDrawArrays 实际绘制一些东西,最后恢复客户端状态并删除 VBO。
现在,这不是好的 OpenGL 代码,而且非常低效和浪费。但它应该可以工作,编写起来相当简单,并且您可以一次更改一种方法。
如果你不需要画太多,现代 GPU 的速度非常快,你可能不会在意它的低效。
第二步是开始重用 VBO。让您的班级在初始化时或第一次使用时为每个可能的属性创建一个 VBO。绘图代码仍会创建 ByteBuffer 数据数组并将它们复制过来,但不会删除 VBO。
第三步,如果您想进入 OpenGL 4 并使用着色器,请将 glVertexPointer 替换为 glVertexAttribPointer(0,将 glColorPointer 替换为 glVertexAttribPointer(1 等。您还应该在初始化时创建一个顶点数组对象以及 VBO。 (您仍然需要单独启用/禁用属性指针,具体取决于每个绘制操作是否需要颜色、tex 坐标等)
最后一步,需要对程序的其他地方进行更改,将是使用 3D“对象”而不是方法。您的实用程序类将不再包含绘图方法。相反,您创建一个线、四边形或立方体对象并绘制它。这些对象中的每一个都(可能)有自己的 VBO。这是更多的工作,但在很多 3D 几何体在帧与帧之间没有变化的常见情况下确实会得到回报。但同样,您可以从更“浪费”的方法开始,将每个方法调用替换为从 P1 到 P2 画一条线,例如 l = new Line3D(P1, P2) ; l.draw()。
希望这可以帮助。