我已经在C++和OpenGL中编写了模型加载器。我已经使用std::vector
来存储我的顶点数据,但是现在我想将其传递给glBufferData()
,但是数据类型却大不相同。我想知道是否有一种方法可以在std::vector
和const 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的隐式转换;那应该没有问题。