通过纹理id获取纹理目标

时间:2014-08-09 17:55:59

标签: opengl

glBindTextures是一个很好的函数,不仅因为它在一次调用中绑定多个纹理,还因为它知道将每个纹理绑定到“创建对象时指定的目标[...] ”。这样我只能在纹理创建时指定目标,然后忘记它,这有助于通用代码。

不幸的是,我必须在调用glGetTexParamater等函数时知道目标。有没有办法从纹理ID中检索纹理目标?广泛支持的扩展也可以。

3 个答案:

答案 0 :(得分:4)

据我所知,没有。

可能的解决方法是查询应用程序使用的每个纹理目标的当前绑定,并将当前纹理与您拥有的ID进行比较。

GLuint currentTex;

glGetIntegerv(GL_TEXTURE_BINDING_1D, &currentTex);
if (currentTex == testTex)
{
    target = GL_TEXTURE_1D;
    return;
}

glGetIntegerv(GL_TEXTURE_BINDING_2D, &currentTex);
if (currentTex == testTex)
{
    target = GL_TEXTURE_2D;
    return
}

// and so on ...

当然,你必须有一个纹理绑定才能工作。如果与glBindTexture绑定,则无论如何都需要目标。

但是这个解决方案是如此笨拙且不可扩展,通常更容易将额外的int与纹理目标的id保持在一起。

答案 1 :(得分:2)

即使在查看规范中的状态表之后,我也找不到这种方法。两种可能性都很不具吸引力:

  1. 尝试将其绑定到各种目标,看看是否收到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;
    }
    ...
    
  2. 这与@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;
    }
    
  3. 但我认为如果您在第一次创建时只存储每个纹理使用哪个目标,您会更高兴。

答案 2 :(得分:0)

自OpenGL 4.5起,这可以通过以下方式完成:

GLenum target;
glGetTextureParameteriv(textureId, GL_TEXTURE_TARGET, &target);

自从在OpenGL 4.5中引入直接状态访问API(DSA)以来,知道纹理的目标变得不那么有用了。