如何指定从第三方库获取的OpenGL ES纹理的目标类型?
OpenGL ES 第三方纹理目标类型的确定方法
核心方案:根据OpenGL ES版本选择查询方式
1. OpenGL ES 3.1+(推荐)
直接使用glGetTextureParameteriv查询纹理对象的目标类型,无需提前绑定:
GLuint tex = static_cast<GLuint>(reinterpret_cast<uintptr_t>(a)); GLenum target; glGetTextureParameteriv(tex, GL_TEXTURE_TARGET, reinterpret_cast<GLint*>(&target)); // 根据查询结果绑定 glBindTexture(target, tex);
这个API直接从纹理对象本身读取创建时指定的目标类型,是最准确的方式,前提是设备支持OpenGL ES 3.1或GL_OES_texture_storage扩展。
2. OpenGL ES 3.0及以下版本
由于低版本不支持直接查询纹理对象参数,只能尝试绑定可能的目标并验证:
GLuint tex = static_cast<GLuint>(reinterpret_cast<uintptr_t>(a)); // 先尝试2D纹理 glBindTexture(GL_TEXTURE_2D, tex); GLint width, height; glGetTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_WIDTH, &width); glGetTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_HEIGHT, &height); if (width > 0 && height > 0) { // 验证通过,是GL_TEXTURE_2D } else { // 解绑后尝试2D数组纹理 glBindTexture(GL_TEXTURE_2D, 0); glBindTexture(GL_TEXTURE_2D_ARRAY, tex); GLint layerCount; glGetTexParameteriv(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_LAYER_COUNT, &layerCount); if (layerCount > 0) { // 验证通过,是GL_TEXTURE_2D_ARRAY } else { // 两种类型都不匹配,需处理错误 } }
这种方式依赖纹理已被正确初始化,第三方库返回的有效纹理通常能通过参数验证区分类型。
额外建议
优先查看第三方库的文档或联系开发者获取纹理目标信息,这是最可靠的方式——上述方法仅作为文档缺失时的应急方案。
内容的提问来源于stack exchange,提问作者Nh Xu
相关产品推荐
相关产品推荐

