我正在开发一些高清成像软件,虽然这个版本目前还没有计划非常大的纹理,但是我想做一些未来的打样。
如果我正在处理非常大的纹理(例如1095630 x 939495),我可以使用压缩纹理和mip贴图的标准组合,或者这些纹理是否会大到存储在纹理内存中?
我的假设是它们太大了我不得不在CPU上做一个psudeo手动mip贴图。即抓取非常大的数据,为完全缩小创建一个合理的压缩版本,然后在用户放大时,将大纹理的子部分发送到GPU?
在CPU上执行压缩的想法会非常慢,所以我的计划是将数据平铺并将其发送到GPU以进行压缩。在这种情况下,我如何找出(最好是动态的)GPU可以处理的最大纹理尺寸?
我是TIFF格式的新手,但从它的外观来看,它已经存储为瓷砖,这是正确的吗?我希望与libtiff有点玩,但我没有找到很多使用它的例子(我的google技能今天让我失望,道歉)。 https://stackoverflow.com/questions/ask
现有示例 我希望从这两个方面得到一些指示:
总结:
答案 0 :(得分:4)
这取决于您要定位的硬件。
如果您的目标是广泛支持GPU,那么就像您建议的那样,对纹理(mipmap)级别进行原位更新是可行的方法。较旧的GPU代可以处理可以处理的最大纹理分辨率。通常在两个维度中约为4096到8192。通常你会有一组平铺纹理(每个平铺大约是1024×1024左右),分配足够的平铺以覆盖整个屏幕加上一些余量。
如果您的目标是下一代GPU,那么您可以使用John Carmack所谓的“Megatextures”:使用无绑定,无稀疏纹理。这不是核心OpenGL功能,但是扩展名为GL_ARB_sparse_texture和GL_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书中有两篇关于该技术的文章。