我已经在C++和OpenGL中编写了模型加载器。我已经使用std::vector来存储我的顶点数据,但是现在我想将其传递给glBufferData(),但是数据类型却大不相同。我想知道是否有一种方法可以在std::vectorconst GLvoid *的已记录glBufferData()之间进行转换。

顶点类型

typedef struct
{
    float x, y, z;
    float nx, ny, nz;
    float u, v;
}
Vertex;

vector<Vertex> vertices;

glBufferData()调用
glBufferData(GL_ARRAY_BUFFER, vertices.size() * 3 * sizeof(float), vertices, GL_STATIC_DRAW);

我收到以下(预期)错误:
error: cannot convert ‘std::vector<Vertex>’ to ‘const GLvoid*’ in argument passing

如何将 vector 转换为与glBufferData()兼容的类型?

注意我现在不在乎正确的内存分配。 vertices.size() * 3 * sizeof(float)很可能会出现段错误,但我想首先解决类型错误。

最佳答案

如果您有std::vector<T> v,则可以使用T*表达式获得一个&v[0],该Vertex*指向连续数据的开头(这是OpenGL之后的意思)。

在您的情况下,这意味着将glBufferData传递给Vertex*:

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

或像这样,这是相同的:
glBufferData(
   GL_ARRAY_BUFFER,
   vertices.size() * sizeof(Vertex),
   &vertices.front(),
   GL_STATIC_DRAW
);

您可以在此处依靠从void const*到ojit_code的隐式转换;那应该没有问题。

08-18 15:21