glBindTextures
是一个很好的函数,不仅因为它在一个调用中绑定了多个纹理,还因为它知道如何将每个纹理绑定到“创建对象时指定的目标”。这样,我只能在创建纹理时指定目标,然后忘记它,这在一般代码中很有帮助。
不幸的是,在调用像glGetTexParamater
这样的函数时,我必须知道目标。是否有方法从纹理id中检索纹理目标?得到广泛支持的扩展也是可以的。
发布于 2014-10-06 14:05:45
由于OpenGL 4.5可以通过以下方法来完成:
GLenum target;
glGetTextureParameteriv(textureId, GL_TEXTURE_TARGET, (GLint*)&target);
同样,自从在OpenGL 4.5中引入直接状态访问API (DSA)之后,了解纹理的目标就变得不那么有用了。
发布于 2014-08-09 22:21:46
据我所知,没有。
一个可能的解决方法是查询应用程序使用的每个纹理目标的当前绑定,并将当前纹理与您的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就更容易了。
发布于 2014-08-09 23:21:26
即使在查看了规范中的状态表之后,也没有一种很好的方法可以做到这一点。两种可能性都远没有吸引力:
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;}glBindTextures()
将纹理绑定到给定的纹理单元,然后查询绑定到该单元的各个目标的纹理:
glBindTextures(texUnit,1,& texId);glActiveTexture(GL_TEXTURE0 + texUnit);GLuint boundId = 0;glGetIntegerv(GL_TEXTURE_BINDING_1D &boundId);if (boundId == texId) {返回GL_TEXTURE_1D;但我认为,如果你只是简单地存储哪个目标是用于每一个纹理,当你第一次创建它,你会更快乐。
https://stackoverflow.com/questions/25221481
复制相似问题