glGenBuffers和glGenTextures

时间:2019-02-20 18:59:21

标签: opengl lwjgl

glGenBuffersglGenTextures之间到底有什么区别?我注意到当我尝试生成纹理时,两者都可以正常工作:

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时存在呢?

1 个答案:

答案 0 :(得分:2)

glGenTexturesglGenBuffers不会创建任何对象或缓冲区,它们只是将对象名称标记为已使用。这意味着它们保留对象名称。
尽管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错误。