我正在为OpenGL上的应用程序开发一个简单的GUI,我只需要绘制一堆矩形和一个1px边框。而不是使用glBegin和glEnd为每个必须绘制的小部件(可以降低性能)。我需要知道是否可以使用某种坐标的数组/列表(批量数据)及其颜色来完成。
要求:
有没有办法用某种数组来实现这个,而不是glBegin和glEnd?我不知道如何为行/边框执行此操作。
我在Gwen GUI中看到过这种实现,但它使用纹理。
答案 0 :(得分:1)
在现代OpenGL的任何情况下,你都应该限制使用像glBegin这样的老式API调用。您应该使用从OpenGL 3.0的核心上下文引入的更纯粹的方法。它背后的哲学是更接近现代硬件功能的实际方式。 DiretX10采用了这种方法,不过OpenGL ES也是如此。
这意味着没有更多的列表,没有更多的立即模式,没有更多的glVertex或glTexCoord。无论如何,驱动程序已经在这个API背后构建了VBO,因为硬件只能理解这一点。因此,OpenGL核心“计划”是为了降低OpenGL实现的复杂性,以便让供应商专注于硬件并停止生成带有错误支持的坏驱动程序。
考虑到这一点,您应该使用VBO,因此您可以创建交错或多个分隔的缓冲区数据来存储位置和颜色信息,然后绑定到属性并使用着色器组合来渲染整体。您在顶点着色器中声明的属性是使用glBindVertexBuffer
绑定的属性。
这里有很好的解释:
http://www.opengl.org/wiki/Vertex_Specification
然后推荐的方法是为整个GUI创建一个顶点缓冲区,并且每个元素应该一个接一个地放在缓冲区中,然后您可以在一个绘制调用中渲染整个GUI。这就是您获得最佳表现的方式。
然后,如果您的GUI具有动态元素,那么如果使用glUpdateBufferSubData
或类似内容,则不再可能执行此操作,但它具有复杂的性能影响。最好在组成独立部分所需的多个缓冲区中剪切顶点缓冲区,然后可以在每次绘制调用之间修改uniforms
进行渲染,以配置动态所需的外观更改一部分。