【问题标题】:Vertex Array for VBO -OpenGLVBO的顶点数组-OpenGL
【发布时间】:2023-03-05 06:53:01
【问题描述】:

我有一个包含坐标的数组。它看起来像:

    glm::vec3* Vertices;

如何将其元素传递给 glVertexAttribPointer。唯一的方法是一维数组吗?例如;我可以使用类似的东西吗:

    float* Vertices[3];

【问题讨论】:

  • 这是一个由 3 个float* 组成的数组......这不起作用。你想要的是一个足够大的数组来容纳 3 个顶点(绘制 1 个三角形),每个 3 floats 的长度......所以就像:float Vertices [9]; 但是,老实说,glm::vec3 可能可以用作一个连续的内存块,大多数这类类都是。因此,glm::vec3 本身的数组可能就足够了。

标签: c++ opengl vertex-buffer


【解决方案1】:

在阅读我的答案之前:显然我的答案只是部分正确,您可以使用 glVertexAttribPointer 而无需手动写入 GRAM 而是使用客户端内存,但仍然最好使用 VBO 而不是使用这种方法。

你没有把东西传递给glVertexAttribPointer。在将缓冲区与glBindBuffer 绑定后,您必须首先使用glBufferData 将其写入GRAM。 glVertexAttribPointer 将仅描述在此绑定缓冲区中的何处可以找到数据。这一点表明您可以将几乎任何您希望的数据传递给 GRAM。如果你有你的 vec3 数组(我假设 vec3 只包含浮点数 x、y 和 z),你的这个数组的内存将看起来像 x1, y1, z1, x2, y2, z2, x3, y3, z3 等等。如果将其写入您的 GRAM,您将必须指定此数据,以便您的 GPU 知道该做什么。示例:

glBindBuffer(GL_ARRAY_BUFFER, bufferID); 

bufferID 必须在 (glGenBuffers) 之前分配。

glBufferData(GL_ARRAY_BUFFER, 36, vertices, GL_STATIC_DRAW); 

写入绑定在 GL_ARRAY_BUFFER 中的缓冲区(使用 glBindBuffer)。写入 36 字节(浮点数 = 4 字节,1 个只有位置的顶点 = 3 个浮点数,1 个三角形 = 3 个顶点,1 个三角形的总和为 36 个字节) GL_STATIC_DRAW 表示我们将写入一次,然后只绘制它。

glVertexPointer(3, GL_FLOAT, 0, 0)
  • 每个顶点有 3 个坐标 (size)
  • 它们是浮点数 (GL_FLOAT, type)
  • 缓冲区 sizeof(float) * 3 中的整个数据集的长度为 12 字节,并且因为您在这里只使用单个指针,所以当您传递 0(元素 * 类型大小)时,它可以为自己计算步幅 (@987654333 @)
  • 它们从缓冲区的开头开始 (0, offset)

为了简单起见,我在这里使用了 glVertexPointer。

您可以在 LWJGL Wiki 中找到关于 VBO 的非常好的教程

http://www.lwjgl.org/wiki/index.php?title=Using_Vertex_Buffer_Objects_%28VBO%29

【讨论】:

  • 这不一定是真的,您肯定必须在核心配置文件上下文中使用 VBO,但在兼容性方面,您实际上可以让 glVertexAttribPointer (...) 指向客户端内存。将客户端内存用于顶点数据的主要缺点是 GL 要么必须在执行 glDrawArrays (...) 命令之前复制整个数组,要么强制管道同步,以便在命令运行时无法更改数据。这就是为什么 VBO 提供更好的性能并且是 现代(核心)GL 中的唯一选择。
  • 那是我实际上不知道的事情。在答案中为您的评论添加提示。
  • 对不起,我并不是要暗示您必须更改答案中的任何主要内容。困扰我的是你必须使用 VBO 的声明。这都是非常好的建议,VBO 是可行的方法,但它们并不总是必需的。另外,glm 是一个 C++ 模板库(虽然问题没有被标记为这样,我现在会解决这个问题),所以 LWJGL 可能不是最好的参考。
  • stride 并不是说​​“它们之间有多少个元素”,而是必须在指针上添加多少字节才能获取下一个元素,其中0 是一个特殊值,意思是size*sizeof(type)
  • 这其实是我的意思,只是忘了说0是特例,但我现在编辑了。
猜你喜欢
  • 2012-05-27
  • 2012-08-08
  • 2021-03-05
  • 1970-01-01
  • 2011-07-29
  • 1970-01-01
  • 2011-10-25
  • 1970-01-01
  • 2020-08-09
相关资源
最近更新 更多