2010-01-08 72 views
2

我知道这是一个微不足道的问题,但我从glGet()的文档中找不到任何似乎有用的信息。我使用我的纹理作为精灵,所以我必须跟踪他们的尺寸为texels /像素。如何确定texels中的OpenGL纹理大小?

当我使用glTexImage2D()创建纹理时,我需要将像素数据数组的大小传递给它。但是OpenGL将它存储在任何地方,还是必须在我的代码中跟踪它们? (这种感觉别扭,因为客户端代码将仍然能够与glTexImage2D()/glTexSubImage2D()/glCopyTexImage2D()等电话覆盖的纹理,而没有相应地改变尺寸,从而造成视觉失真。)

回答

6

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

所以,你真的更适合在自己的代码中管理像这样的状态。据推测,你有一个Sprite类(或结构或等效),与纹理句柄。没有什么可以用更多的字节来记录宽度和高度,并且它可以帮助您避免碰到驱动程序或GPU来获取信息。

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

+0

虽然理论上可以冲洗管道,但我认真地怀疑你会发现最近的实现,实际上冲洗。现在大多数司机都在存储绝大多数国家客户端。 – Bahbar 2010-01-08 13:27:59

+0

我可以看到纹理的尺寸可以像客户端缓存那样简单,但其他的'glGet *'查询可能取决于要渲染的内容来回答。可以说,将纹理元数据保存在对象中的设计(更快地直接访问数据成员而不是调用驱动程序)是更好的设计。无论如何,几乎所有我读过的书籍都会导致拖延。你有哪些驱动程序缓存哪些状态信息的引用?这将非常方便。 – gavinb 2010-01-09 01:18:16

+0

谢谢 - 它完全有道理。我的冲突就在这里,我的框架的编写功能意味着客户端不会落后于它。我猜测,到目前为止,这些细节都被记录下来,所以期望如果客户想要使用框架并提供所需功能,他们不会((觉得他们)必须)绕开它。 – zyndor 2010-01-09 07:23:26

5

如果你真的想依靠GL,使用

glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &param) 

这就是说,我不知道代码的含义在上下文是什么客户,但如果你希望写中间件让您的客户直接操纵自己的状态,你在麻烦。

+0

我想获得纹理的高度和宽度或者加载到纹理中的位图x,y点。请检查这个问题,让我知道你是否可以在那里帮忙。 http://stackoverflow.com/questions/32601187/how-to-save-bitmap-from-glsurfaceview-only-bitmap-not-whole-texture – 2015-10-08 12:55:08