在OpenGL中可移植且正确地获得最大1D / 2D / 3D /立方体纹理分辨率

时间:2014-10-16 17:50:10

标签: opengl textures

我有兴趣获得纹理的最大硬件支持分辨率。

据我所知,有两种与此相关的机制:

  1. glGetIntegerv(GL_MAX_TEXTURE_SIZE,&dim) 2D(和立方体?)纹理对我有用。对于3D纹理,我发现(艰难的)你需要使用GL_MAX_3D_TEXTURE_SIZE。据我所知,这些返回一侧的最大分辨率,其他边假设是相同的。

    目前还不清楚这些值实际代表什么。根据文档,glGetIntegerv(...)返回的值将被视为"粗略估计" s,但不清楚它们是否是保守的低估,最佳猜测或最佳情况。此外,还不清楚这些是硬件限制还是基于可用图形内存量的当前限制。

    文档反而建议使用。 。

  2. 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);
    

    如果一切顺利,那么返回的尺寸将为非零(并且可能与您请求的尺寸相同)。然后删除代理并使纹理变为真实。

    某些older sources声明代理纹理会给出完全错误的答案,但今天可能不是这样。

  3. 因此,对于现代OpenGL(GL 4. *很好),获得1D,2D,3D和立方体纹理的最大硬件支持分辨率的最佳方法是什么?

2 个答案:

答案 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_SIZEGL_TEXTURE_1DGL_TEXTURE_2D的最大尺寸。
  • GL_MAX_RECTANGLE_TEXTURE_SIZEGL_TEXTURE_RECTANGLE的最大尺寸。
  • GL_MAX_CUBE_MAP_TEXTURE_SIZEGL_TEXTURE_CUBE_MAP的最大尺寸。
  • GL_MAX_3D_TEXTURE_SIZEGL_TEXTURE_3D的最大尺寸。

您在手册页上找到的“粗略估计”语言似乎很不幸。如果您查看更相关的规范文档,它会讨论“允许的最大宽度和高度”,或者只是说使用大于这些限制的大小是错误的。

这些限制代表硬件支持的最大尺寸。或者更准确地说,是广告的硬件限制。只要一致地应用广告限制,硬件限制低于硬件实际支持的限制当然是合法的。想象硬件只能管理/采样到给定大小的纹理,这是这些限制报告的大小。

这些限制与可用内存量有关,因此保持在这些限制内绝对不能保证可以成功分配大小的纹理。

我相信代理纹理的意图是让你检查实际分配的大小。我不知道它是否可以在任何平台上可靠地运行。这种机制确实不适合现代GPU管理内存的方式。但我从未使用代理纹理,或处理实现它们。我当然希望平台/供应商对它们的运行方式存在重大依赖。因此,如果他们在您关注的平台上为您提供所需的结果,您应该尝试。