developer.aliyun.com/article/117…
从缓存对象中回读数据
void glGetBufferSubData( GLenum target , GLintptr offset , GLsizeiptr size , void * data ) ; 复制代码
返回当前绑定到target的缓存对象中的部分或者全部数据。
根据硬件的配置,其实也可以通过获取一个指针的形式,直接在应用程序中对OpenGL管理的内存进行访问。当然,获取这个指针的对应函数就是glMapBuffer()。
void* glMapBuffer(GLenum target, GLenum access);
将指定缓冲区对象的整个数据存储映射到客户端的地址空间。
然后,可以根据指定的访问策略,相对于返回的指针直接读取和/或写入数据。
一旦对该缓冲区对象的所有操作完成,将返回指向映射范围开头的指针,
并可用于根据访问值修改和/或查询数据存储的相应范围:
如果发生错误,将返回nulll,
返回的指针值,不能作为GL命令的参数,比如,不能用于指定数组指针,或者指定、查询像素、图片纹理数据,这样做会产生意外的结果,因为性能的考虑,GL并不会检查这种错误的操作行为。
如果访问返回的指针的方式与 指定的访问access 不一样,是不会产生错误的 比如读取映射的权限为GL_WRITE_ONLY,而写入映射的权限为GL_READ_ONLY
但是结果是不确定的,可能会发生系统错误,甚至中止程序。
缓冲对象映射的数据可能不是标准的性能特征。例如,这类映射可能被标记为不可缓存的内存,这种情况下,读取这些数据会非常的慢。 为了确保最佳的性能,客户端应该以
错误码
标题 | |
GL_INVALID_OPERATION(0x502) | 缓冲对象在映射状态 |
`` is generated if the buffer object is in a mapped state.