【问题标题】:OpenGL glBufferData -> Why &vertices[0] instead of &vertices as data parameter?OpenGL glBufferData -> 为什么用 &vertices[0] 而不是 &vertices 作为数据参数?
【发布时间】:2016-10-25 19:41:02
【问题描述】:

您好,我无法弄清楚为什么传递 GLfloat 位置 (xyz) 数组的第一个元素会突然给缓冲区提供该数组的所有元素。

glBufferData(GL_ARRAY_BUFFER, sizeof(Vertex) * vertices.size(), &vertices[0], GL_STATIC_DRAW);

这里 data 的参数是 &vertices[0] ,在调试过程中只有一个 xyz 向量,但是当整个对象被渲染时,它肯定不能只有这个向量。

明智的做法是将整个向量 &vertices 传递到我的脑海中,不是吗?

也许我对 OpenGL 缓冲区的工作方式有误解?

我一直在关注这里的教程:http://learnopengl.com/#!Model-Loading/Mesh

总结一下:为什么用 &vertices[0] 而不是 &vertices

【问题讨论】:

  • 如果你使用 C++11,vertices.data()&vertices[0] 更清晰。

标签: c++ opengl


【解决方案1】:

我假设verticesstd::vector<Vertex>。既然是,这意味着&verticesstd::vector<Vertex>* 类型,或者是指向向量的指针。

但是,OpenGL 不需要矢量。 OpenGL 是为 C 语言编写的,它没有向量的概念。因此,它需要一个 C 样式的数组。 (如果您不确定那是什么,请参阅here。)

根据 C++ 标准,std::vector 必须将其所有元素存储在连续内存中。这意味着vertices[1] 必须紧跟在vertices[0] 之后,vertices[2]vertices[1] 之后,等等。这本质上正是 C 风格的数组:指向一组连续项的指针。

如果vertices[0] 是向量的第一个元素,那么&vertices[0] 是指向第一个元素的指针。就像我上面说的,所有元素都是连续存储的,所以&vertices[0]实际上只是一个指向C风格数组的指针。

在 C++11 中,您可以改为使用 vertices.data(),这本质上是相同的,但更简洁。

【讨论】:

  • 解释得很好,也感谢您提出 vertices.data() 的建议,看起来更干净:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多