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.
在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.