【发布时间】:2014-12-08 00:26:47
【问题描述】:
每当我想在 opengl 中使用 mipmap 时,我需要将最高分辨率的位图上传为 mipmap 级别 0,然后在更高的 mipmap 级别上传较低分辨率的位图。
我希望能够添加更高分辨率的 mipmap 以及更低分辨率的 mipmap。目前我知道的唯一硬件方法是启动一个新的 mipmap-ed 纹理并重新上传所有以前上传的位图。
还有其他硬件方法可以做到这一点吗?
编辑:
看起来 GL_TEXTURE_BASE_LEVEL 和 GL_TEXTURE_MAX_LEVEL 并没有改变 opengl 将在纹理创建时为所有纹理 mipmap 级别分配内存的事实,因此它不能在这种情况下使用,因为不可能知道哪些纹理需要更高分辨率的 mipmap,哪些不需要t,所以会导致极大的内存浪费。
看来,在硬件中执行此操作的唯一方法是在 mipmap 级别 0 使用新生成的更高分辨率 mipmap 重新创建新纹理,然后在较低 mipmap 级别复制所有先前的较低分辨率 mipmap。
据我所知,唯一的方法是将所有先前生成的 mipmap 级别保留在内存中,以防我需要重新上传它们(不想浪费这么多内存),重新生成所有 mipmap 级别(不会这样做,太慢了),使用 gltexsubimage2d 将以前的纹理 mipmap 级别复制到系统内存,然后将它们上传到新纹理(这一定很慢),或者将它们直接从以前的纹理复制到新纹理。
那么,有没有办法将纹理的选定mipmap复制到不同纹理的mipmap,例如“glcopytexture(texture_id_1,texture_mipmap_1,texture_id_2,texture_mipmap_2);”
编辑2:
似乎最近有一个扩展(扩展 ~2009 在 ~2012 成为核心)正是这样做的(https://www.opengl.org/wiki/Texture_Storage#Texture_copy),但该合同的要求之一是支持长达 10 年的计算机。
【问题讨论】:
-
这通常意味着驱动需要重新分配整个纹理,因为它在创建低分辨率mipmap时没有考虑更高的分辨率
-
此时看来,之前的评论可能是唯一不浪费纹理内存的硬件答案。我正在使用找到的信息在我最初的问题中添加一个后续问题。
-
@Marladu:实际上,对于真正现代的 GPU,还有其他可能性,尤其是 GL_ARB_sparse_texture。这当然不是你想要的 10 年老系统。
-
您好,感谢您的评论。我试图阅读您链接的文章,但老实说,它不仅不适用于我目前的合同,而且大多数情况下我能理解的内容太多了,我认为我无法使用它没有明确的指示,我能找到的还不足以满足我目前的能力。如果这确实与这个问题有关,并且您有时间和兴趣,也许您可以在此 ARB/EXT 中添加一个非常简短的入门知识,以使每个人都受益?
标签: opengl