首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >OpenGL glBufferData ->为什么是&vertices[0]而不是&顶点作为数据参数?

OpenGL glBufferData ->为什么是&vertices[0]而不是&顶点作为数据参数?
EN

Stack Overflow用户
提问于 2016-10-25 19:41:02
回答 1查看 422关注 0票数 0

你好,我很难弄清楚为什么传递GLfloat位置数组(xyz)的第一个元素突然给缓冲区提供了该数组的所有元素。

代码语言:javascript
运行
复制
glBufferData(GL_ARRAY_BUFFER, sizeof(Vertex) * vertices.size(), &vertices[0], GL_STATIC_DRAW);

在这里,数据的参数是&顶点,在调试期间只生成一个xyz向量,但是当整个对象呈现时,它肯定不能只有这个向量。

明智的做法是把整个向量&顶点传递给我,不是吗?

也许我误解了OpenGL缓冲区是如何工作的?

我一直在关注这里的教程:http://learnopengl.com/#!Model-Loading/Mesh

总结:为什么和顶点而不是&顶点

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-25 19:45:29

我假设verticesstd::vector<Vertex>。因此,这意味着&verticesstd::vector<Vertex>*类型的,或者是指向向量的指针。

然而,OpenGL不需要向量。OpenGL是为C编写的,它没有向量的概念。因此,它需要一个C样式的数组.(如果您不确定这是什么,请参见这里。)

根据C++标准,std::vector必须将其所有元素存储在连续内存中。这意味着vertices[1]必须紧跟在vertices[0]之后,vertices[2]必须紧随vertices[1]之后,等等。这实际上就是C样式数组的本质:指向一组连续项的指针。

如果vertices[0]是向量的第一个元素,那么&vertices[0]就是指向第一个元素的指针。正如我前面所说的,所有元素都是连续存储的,所以&vertices[0]实际上只是一个指向C样式数组的指针。

在C++11中,您可以使用vertices.data(),这在本质上是一样的,但是更干净。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40248360

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档