2

我有一个应该保留像素数据的类(浮动的位置,浮动的颜色)。我正在尝试在数据成员中使用 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]);

但是这种方法有两个问题:

  1. 我需要相信调用者已分配内存来存储 10 个浮点数
  2. 没有 C++11+ 签名,我只是得到一个浮点指针

我不能只返回 a std::unique_ptr,因为我需要一个连续的内存区域 ( buffer) 来存储元素,但我还需要区分不同的元素(这也会使代码更具可读性)。

最好返回一个智能指针或类似的东西,我可以轻松地将其内存“连接”到其他元素,这样我就可以安全地将这些东西传递给 OpenGL。

4

1 回答 1

2

CppCoreGuidelines介绍了span哪个是连续元素的视图,因此您可以使用以下内容:

void writeData(gsl::span<float, 10> ptrToMemory)

来表达意图。

于 2015-12-21T13:52:33.870 回答