【问题标题】:Handling over 4gb textures (BigTiff) OpenGL处理超过 4gb 的纹理 (BigTiff) OpenGL
【发布时间】:2014-10-27 17:09:35
【问题描述】:

我正在开发一些高清成像软件,虽然目前没有为这个版本计划非常大的纹理,但我想在未来做一些校对。

如果我正在处理非常大的纹理(例如 1095630 x 939495),我是否可以使用压缩纹理和 mip 映射的标准组合,或者这些纹理是否会太大而无法存储在纹理内存中?

我的假设是它们太大了,我必须在 CPU 上做一个伪手动 mip 映射。即抓取非常大的数据,为完全缩小创建合理的压缩版本,然后当用户放大时,将大纹理的子部分发送到 GPU?

在 CPU 上进行上述压缩的想法会非常慢,所以我的计划是平铺数据并将其分块发送到 GPU 进行压缩。在这种情况下,我如何最好动态地找出 GPU 可以处理的最大纹理大小?

我是 TIFF 格式的新手,但从外观上看,它已经存储为图块,这是正确的吗?我希望与 libtiff 玩一点,但我没有找到很多使用它的例子(我的谷歌技能今天失败了,抱歉)。 https://stackoverflow.com/questions/ask

现有示例 我希望从这两个方面得到一些指示:

总结

  • 如何找出 GPU 可以处理的最大纹理大小(最好是 3D 纹理大小...)
  • 分解大型纹理格式并将其压缩到 GPU 可以处理的最佳方式是什么
  • 促进缩放的最佳方式是什么?
  • 关于使用 libTiff 的指针?

【问题讨论】:

  • ((((1095630 x 939495 x 4 (rgba))/1024(千字节))/1024(兆字节))/1024(千兆字节)) ~= 383.5 GB
  • 所以是的,我认为这可能太大而无法存储在纹理内存中......可能。

标签: opengl textures libtiff large-data


【解决方案1】:

这取决于您的目标硬件。

如果您的目标是广泛支持大范围的 GPU 代,那么您建议的纹理 (mipmap) 级别的原位更新是可行的方法。较旧的 GPU 代对可以处理的最大纹理分辨率有限制。通常在任何一个维度上都在 4096 到 8192 左右。通常你会有一组贴图纹理(每个贴图大约是 1024×1024 左右),分配了足够的贴图来覆盖整个屏幕加上一些边距。

如果您的目标是下一代 GPU,那么您可以使用 John Carmack 称为“Megatextures”的东西:使用无绑定、无稀疏纹理。虽然这不是核心 OpenGL 功能,但通过扩展 GL_ARB_sparse_textureGL_ARB_bindless_texture 公开。您拥有一个大型“虚拟”纹理,而不是一组纹理图块,您可以按需将所需的图块流式传输到其中。

在支持此功能的 GPU 上,您也不会遇到专用 GPU RAM 数量设置的限制。 OpenGL 从来没有“可用视频内存”的概念,而且纹理总是可以按需换入和换出。由于支持稀疏纹理,如今的 GPU 可以卸载系统内存中千兆字节的纹理数据,并在需要时从那里将其提取到 GPU RAM(本质上,系统内存变成了纹理数据的 L4 缓存)。

【讨论】:

    【解决方案2】:

    OpenGL 确实对常规纹理的最大尺寸有限制。此限制是特定于实现的,可以通过glGetInteger() 轻松查询:

    GLint maxGPUTextureSize;
    glGetIntegerv(GL_MAX_TEXTURE_SIZE, &maxGPUTextureSize);
    

    根据文档:

    该值给出了 GL 可以处理的最大纹理的粗略估计。该值必须至少为 1024。

    这是纹理的最大平方大小(以像素为单位)。即:1024x1024。

    现在,正如@datenwolf 所建议的那样,您的问题似乎非常适合“虚拟纹理”又名“Megatexture”技术。搜索这些术语,您会发现很多关于该主题的工作和论文。我认为 Sean Barret 的 this GDC presentation 是该主题的首批开放作品之一,非常值得一看。此外,GPU Pro 1 书中有两篇关于该技术的文章。

    【讨论】:

    • 两个答案都很好,我特别感谢您提到 max_texture_size 和优秀的资源,我将纯粹在他发布的第一个过去的基础上给@datenwolf 最好的答案,希望我可以将两者标记为相等.. .
    猜你喜欢
    • 1970-01-01
    • 2021-05-26
    • 1970-01-01
    • 2011-05-19
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    相关资源
    最近更新 更多