每當我想在opengl中使用mipmap時,我需要將最高分辨率的位圖上傳爲mipmap級別0,然後在較高的mipmap級別上傳較低分辨率的位圖。opengl:向紋理中添加更高分辨率的mipmapps
我本來希望能夠添加更高分辨率的mipmap以及更低分辨率的mipmap。目前我知道的唯一硬件方法是開始一個新的mipmap-ed紋理並重新上傳所有以前上傳的位圖。
任何其他硬件方式來做到這一點?
編輯:
看來GL_TEXTURE_BASE_LEVEL和GL_TEXTURE_MAX_LEVEL不會更改的OpenGL將分配內存在紋理製作所有質感紋理映射層級的事實,因此它不能在這種情況下使用,因爲它是不可能知道哪個紋理會需要更高分辨率的mipmap並且不會,所以會導致極大的內存浪費。
看起來,在硬件中執行此操作的唯一方法是使用新生成的mipmap級別爲0的較高分辨率mipmap重新創建新紋理,然後在較低mipmap級別複製所有先前較低分辨率的mipmap。
據我所知,唯一的辦法是將所有以前生成的mipmap級別保存在內存中,以防我需要重新上傳它們(而不是浪費這麼多內存),重新生成所有mipmap級別(不會做,太慢),使用gltexsubimage2d將以前的紋理mipmap級別複製到系統內存,然後將它們上傳到新紋理(這很慢),或者將它們從原紋理直接複製到新紋理。
那麼,有沒有辦法將紋理的選定mipmap複製到不同紋理的mipmap,如「glcopytexture(texture_id_1,texture_mipmap_1,texture_id_2,texture_mipmap_2);」
EDIT2:
似乎有幾分最近的擴展,這是否準確(https://www.opengl.org/wiki/Texture_Storage#Texture_copy),但本合同的要求之一是支持電腦長達10歲的(擴展〜2009年成爲〜2012年核心) 。
它通常意味着驅動程序需要重新分配整個紋理,因爲它在創建低分辨率mipmap時沒有考慮到更高的分辨率 – 2014-12-08 00:30:38
在這一點上,它很可能是以前的評論可能是唯一不會浪費紋理內存的硬件答案。我在我的最初問題中添加了一個跟蹤問題,並找到了信息。 – Marladu 2014-12-08 18:13:49
@Marladu:實際上,對於真正的現代GPU,還有其他可能性,特別是[GL_ARB_sparse_texture](https://www.opengl.org/registry/specs/ARB/sparse_texture.txt)。這當然不是10年前的系統所需要的。 – derhass 2014-12-08 21:20:24