glBufferData第二个arg是GLsizeiptr而不是GLsizei,为什么?

时间:2014-11-05 13:14:04

标签: opengl

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

glBufferData https://www.opengl.org/sdk/docs/man/html/glBufferData.xhtml

上的OpenGL doc

1 个答案:

答案 0 :(得分:10)

当顶点缓冲区对象为introduced via the OpenGL extension mechanism时,会创建一个新类型GLsizeiptrARB,并提供以下基本原理:

  

应该< offset>的类型和< size>参数使用?

     

已解决:我们定义了可在64位上运行良好的新类型           系统,类似于C的“intptr_t”。新型“GLintptrARB”           只要预期,就应该用它代替GLint           价值可能会超过20亿。 新类型“GLsizeiptrARB”           应该在任何预期时用来代替GLsizei           计数可能超过20亿。两种类型都定义为           有符号整数,足以包含任何指针值。作为一个           结果,它们自然地扩展到系统上的大量位           使用64位甚至更大的指针。

     

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

     

考虑使这些类型无符号的想法,但是           最终以支持缓冲区扩大为由拒绝           超过2 GB在32位系统上并不重要。

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