OpenGL:纹理有存储空间吗?

OpenGL: does a texture have storage?

在OpenGL中,纹理名称生成后,纹理没有存储空间。使用 glTexImage2D,您可以为纹理创建存储空间。

如何确定纹理是否具有存储空间?

我相信你可以使用 glGetTexLevelParameterfv 来获取纹理的高度(或宽度)。这些参数中的任何一个的值为零意味着纹理名称表示空纹理。

注意我还没有测试过!

你不能在 ES 2.0 中完全做到这一点。在 ES 3.1 及更高版本中,您可以调用:

GLint width = 0;
glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &width);
if (width > 0) {
    // texture has storage
}

ES 2.0 中可用的 glIsTexture() 调用可能会根据您的具体要求为您提供所需的信息。虽然它不会告诉您纹理是否有存储空间,但它会告诉您给定的 id 是否有效,以及它是否曾被绑定为纹理。例如:

GLuint texId = 0;
GLboolean isTex = glIsTexture(texId);
// Result is GL_FALSE because texId is not a valid texture name.

glGenTextures(1, &texId);
isTex = glIsTexture(texId);
// Result is GL_FALSE because, while texId is a valid name, it was never
// bound yet, so the texture object has not been created.

glBindTexture(GL_TEXTURE_2D, texId);
glBindTexture(GL_TEXTURE_2D, 0);
isTex = glIsTexture(texId);
// Result is GL_TRUE because the texture object was created when the
// texture was previously bound.