c++ - 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);
我在这里缺少什么?
解决方案
上面提供的代码应该可以工作。这不是很好,但它应该工作。这让我觉得你可能已经减少了在这里发布的例子?它可能不起作用的可能原因是:
- 向量为空,因此 thisslice[0] 尝试取消引用 NULL,并引发异常(这就是为什么,如上所述,您应该使用 .data() 代替)。不过,这通常只发生在调试模式下。
- 实际代码中的向量是一个 const ref,这意味着 thisslice[0] 返回一个浮点数(而不是浮点数&)。获取地址只是给你一些临时对象的地址,而不是向量中的数据。
附带说明一下,重复调用 push_back 是初始化 std::vector 的一种可怕方式。预先分配大小,并使用 [] 运算符分配元素。或者使用初始化列表、分配或接受 begin 和 end 的 ctor。
作为另一个方面说明,为什么在每个 push_back 调用中将浮点数转换为浮点数?
推荐阅读
- javascript - 通过调用 REST 服务初始化全局变量 AngularJS 的问题
- javascript - 使用 array.reduce() 进行复杂的嵌套分组
- javascript - 如果我有一个键,则从 n 对象数组中获取一个对象
- amazon-web-services - CloudFormation:删除整个嵌套堆栈
- java - 当我使用带有继承的构造函数时出错
- python - 用于自定义 Python 设置以运行测试的 Docker 容器
- html - CSS:让类包含来自其他类的定义
- bash - 无法在 Bash 脚本的 cURL 命令中使用 PAT 访问 Azure DevOps API
- cypress - 使用 Cypress 存根“new Date()”
- c# - Unity如何从磁盘加载位图?