【问题标题】:C++ OpenGL array of coordinates to draw lines/borders and filled rectangles?C++ OpenGL坐标数组来绘制线条/边框和填充矩形?
【发布时间】:2014-03-03 02:16:39
【问题描述】:

我正在为我在 OpenGL 上的应用程序开发一个简单的 GUI,我所需要的只是绘制一堆矩形和一个 1px 的边框围绕它们。而不是为每个必须绘制的小部件使用 glBegin 和 glEnd(这会降低性能)。我需要知道这是否可以通过坐标及其颜色的某种数组/列表(批处理数据)来完成。

要求:

  • 矩形是简单地为每个角或每个角用一种颜色填充一种颜色。 (主要是形成渐变)
  • 线条/边框很简单,只有一种颜色和 1px 厚,但它们可能并不总是闭合的(不会形成循环)。
  • 不包括使用纹理/图像。仅限几何数据。
  • 必须与旧 OpenGL 版本兼容(低至 1.3 版)

有没有办法通过某种数组而不是 glBegin 和 glEnd 来实现这一点?我不确定如何为线条/边框执行此操作。

我在 Gwen GUI 中看到过这种实现,但它使用纹理。

示例:jQuery EasyUI Metro Theme

【问题讨论】:

  • 您可能会查看顶点缓冲区对象。这就是你所说的批量绘图类型。虽然如果你在 gui 中绘制几个矩形的速度太慢,我会感到惊讶,即使它是立即模式。
  • 谢谢 :) 现在我正在研究 glVertexPointer()、glPolygonMode() 和 glColorPointer() 看看是否可以解决任何问题。但我猜 glBegin 和 glEnd 仍然是首选。 GUI 元素有些动态,VBO 可能不是 v.oddou 的回答所暗示的最佳解决方案。

标签: c++ arrays opengl


【解决方案1】:

在任何情况下,在现代 OpenGL 中,您都应该限制使用像 glBegin 之类的老式 API 调用。您应该使用 OpenGL 3.0 的核心上下文引入的更纯粹的方法。它背后的理念是更接近现代硬件功能的实际方式。 DiretX10 采用了这种方法,不知何故 OpenGL ES 也是。

这意味着不再有列表,不再有立即模式,不再有 glVertex 或 glTexCoord。无论如何,驱动程序已经在这个 API 后面构建了 VBO,因为硬件只能理解这一点。所以 OpenGL 核心“倡议”是为了降低 OpenGL 实现的复杂性,让供应商专注于硬件,停止生产带有 bug 支持的坏驱动。

考虑到这一点,您应该使用 VBO,因此您制作交错或多个分离的缓冲区数据来存储位置和颜色信息,然后绑定到属性并使用着色器组合来渲染整体。您在顶点着色器中声明的属性是您使用glBindVertexBuffer 绑定的属性。

这里有很好的解释:
http://www.opengl.org/wiki/Vertex_Specification

推荐的方法是为整个 GUI 制作一个顶点缓冲区,每个元素应该一个接一个地放入缓冲区中,然后您可以在一次绘制调用中渲染整个 GUI。这样才能获得最佳性能。

然后,如果您的 GUI 具有动态元素,则不再可能使用 glUpdateBufferSubData 或类似的元素,但它具有复杂的性能影响。您最好将顶点缓冲区切割成组成独立部分所需的尽可能多的缓冲区,然后您可以在每次绘制调用之间随意修改uniforms 进行渲染,以配置动态部分所需的外观变化。

【讨论】:

  • 谢谢 :) 但我正在努力使其与旧硬件兼容。尽管我很想从最新的 OpenGL 的功能中受益。我已经更新了答案以指定这一点。
猜你喜欢
  • 2012-08-04
  • 1970-01-01
  • 2011-04-21
  • 2012-11-12
  • 2014-10-14
  • 1970-01-01
  • 2014-01-27
  • 1970-01-01
  • 2016-05-21
相关资源
最近更新 更多