Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl 通过纹理id获取纹理目标_Opengl - Fatal编程技术网

Opengl 通过纹理id获取纹理目标

Opengl 通过纹理id获取纹理目标,opengl,Opengl,glBindTextures是一个不错的函数,不仅因为它在一次调用中绑定了多个纹理,还因为它知道将每个纹理绑定到“创建对象时指定的目标[…]”。这样,我可以只在纹理创建时指定目标,然后忘记它,这在通用代码中很有帮助 不幸的是,在调用函数(如glgettexparameter)时,我必须知道目标。是否有方法从纹理id检索纹理目标?广泛支持的扩展也可以。据我所知,没有 一种可能的解决方法是查询应用程序使用的每个纹理目标的当前绑定,并将当前纹理与您拥有的id进行比较 GLuint currentTex

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


不幸的是,在调用函数(如
glgettexparameter
)时,我必须知道目标。是否有方法从纹理id检索纹理目标?广泛支持的扩展也可以。

据我所知,没有

一种可能的解决方法是查询应用程序使用的每个纹理目标的当前绑定,并将当前纹理与您拥有的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一起保留。

即使在查看了规范中的状态表之后,我也找不到一个很好的方法来实现这一点。两种可能性都远没有吸引力:

  • 尝试将其绑定到各种目标,然后查看是否出现
    GL\u INVALID\u操作
    错误:

    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;
    }
    ...
    
  • 这与@glampert的建议类似。使用
    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;
    }
    

  • 但我认为,如果您在第一次创建纹理时只存储每个纹理使用的目标,您会更高兴。

    由于OpenGL 4.5,这可以通过以下方式完成:

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

    同样,自从OpenGL 4.5中引入了直接状态访问API(DSA)之后,了解纹理的目标就没有那么有用了。

    我很确定这在纯OpenGL中是不可能的,我相信,在应用程序级别上存储目标是一种常见的做法。我必须定义目标为“代码> GLITET <代码>,以便在C++中编译。