为什么 glMapNamedBufferRange() 使用 GLsizei 作为长度?

Why does glMapNamedBufferRange() use GLsizei for length?

当我看到 OpenGL 规范时,我发现了一些奇怪的东西。

这里是 glMapBufferRange() 和 glMapNamedBufferRange() 的原型:

void *glMapBufferRange( GLenum target,
    GLintptr offset,
    GLsizeiptr length,
    GLbitfield access);

void *glMapNamedBufferRange(    GLuint buffer,
    GLintptr offset,
    GLsizei length,
    GLbitfield access);

对于长度参数,glMapNamedBufferRange()使用GLsizei类型,32位整数,而glMapBufferRange()使用GLsizeiptr,其大小>= sizeof(void*)。

根据规范,不可能使用 glMapNamedBufferRange() 映射很长范围的缓冲区,因为 GLsizei 只是 32 位整数。

另一方面,glMapbufferRange() 可以映射 64 位平台中的所有地址范围。

为什么只有 glMapNamedBufferRange() 有这样的限制,尽管它的目的与 glNamedBufferRange() 非常相似?

编辑:

我发现了类似的情况。事实上,当非命名版本使用 GLsizeptr 时,许多命名缓冲区计数器部分使用 GLsizei。

为什么命名版本缓冲函数有这样的限制?

您正在查看哪个版本的规范? OpenGL specification version 4.6 (pdf) (and the associated gl.xml file) 清楚地表明 glMapNamedBufferRange 需要 GLsizeiptr.

您可能正在查看 the man pages, which can sometimes have errors like this。如果您看到类似这样的奇怪内容,请务必先检查实际规格。