如何用texels确定OpenGL纹理的大小?

时间:2010-01-08 10:44:30

标签: opengl textures

我知道这是一个微不足道的问题,但从glGet()的文档开始,我还没有找到任何似乎有帮助的信息。我正在使用我的纹理作为精灵,因此以纹素/像素跟踪它们的大小至关重要。

当我使用glTexImage2D()创建纹理时,我需要将像素数据数组的大小传递给它。但OpenGL是将它存储在任何地方,还是我必须在我的代码中跟踪它们? (这感觉很尴尬,因为客户端代码仍然能够使用glTexImage2D() / glTexSubImage2D() / glCopyTexImage2D()等来覆盖纹理,而不会相应地改变大小,从而导致视觉扭曲。 )

2 个答案:

答案 0 :(得分:6)

正如Bahbar所说,glGetTexLevelParameteri可用于查询GL_TEXTURE_WIDTH。但是,我强烈建议不要将此作为一般方法。首先,你可以通过glGet*调用来停止管道,因为驱动程序必须让GPU完成它正在做的事情,弄清楚你的问题并返回答案。结果是一个巨大的性能损失。

所以你最好在你自己的代码中管理这样的状态。大概你有一个Sprite类(或结构或等价物),带有纹理句柄。没有什么可以专门用几个字节来跟踪宽度和高度,它可以让你不必点击驱动程序或GPU来获取信息。

至于glTeSubImage*,这是关于何时以及如何更新纹理的政策决定。

答案 1 :(得分:5)

如果您真的想依赖GL,请使用

glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &param)

也就是说,我不确定客户端代码在您的上下文中意味着什么,但是如果您希望编写允许客户直接操作您自己的状态的中间件,那么您就遇到了麻烦。