glbufferdata与指针c ++矢量

时间:2014-02-06 19:12:23

标签: c++ pointers opengl vector

在c ++和openGL4中我可以做这样的事情

std::vector<Vertex> vertices;

其中Vertex是一个保存相关每个顶点数据的类。

this->vertices.pushback(Vertex())
....define the rest of the vertices and set position and color data etc

//Opengl code
glBindBuffer(GL_ARRAY_BUFFER, this->vboID[0]);
glBufferData(GL_ARRAY_BUFFER, ( this->vertices.size() * sizeof(Vertex) ) , this->vertices.data(), GL_STATIC_DRAW);
glVertexAttribPointer((GLuint)0, 4, GL_FLOAT, GL_FALSE, sizeof(Vertex), (GLvoid *)0); // Set up our vertex attributes pointer
glEnableVertexAttribArray(0);

这很好用,并显示我正在呈现的内容。现在,如果我尝试制作矢量

std::vector<Vertex*> vertices;
this->vertices.push_back(new Vertex());
....

然后我要显示的形状永远不会显示出来。

我的问题是因为我使用指针表示数据不再是连续的,因此opengl无法读取顶点数据,或者是否可以改变openGL代码以接受指针向量?

3 个答案:

答案 0 :(得分:2)

嗯,当然。在第一个版本中,您将实际的Vertex实例作为字节缓冲区传递给OpenGL。在第二个版本中,您将指向Vertex实例的指针传递给OpenGL,Op​​enGL不会为您取消引用这些指针。

你需要使用第一个版本,没有办法将你的Vertices指针传递给OpenGL。

答案 1 :(得分:2)

OpenGL需要原始顶点数据。它没有关于缓冲时数据格式化方式的概念。这是一个愚蠢的缓冲区。 OpenGL不可能接受指针向量 - 即使它确实如此,它仍然需要提取顶点并将它们放入一个连续的数组中以实现最佳布局并发送到图形硬件

您正在做的是将一堆原始数据发送到图形硬件,每个glVertexAttribPointer将被解释为顶点。想象一下,它正在幕后做一个reinterpret_cast - 它现在正在解释一些(比方说,32位积分)指针,好像它们应该是4,32位浮点值的集合。

我怀疑你选择制作一个顶点指针矢量而不是一个顶点数组,因为插入矢量时会产生开销?您应该通过调用reserveresize来预先调整向量大小,以更合适的方式调整,以便只支付一次重新分配费用。

答案 2 :(得分:1)

如果您关心可移植性,请不要使用std::vector <...>::data (...)。在旧版本的C ++中不存在这种情况。从C ++ 03开始,&std::vector <...> [0]保证返回表示存储在向量中的第一个元素的连续数据块的地址。它在此之前就已经很久了,但这是第一次绝对保证这种行为。

但是你的基本问题是GL在获取数据时不会取消引用存储在向量中的指针。毕竟,这就是你的矢量存储的东西。您需要向量来存储实际数据,而不是数据指针列表。