VBOs with std::vector(带有 std::vector 的 VBO)
问题描述
我用 C++ 和 OpenGL 编写了一个模型加载器.我已经使用 std::vectors 来存储我的顶点数据,但现在我想将它传递给 glBufferData(),但是数据类型却大不相同.我想知道是否有办法在 std::vector 和 glBufferData() 的文档const GLvoid * 之间进行转换.
I've written a model loader in C++ an OpenGL. I've used std::vectors to store my vertex data, but now I want to pass it to glBufferData(), however the data types are wildly different. I want to know if there's a way to convert between std::vector to the documented const GLvoid * for 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);
我收到以下(预期的)错误:
I get the following (expected) error:
error: cannot convert ‘std::vector<Vertex>’ to ‘const GLvoid*’ in argument passing
如何将向量转换为与 glBufferData() 兼容的类型?
How can I convert the vector to a type compatible with glBufferData()?
注意.我现在不在乎正确的内存分配;vertices.size() * 3 * sizeof(float) 很可能会出现段错误,但我想先解决类型错误.
NB. I don't care about correct memory allocation at the moment; vertices.size() * 3 * sizeof(float) will most likely segfault, but I want to solve the type error first.
推荐答案
如果你有一个 std::vector,你可以获得一个 T* 指向连续数据的开始(这是 OpenGL 所追求的),表达式 &v[0].
If you have a std::vector<T> v, you may obtain a T* pointing to the start of the contiguous data (which is what OpenGL is after) with the expression &v[0].
就您而言,这意味着将 Vertex* 传递给 glBufferData:
In your case, this means passing a Vertex* to glBufferData:
glBufferData(
GL_ARRAY_BUFFER,
vertices.size() * sizeof(Vertex),
&vertices[0],
GL_STATIC_DRAW
);
或者像这样,这是一样的:
Or like this, which is the same:
glBufferData(
GL_ARRAY_BUFFER,
vertices.size() * sizeof(Vertex),
&vertices.front(),
GL_STATIC_DRAW
);
<小时>
您可以在此处依赖从 Vertex* 到 void const* 的隐式转换;这应该不会造成问题.
You can rely on implicit conversion from Vertex* to void const* here; that should not pose a problem.
这篇关于带有 std::vector 的 VBO的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:带有 std::vector 的 VBO
基础教程推荐
- 如何在 C++ 中初始化静态常量成员? 2022-01-01
- 如何检查GTK+3.0中的小部件类型? 2022-11-30
- 如何将 std::pair 的排序 std::list 转换为 std::map 2022-01-01
- 静态库、静态链接动态库和动态链接动态库的 .lib 文件里面是什么? 2021-01-01
- C++结构和函数声明。为什么它不能编译? 2022-11-07
- 如何通过C程序打开命令提示符Cmd 2022-12-09
- 在 C++ 中计算滚动/移动平均值 2021-01-01
- 常量变量在标题中不起作用 2021-01-01
- 我有静态或动态 boost 库吗? 2021-01-01
- 这个宏可以转换成函数吗? 2022-01-01
