glGenBuffers
和glGenTextures
之间到底有什么区别?我注意到当我尝试生成纹理时,两者都可以正常工作:
int texture1 = GL30.glGenBuffers();
GL30.glBindTexture(GL30.GL_TEXTURE_2D,texture1);
int texture2 = GL30.glGenTextures();
GL30.glBindTexture(GL30.GL_TEXTURE_2D,texture2);
这两种方式对我来说似乎完全一样。与glGenTextures
相比,使用glGenBuffers
有什么优势吗?如果没有,为什么glGenTextures
甚至可以仅使用glGenBuffers
时存在呢?
答案 0 :(得分:2)
glGenTextures
和glGenBuffers
不会创建任何对象或缓冲区,它们只是将对象名称标记为已使用。这意味着它们保留对象名称。
尽管glGenTextures
保留纹理名称,glGenBuffers
保留缓冲区名称,但是glGenTextures
返回的名称可能与glGenBuffers
返回的名称相同。
glGenTextures
仅保证返回的名称不用于纹理。
glGenBuffers
确保不将返回的名称用于缓冲区。
请注意,缓冲区对象和纹理对象可能具有相同的值,但是有2个完全不同的对象。由glGenBuffers
返回的名称未标记为已用作(或保留)用作纹理对象,但已保留以用作缓冲对象。
OpenGL ES 3.2 Specification - 8.1 Texture Objects; page 140
命令
void GenTextures( sizei n, uint *textures );
在纹理中返回
n
先前未使用的纹理名称。这些名称仅出于GenTextures
的目的被标记为已使用,但是它们只有在第一次绑定时才具有纹理状态和维数,就像它们未使用一样。
OpenGL ES 3.2 Specification - 6 Buffer Objects; page 50
命令
void GenBuffers( sizei n, uint *buffers );
在缓冲区中返回
n
先前未使用的缓冲区对象名称。这些名称仅出于GenBuffers
的目的被标记为已使用,但是仅当它们首先与BindBuffer
绑定时(见下文),它们才获得缓冲区状态。他们没有被使用。
请注意,此处的OpenGL ES规范与(台式机)OpenGL核心配置文件规范不同。
在(台式机)OpenGL核心配置文件中,将值传递给glBindTexture
无效,而该值不是glGenTexture
返回的。
请参见OpenGL 4.6 API Core Profile Specification - 8.1 Texture Objects; page 180
通过调用来实现绑定
void BindTexture( enum target, uint texture );
[...]
错误
[...]
如果纹理不为零或先前调用INVALID_OPERATION
返回的名称,或者此名称已被删除,则会生成GenTextures
错误。