在我提出另一个问题之后,这是一个我想避免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);
答案 0 :(得分: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 (...)
在这种情况下有意义的原因,并且没有理由避免使用它。