我有一个应该保留像素数据的类(浮动的位置,浮动的颜色)。我正在尝试在数据成员中使用 C++ 样式(数据保存在std::array<float, N>
而不是普通的 C 数组中)。该类还有其他 getter、setter 和函数,旨在成为填充这些字段的“助手”。
现在我需要创建一个 OpenGL 顶点数据缓冲区,我应该在其中写出
4 floats for xyzw
4 floats for rgba
2 floats for UV coords
按照这个顺序。我想知道我该怎么做..我试着做
class MyVertexData {
std::array<float, 4> pos;
std::array<float, 4> rgba;
std::array<float, 2> uv;
public:
void writeData(float *ptrToMemory) {
if(ptrToMemory == nullptr)
throw std::runtime_exception("Null pointer");
std::array<float, 10> output;
output= {
pos[0], pos[1], pos[2], pos[3],
rgba[0], rgba[1], rgba[2], rgba[3],
uv[0], uv[1]
};
memcpy(memory, out.data(), 10 * sizeof(float));
}
};
// Caller code
std::vector<float[10]> buffer(4);
vertex0.writeElements(buffer[0]);
vertex1.writeElements(buffer[1]);
vertex2.writeElements(buffer[2]);
vertex3.writeElements(buffer[3]);
但是这种方法有两个问题:
- 我需要相信调用者已分配内存来存储 10 个浮点数
- 没有 C++11+ 签名,我只是得到一个浮点指针
我不能只返回 a std::unique_ptr
,因为我需要一个连续的内存区域 ( buffer
) 来存储元素,但我还需要区分不同的元素(这也会使代码更具可读性)。
最好返回一个智能指针或类似的东西,我可以轻松地将其内存“连接”到其他元素,这样我就可以安全地将这些东西传递给 OpenGL。