首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >通过纹理id获取纹理目标

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

Stack Overflow用户
提问于 2014-08-09 17:55:59
回答 3查看 3.4K关注 0票数 6

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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-10-06 14:05:45

由于OpenGL 4.5可以通过以下方法来完成:

代码语言:javascript
运行
复制
GLenum target;
glGetTextureParameteriv(textureId, GL_TEXTURE_TARGET, (GLint*)&target);

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

票数 3
EN

Stack Overflow用户

发布于 2014-08-09 22:21:46

据我所知,没有。

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

代码语言:javascript
运行
复制
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就更容易了。

票数 4
EN

Stack Overflow用户

发布于 2014-08-09 23:21:26

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

  1. 尝试将其绑定到各个目标,并查看是否有GL_INVALID_OPERATION错误: glBindTexture(GL_TEXTURE_1D,texId);if (glGetError() != GL_INVALID_OPERATION) {返回GL_TEXTURE_1D;} glBindTexture(GL_TEXTURE_2D,texId);if (glGetError() = GL_INVALID_OPERATION) {返回GL_TEXTURE_2D;}
  2. 这和格普利特的建议很相似。使用glBindTextures()将纹理绑定到给定的纹理单元,然后查询绑定到该单元的各个目标的纹理: glBindTextures(texUnit,1,& texId);glActiveTexture(GL_TEXTURE0 + texUnit);GLuint boundId = 0;glGetIntegerv(GL_TEXTURE_BINDING_1D &boundId);if (boundId == texId) {返回GL_TEXTURE_1D;

但我认为,如果你只是简单地存储哪个目标是用于每一个纹理,当你第一次创建它,你会更快乐。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25221481

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档