这实际上是一个关于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)));
Run Code Online (Sandbox Code Playgroud)
在我看来,这种方法不合法,因为cpprefence文档reinterpret_cast说
任何整型或枚举类型的值都可以转换为指针类型。转换为足够大小的整数并返回到相同指针类型的指针保证具有其原始值,否则无法安全地取消引用结果指针(不保证相反方向的往返转换,相同的指针可能具有多个整数表示)
因此,如果我正确理解这一点,std::ptrdiff_t偏移量的值(这似乎是这里需要的)在转换为void*. 我想念什么?
“不保证”并不意味着“保证失败”;意思是“不保证”。这意味着实现可能会也可能不会保留转换。
APIglVertexAttribPointer需要保留整数->指针->整数转换的 C 或 C++ 实现。就像它需要提供 IEEE-754 浮点类型以及 8/16/32 位整数的 C 或 C++ 实现一样。
| 归档时间: |
|
| 查看次数: |
591 次 |
| 最近记录: |