glBindTextures
是一个很好的函数,不仅因为它在一次调用中绑定多个纹理,还因为它知道将每个纹理绑定到“创建对象时指定的目标[...] ”。这样我只能在纹理创建时指定目标,然后忘记它,这有助于通用代码。
不幸的是,我必须在调用glGetTexParamater
等函数时知道目标。有没有办法从纹理ID中检索纹理目标?广泛支持的扩展也可以。
答案 0 :(得分:4)
据我所知,没有。
可能的解决方法是查询应用程序使用的每个纹理目标的当前绑定,并将当前纹理与您拥有的ID进行比较。
GLuint currentTex;
glGetIntegerv(GL_TEXTURE_BINDING_1D, ¤tTex);
if (currentTex == testTex)
{
target = GL_TEXTURE_1D;
return;
}
glGetIntegerv(GL_TEXTURE_BINDING_2D, ¤tTex);
if (currentTex == testTex)
{
target = GL_TEXTURE_2D;
return
}
// and so on ...
当然,你必须有一个纹理绑定才能工作。如果与glBindTexture
绑定,则无论如何都需要目标。
但是这个解决方案是如此笨拙且不可扩展,通常更容易将额外的int
与纹理目标的id保持在一起。
答案 1 :(得分:2)
即使在查看规范中的状态表之后,我也找不到这种方法。两种可能性都很不具吸引力:
尝试将其绑定到各种目标,看看是否收到GL_INVALID_OPERATION
错误:
glBindTexture(GL_TEXTURE_1D, texId);
if (glGetError() != GL_INVALID_OPERATION) {
return GL_TEXTURE_1D;
}
glBindTexture(GL_TEXTURE_2D, texId);
if (glGetError() != GL_INVALID_OPERATION) {
return GL_TEXTURE_2D;
}
...
这与@glamplert建议的类似。使用glBindTextures()
将纹理绑定到给定的纹理单元,然后查询绑定到该单元的各个目标的纹理:
glBindTextures(texUnit, 1, &texId);
glActiveTexture(GL_TEXTURE0 + texUnit);
GLuint boundId = 0;
glGetIntegerv(GL_TEXTURE_BINDING_1D, &boundId);
if (boundId == texId) {
return GL_TEXTURE_1D;
}
glGetIntegerv(GL_TEXTURE_BINDING_2D, &boundId);
if (boundId == texId) {
return GL_TEXTURE_2D;
}
但我认为如果您在第一次创建时只存储每个纹理使用哪个目标,您会更高兴。
答案 2 :(得分:0)
自OpenGL 4.5起,这可以通过以下方式完成:
GLenum target;
glGetTextureParameteriv(textureId, GL_TEXTURE_TARGET, &target);
自从在OpenGL 4.5中引入直接状态访问API(DSA)以来,知道纹理的目标变得不那么有用了。