opengl - 处理超过 4GB 纹理 (BigTiff) OpenGL

标签 opengl textures libtiff large-data

我正在开发一些高清成像软件,虽然目前没有计划为此版本提供非常大的纹理,但我想做一些 future 的校样。

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

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

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

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

现有示例 我希望能从这两个人那里得到一些指示:

总结:

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

最佳答案

这取决于您的目标硬件。

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

如果您的目标是新一代 GPU,那么您可以使用 John Carmack 提出的“Megatetextures”:使用无绑定(bind)、无稀疏纹理。但这不是核心 OpenGL 功能,而是通过扩展 GL_ARB_sparse_texture 公开的和 GL_ARB_bindless_texture 。您拥有一个大型“虚拟”纹理,而不是一组纹理图 block ,您可以根据需要将所需的图 block 流式传输到其中。

在支持此功能的 GPU 上,您也不会遇到专用 GPU RAM 数量设置的限制。 OpenGL 从来没有“可用视频内存”的概念,并且纹理始终可以根据需要换入换出。借助对稀疏纹理的支持,如今的 GPU 可以卸载系统内存中的 GB 纹理数据,并在需要时将其提取到 GPU RAM 中(本质上,系统内存变成了纹理数据的 L4 缓存)。

关于opengl - 处理超过 4GB 纹理 (BigTiff) OpenGL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25640268/

相关文章:

linux - 在 Linux 上编译 libtiff 4.0 beta 时遇到问题

c++ - OpenGL GLSL 纹理透明度

c++ - 对于使用 OpenGL 的程序,我需要类似于 sleep 功能的东西

css - CSS 中的纸张纹理?

rendering - 有没有办法在 Bevy 中创建 "render texture"?

python - 使用 Anaconda 或 Canopy 安装 Python 模块

c++ - OpenGL 缩放单像素线

c++ - glReadPixels() 真的很慢,从鼠标位置获取 OpenGL 坐标的更好解决方案?

javascript - 更新数据纹理统一时,所有点都变为 0,0

python - 操作系统错误: [WinError 193] %1 is not a valid Win32 application (LibTiff)