处理4gb以上的纹理(BigTiff)OpenGL

时间:2014-09-03 09:01:28

标签: opengl textures libtiff large-data

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

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

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

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

我是TIFF格式的新手,但从它的外观来看,它已经存储为瓷砖,这是正确的吗?我希望与libtiff有点玩,但我没有找到很多使用它的例子(我的google技能今天让我失望,道歉)。 https://stackoverflow.com/questions/ask

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

总结

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

2 个答案:

答案 0 :(得分:4)

这取决于您要定位的硬件。

如果您的目标是广泛支持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缓存)。

答案 1 :(得分:2)

OpenGL确实限制了传统纹理的最大尺寸。此限制是特定于实现的,可以使用glGetInteger()轻松查询:

GLint maxGPUTextureSize;
glGetIntegerv(GL_MAX_TEXTURE_SIZE, &maxGPUTextureSize);

根据文件:

  

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

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

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