gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-27 23:59:31 29 4
gpt4 key购买 nike

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

glBufferData(GL_ARRAY_BUFFER, sizeof(Vertex) * vertices.size(), &vertices[0], GL_STATIC_DRAW);

这里数据的参数是&vertices[0],它在调试期间只产生一个 xyz vector ,但是当整个对象被渲染时它肯定不能只有这个 vector 。

理智的做法是将整个 vector &vertices 传递到我的脑海中,不是吗?

也许我误解了 OpenGL 缓冲区的工作原理?

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

总结:为什么 &vertices[0] 而不是 &vertices

最佳答案

我假设 verticesstd::vector<Vertex> .既然是,那就意味着 &vertices类型为 std::vector<Vertex>* ,或指向 vector 的指针。

但是,OpenGL 不需要 vector 。 OpenGL 是为 C 编写的,它没有 vector 的概念。因此,它需要一个 C 风格的数组。 (如果您不确定那是什么,请参阅 here。)

根据 C++ 标准,一个 std::vector必须将其所有元素存储在连续存储器中。这意味着 vertices[1]必须在 vertices[0] 之后, vertices[2]vertices[1] 之后,等等。这本质上正是 C 风格的数组:指向一组连续项的指针。

如果vertices[0]是 vector 的第一个元素,然后是&vertices[0]是指向第一个元素的指针。就像我上面说的,所有元素都是连续存储的,所以 &vertices[0]实际上只是一个指向 C 风格数组的指针。

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

关于c++ - OpenGL glBufferData -> 为什么 &vertices[0] 而不是 &vertices 作为数据参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40248360/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com