首页 > 解决方案 > glBuffer 使用一种数据风格,但不能使用另一种风格的数据,为什么?

问题描述

我正在研究一些 OpenGL 教程示例并对其进行修改以满足我的项目目标。

问题是程序使用这个数据结构(即它画了一个三角形)

    float firstTriangle[] = {
        -0.9f, -0.5f, 0.0f,  // left
        -0.0f, -0.5f, 0.0f,  // right
        -0.45f, 0.5f, 0.0f,  // top
    };

    glBufferData(GL_ARRAY_BUFFER, sizeof(firstTriangle), firstTriangle, GL_STATIC_DRAW);

但是当我进行以下更改时它不会绘制三角形:

    std::vector<float> thisslice;
    thisslice.push_back((float) -0.9f);
    thisslice.push_back((float) -0.5f);
    thisslice.push_back((float) 0.0f);
    thisslice.push_back((float) 0.0f);
    thisslice.push_back((float) -0.5f);
    thisslice.push_back((float) 0.0f);
    thisslice.push_back((float) -0.45f);
    thisslice.push_back((float) -0.5f);
    thisslice.push_back((float) 0.0f);

    glBufferData(GL_ARRAY_BUFFER, thisslice.size() * sizeof(float), &thisslice[0], GL_STATIC_DRAW);

我在这里缺少什么?

标签: c++opengl

解决方案


上面提供的代码应该可以工作。这不是很好,但它应该工作。这让我觉得你可能已经减少了在这里发布的例子?它可能不起作用的可能原因是:

  • 向量为空,因此 thisslice[0] 尝试取消引用 NULL,并引发异常(这就是为什么,如上所述,您应该使用 .data() 代替)。不过,这通常只发生在调试模式下。
  • 实际代码中的向量是一个 const ref,这意味着 thisslice[0] 返回一个浮点数(而不是浮点数&)。获取地址只是给你一些临时对象的地址,而不是向量中的数据。

附带说明一下,重复调用 push_back 是初始化 std::vector 的一种可怕方式。预先分配大小,并使用 [] 运算符分配元素。或者使用初始化列表、分配或接受 begin 和 end 的 ctor。

作为另一个方面说明,为什么在每个 push_back 调用中将浮点数转换为浮点数?


推荐阅读