【问题标题】:Can I avoid using offsetof in the following?我可以避免在下面使用 offsetof 吗?
【发布时间】:2014-03-29 02:43:13
【问题描述】:

在我提出另一个问题之后,这是一个我想避免使用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);

【问题讨论】:

  • 为什么还要避开offsetof?
  • 这是一个纯 C 特性,我认为 C++ 应该有更好的东西
  • 这没有意义。 offsetof 是在 C++ 规范中指定的,因此与其他所有内容一样是“C++”功能。
  • 这只是一个宏,我想看看ono-macro解决方案。有人说offsetof可以完全绕过,我想看看这个具体的例子能不能做到。
  • 这是一个标准宏。所以肯定可以绕过。您可以执行宏所做的相同操作。它通常涉及丑陋的 NULL 指针类型转换,尽管现代编译器通常为此提供内置函数。这里没有任何收获。

标签: c++ opengl-es glkit


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-18
    • 1970-01-01
    • 2010-10-01
    • 2021-10-08
    • 1970-01-01
    • 2022-01-08
    • 2011-04-06
    相关资源
    最近更新 更多