【问题标题】:Portably and Correctly Getting Maximum 1D/2D/3D/Cube Texture Resolution in OpenGL在 OpenGL 中可移植且正确地获得最大 1D/2D/3D/Cube 纹理分辨率
【发布时间】:2014-10-16 17:50:09
【问题描述】:

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

据我所知,有两种机制可以做与此相关的事情:

  1. glGetIntegerv(GL_MAX_TEXTURE_SIZE,&dim) 用于 2D(和立方体?)纹理对我很有帮助。对于 3D 纹理,我发现(很难)你需要使用 GL_MAX_3D_TEXTURE_SIZE 来代替。据我所知,这些会返回一侧的最大分辨率,而另一侧假定是相同的。

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

    文档建议使用 . . .

  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 表示代理纹理给出了完全错误的答案,但今天可能并非如此。

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

【问题讨论】:

    标签: opengl textures


    【解决方案1】:

    立方体贴图有一个单独的值,可以使用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 管理内存的方式。但我从来没有使用过代理纹理,也没有处理过实现它们。我肯定会期望它们的运行方式具有重要的平台/供应商依赖性。因此,如果他们在您关心的平台上为您提供所需的结果,您可能应该尝试一下。

    【讨论】:

      【解决方案2】:

      glGetIntegerv()GL_MAX_TEXTURE_SIZEGL_MAX_3D_TEXTURE_SIZE 返回的值是特定实现的正确限制。

      尚不清楚这些值实际代表什么。价值 glGetIntegerv(...) 返回的将被视为“粗略估计”, 根据文档,但尚不清楚它们是否是 保守的低估、最佳猜测或最佳情况。

      您指的是哪种文档? GL 规范对这些值的含义非常清楚,它们不是任何类型的估计值。

      代理方法也应该可以工作,但不能直接让您查询限制。您可以通过该代理纹理路径使用二进制搜索来缩小确切限制,但这只是一种相当笨拙的方法。

      【讨论】:

      • 引用的文档是glGet 的 GL 4 手册页。
      • 嗯,那些手册页从来都不是很准确或写得很好。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-04-28
      • 2018-08-05
      • 2011-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多