当我看到OpenGL规范时,我发现了一些奇怪的东西。
以下是glMapBufferRange()和glMapNamedBufferRange()的原型:
void *glMapBufferRange( GLenum target,
GLintptr offset,
GLsizeiptr length,
GLbitfield access);
void *glMapNamedBufferRange( GLuint buffer,
GLintptr offset,
GLsizei length,
GLbitfield access);
对于length参数,glMapNamedBufferRange()使用GLsizei类型,它是32位整数,而glMapBufferRange()使用GLsizeiptr,其大小为> = sizeof(void *)。
根据规范,使用glMapNamedBufferRange()无法映射很长的缓冲区,因为GLsizei只有32位整数。
另一方面,glMapbufferRange()可以映射64位平台的所有地址范围。
为什么只有glMapNamedBufferRange()有这样的限制,即使它的目的与glNamedBufferRange()非常相似?
编辑:
我发现了类似的案例。实际上,当非命名版本使用GLsizeptr时,许多命名缓冲区计数器部分都使用GLsizei。
为什么命名版本缓冲区函数有这样的限制?
答案 0 :(得分:4)
您在看什么版本的规格? OpenGL specification version 4.6 (pdf)(以及associated gl.xml
file)明确表示glMapNamedBufferRange
需要GLsizeiptr
。
您可能正在查看the man pages,有时可能会出现错误like this。如果你看到像这样奇怪的东西,请务必先检查实际规格。