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

zyn*_*dor 2 opengl textures

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

当我创建纹理时,glTexImage2D()我需要将像素数据数组的大小传递给它.但OpenGL是将它存储在任何地方,还是我必须在我的代码中跟踪它们?(这感觉别扭,因为客户机代码仍然能够覆盖与所述纹理glTexImage2D()/ glTexSubImage2D()/ glCopyTexImage2D()等未通话时相应的变化的大小,从而导致视觉失真.)

gav*_*inb 6

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

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

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


Bah*_*bar 5

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

glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &param)
Run Code Online (Sandbox Code Playgroud)

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