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

时间:2014-03-29 02:43:14

标签: c++ opengl-es glkit

在我提出另一个问题之后,这是一个我想避免offsetof的具体例子。

要与glVertexAttribPointer一起使用,我必须使用offsetof作为最后一个参数。

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

Vertex是一个类。有没有办法可以避免使用这个?我尝试用指针指向成员,但没有运气。

无法在以下

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

1 个答案:

答案 0 :(得分:1)

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

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

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

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