我正在研究一些 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);
我在这里缺少什么?
最佳答案
上面显示的代码应该 有效。这不是很好,但它应该工作。这让我觉得你可能已经减少了在这里发布的例子?它可能不起作用的可能原因是:
- vector 是空的,所以 thisslice[0] 是一个解引用的尝试 NULL,并抛出异常(这就是为什么,如前所述 上面,你应该使用 .data() 来代替)。不过,这通常只会在 Debug模式下发生。
- 你实际中的 vector code 是一个 const ref,这意味着 thisslice[0] 返回一个 float (而不是 float &)。拿地址就是给你地址 一些临时对象,而不是 vector 中的数据。
作为旁注,重复调用 push_back 是初始化 std::vector 的可怕方式。预先分配大小,并使用 [] 运算符来分配元素。或者使用初始化列表、分配或采用开始和结束的构造函数。
另一方面,为什么要在每次 push_back 调用中将 float 转换为 float?
关于c++ - glBuffer 使用一种数据样式而不使用另一种样式,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56962342/