Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何确定OpenGL纹理';它的尺码是多少?_Opengl_Textures - Fatal编程技术网

如何确定OpenGL纹理';它的尺码是多少?

如何确定OpenGL纹理';它的尺码是多少?,opengl,textures,Opengl,Textures,我知道这是一个非常琐碎的问题,但从glGet()的文档开始,我还没有找到任何似乎有用的信息。我使用我的纹理作为精灵,所以我必须以texel/像素来跟踪它们的大小 当我使用glTexImage2D()创建纹理时,需要将像素数据数组的大小传递给它。但是OpenGL是否将其存储在任何地方,或者我是否必须在代码中跟踪它们?(这感觉很尴尬,因为客户端代码仍然能够使用glTexImage2D()/glTexSubImage2D()/glCopyTexImage2D()等调用覆盖纹理,同时不相应地更改大小,从

我知道这是一个非常琐碎的问题,但从
glGet()
的文档开始,我还没有找到任何似乎有用的信息。我使用我的纹理作为精灵,所以我必须以texel/像素来跟踪它们的大小


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

如果您确实想依赖GL,请使用

glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &param)

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

正如Bahbar所说,
glGetTexLevelParameteri
可以用于查询
GL\u纹理\u宽度。但是,我强烈建议不要将此作为一般方法。首先,您可以通过
glGet*
调用暂停管道,因为驱动程序必须让GPU完成它正在做的事情,找出您提出的问题,然后返回答案。其结果是巨大的性能打击

因此,在您自己的代码中管理这样的状态确实更好。假设您有一个带有纹理句柄的
Sprite
类(或struct或等效类)。不需要再花几个字节来跟踪宽度和高度,它可以让您不必点击驱动程序或GPU来获取信息


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

虽然GET理论上可以冲洗管道,但我严重怀疑您是否会发现最近的实际冲洗实现。现在,大多数驱动程序都在客户端存储绝大多数状态。我可以看到,纹理的维度这样简单的东西是如何在客户端缓存的,但其他
glGet*
查询可能取决于要回答的内容。可以说,将纹理元数据保留在对象中是更好的设计(直接访问数据成员比调用驱动程序更快)。不管怎么说,我读过的书几乎都在谈论会导致拖延。您是否有任何关于哪些驱动程序缓存哪些状态信息的引用?那会很方便的。谢谢,这完全有道理。我的冲突就在这一点上,为我的框架编写功能意味着客户端不会支持它。我猜想,到目前为止,这些细节都已记录在案,如果客户希望使用框架并提供所需的功能,他们就不会(感觉他们)绕开框架。是的,最好自己预订状态阴影。然而,需要管道冲洗的GET恰恰是您无法跟踪自己的GET。这就是为什么他们需要同花顺。我没有公开的参考资料,但话说回来,测试也不难。在管道中放置一个很长的操作,调用一个Get,看看需要多长时间。我应该补充一点,倾向于大的状态(例如纹理数据)是一个例外。这些很少缓存在客户端。我想得到纹理的高度和宽度,或者加载到纹理中的位图x,y点。请检查这个问题,并让我知道你是否可以帮助那里。