Opengl glBufferData第二个参数是GLsizeiptr而不是GLsizei,为什么?

Opengl glBufferData第二个参数是GLsizeiptr而不是GLsizei,为什么?,opengl,Opengl,基本上就是这样,为什么glBufferData使用指针而不是int?这个arg应该是缓冲区对象的大小,那么为什么不使用GLsizei呢 glBufferData上的OpenGL文档创建顶点缓冲区对象时,创建了一个新类型GLsizeiptrARB,并提供了以下基本原理: 应该使用什么类型和参数 已解决:我们定义了在64位上运行良好的新类型 系统,类似于C的“intptr\t”。新型“GLintptrARB” 应在以下情况下使用,以代替闪烁: 价值可能超过20亿新类型“GLsizeiptrARB”

基本上就是这样,为什么glBufferData使用指针而不是int?这个arg应该是缓冲区对象的大小,那么为什么不使用GLsizei呢


glBufferData上的OpenGL文档

创建顶点缓冲区对象时,创建了一个新类型
GLsizeiptrARB
,并提供了以下基本原理:

应该使用什么类型和参数

已解决:我们定义了在64位上运行良好的新类型 系统,类似于C的“intptr\t”。新型“GLintptrARB” 应在以下情况下使用,以代替闪烁: 价值可能超过20亿新类型“GLsizeiptrARB” 应在需要时替代GLsizei 这一数字可能超过20亿。这两种类型都定义为 大到足以包含任何指针值的有符号整数。作为一个 结果,它们自然地扩展到系统上更大数量的位 使用64位甚至更大的指针

此扩展中引入的偏移量类型为GLintptrARB, 与必须为非负的其他总账参数一致, 但本质上是算术的(不是uint),不是大小;对于 例如,TexSubImage*D的xoffset参数的类型为GLint。 缓冲区大小键入GLsizeiptrARB

考虑了使这些类型不带符号的想法,但没有成功 最终被拒绝,理由是支持缓冲区更大 超过2GB在32位系统上并不重要


当此扩展被接受到核心OpenGL中时,该类型的扩展兼容类型
GLsizeiptrARB
获得了一个标准化名称
GLsizeiptr
,您今天可以在函数签名中看到它。

它不是指针。这是一个与指针大小相同的整数类型。@BenVoigt:这是一个答案,不是注释:)@datenwolf:不,我没有解释为什么这个整数比那个整数更可取。@BenVoigt:因为OpenGL GLsizei是32位的。为了适应具有更大地址空间的系统,必须引入一种新类型,这种类型与这种情况下的指针大小相匹配。@DatenWalf:这是我的猜测,但我没有任何证据支持它。是否有一些规范或扩展规范处理大于4GB(或大于2GB,如果签名)?我认为一个好的答案应该参考这样的规范。这些类型的签名太可笑了。