我有兴趣获得纹理的最大硬件支持分辨率。
据我所知,有两种与此相关的机制:
glGetIntegerv(GL_MAX_TEXTURE_SIZE,&dim)
2D(和立方体?)纹理对我有用。对于3D纹理,我发现(艰难的)你需要使用GL_MAX_3D_TEXTURE_SIZE
。据我所知,这些返回一侧的最大分辨率,其他边假设是相同的。
目前还不清楚这些值实际代表什么。根据文档,glGetIntegerv(...)
返回的值将被视为"粗略估计" s,但不清楚它们是否是保守的低估,最佳猜测或最佳情况。此外,还不清楚这些是硬件限制还是基于可用图形内存量的当前限制。
文档反而建议使用。 。
GL_PROXY_TEXTURE_(1|2|3)D
/ GL_PROXY_TEXTURE_CUBE_MAP
。这里的想法是你在制作真正的代理纹理之前制作代理纹理。然后,通过检查它获得的实际尺寸来检查代理纹理是否正常。对于3D纹理,它看起来像:
glGetTexLevelParameteriv(GL_PROXY_TEXTURE_3D, 0, GL_TEXTURE_WIDTH, &width);
glGetTexLevelParameteriv(GL_PROXY_TEXTURE_3D, 0, GL_TEXTURE_HEIGHT, &height);
glGetTexLevelParameteriv(GL_PROXY_TEXTURE_3D, 0, GL_TEXTURE_DEPTH, &depth);
如果一切顺利,那么返回的尺寸将为非零(并且可能与您请求的尺寸相同)。然后删除代理并使纹理变为真实。
因此,对于现代OpenGL(GL 4. *很好),获得1D,2D,3D和立方体纹理的最大硬件支持分辨率的最佳方法是什么?
答案 0 :(得分:0)
glGetIntegerv()
和GL_MAX_TEXTURE_SIZE
GL_MAX_3D_TEXTURE_SIZE
返回的值是特定实施的正确限制。
目前还不清楚这些值实际代表什么。价值 由glGetIntegerv(...)返回的内容将被视为"粗略估计" s, 根据文件,但不清楚它们是否存在 保守低估,最佳猜测或最佳案例。
您指的是哪种文件? GL规范非常清楚这些值的含义,它们不是任何类型的估计值。
代理方法也应该有效,但不直接允许您查询限制。您可以使用二进制搜索通过代理纹理路径缩小精确限制,但这只是一种相当笨拙的方法。
答案 1 :(得分:0)
立方体贴图有一个单独的值,可以使用GL_MAX_CUBE_MAP_TEXTURE_SIZE
进行查询。所以限制是:
GL_MAX_TEXTURE_SIZE
:GL_TEXTURE_1D
和GL_TEXTURE_2D
的最大尺寸。GL_MAX_RECTANGLE_TEXTURE_SIZE
:GL_TEXTURE_RECTANGLE
的最大尺寸。GL_MAX_CUBE_MAP_TEXTURE_SIZE
:GL_TEXTURE_CUBE_MAP
的最大尺寸。GL_MAX_3D_TEXTURE_SIZE
:GL_TEXTURE_3D
的最大尺寸。您在手册页上找到的“粗略估计”语言似乎很不幸。如果您查看更相关的规范文档,它会讨论“允许的最大宽度和高度”,或者只是说使用大于这些限制的大小是错误的。
这些限制代表硬件支持的最大尺寸。或者更准确地说,是广告的硬件限制。只要一致地应用广告限制,硬件限制低于硬件实际支持的限制当然是合法的。想象硬件只能管理/采样到给定大小的纹理,这是这些限制报告的大小。
这些限制与可用内存量无有关,因此保持在这些限制内绝对不能保证可以成功分配大小的纹理。
我相信代理纹理的意图是让你检查实际分配的大小。我不知道它是否可以在任何平台上可靠地运行。这种机制确实不适合现代GPU管理内存的方式。但我从未使用代理纹理,或处理实现它们。我当然希望平台/供应商对它们的运行方式存在重大依赖。因此,如果他们在您关注的平台上为您提供所需的结果,您应该尝试。