glVertexAttribPointer调用中强制转换为void*是合法的C++吗

Is cast to void* in a glVertexAttribPointer call a legal C++?

本文关键字:C++ void 调用 转换 glVertexAttribPointer      更新时间:2023-10-16

这实际上是一个关于C++的问题,而不是OpenGL。我正在学习OpenGL教程(我刚刚开始(,作者使用C++(而不是C(。我的问题是glVertexAttribPointer将偏移量参数作为const void*。由于该参数只是简单地告诉OpenGL在使用glBufferData()复制的顶点数组中第一次出现给定顶点属性的位置,因此我希望它应该是std::ptrdiff_t类型。SO上的这篇文章解释了void*被用作参数类型的原因,但我想知道为什么这种用法在C++中是合法的。例如,上面提到的教程只是将偏移量的值以字节为单位强制转换为void*,就像下面的调用一样:

glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)(3* sizeof(float)));

在我看来,这种方法是不合法的,因为reinterpret_cast的cprefence文档中说

任何整数或枚举类型的值都可以转换为指针类型。转换为足够大小的整数并返回相同指针类型的指针保证具有其原始值,否则生成的指针无法安全地解引用(反向的往返转换不能保证相同指针可能具有多个整数表示(

因此,如果我正确理解这一点,偏移量的std::ptrdiff_t值(似乎就是这里需要的值(在转换为void*之后可能会丢失。我想念什么?

"不保证"并不意味着"保证失败";意思是"没有保证"。这意味着实现可能保留也可能不保留转换。

glVertexAttribPointerAPI需要C或C++的实现,该实现保留整数->指针->整数转换。就像它需要一个提供IEEE-754浮点类型以及8/16/32位整数的C或C++实现一样。