通过纹理id获取纹理目标

问题描述 投票:5回答:3

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

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

opengl
3个回答
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保持在一起。


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; }

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


0
投票

从OpenGL 4.5开始,这可以通过以下方式完成:

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

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

© www.soinside.com 2019 - 2024. All rights reserved.