gpt4 book ai didi

c++ - 我可以避免在下面使用 offsetof 吗?

转载 作者:行者123 更新时间:2023-11-28 06:59:21 28 4
gpt4 key购买 nike

根据我的另一个问题,这是一个我想避免 offsetof 的具体示例。

为了与 glVertexAttribPointer 一起使用,我必须对最后一个参数使用 offsetof

 glVertexAttribPointer(GLKVertexAttribColor, 4, GL_FLOAT, GL_FALSE, sizeof(Vertex),
(const GLvoid *) offsetof(Vertex, _color));

顶点是一个类。有什么办法可以避免使用这个吗?我尝试使用指向成员的指针,但没有成功。

不能在下面编译

glVertexAttribPointer(GLKVertexAttribColor, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex),
(const GLvoid *)&Vertex::_color);

最佳答案

您无法获取限定为 Vertex::_color 的非静态成员的地址。您将需要 Vertex 的实例,但即便如此,返回的地址也将相对于程序的地址空间,这不是您使用 VBO 时想要的。

offsetof(...) 用于查找数据结构中元素的地址。这个地址并不指向实际内存,它实际上只是从结构开始的偏移量(这就是为什么它使用 size_t 而不是 intptr_t void *).

历史上,在 OpenGL 1.1 中引入顶点数组时,它在调用 glVertexPointer (...) 时使用数据指针来引用客户端(程序)内存。那时,您传递的地址实际上指向您程序中的内存。从顶点缓冲区对象 (GL 1.5) 开始,OpenGL 将 glVertexPointer (...) 中的指针参数重新用作指向服务器 (GPU) 内存的指针。如果在调用 glVertexPointer (...) 时绑定(bind)了一个非零 VBO,那么指针实际上是一个偏移量。

更准确地说,使用 VBO 时的指针是相对于绑定(bind) VBO 的数据存储的,并且 VBO 中的第一个数据从地址 0 开始。这就是为什么 offsetof (...) 在这种情况下有意义,并且没有理由避免使用它。

关于c++ - 我可以避免在下面使用 offsetof 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22726351/

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