如何将相同的“纹理记忆”绑定到具有不同维度的纹理。
例如,我需要在着色器中使用sampler2DArray
访问2D图像数组,在另一个着色器中使用sampler3D
,而无需在显卡内存中加载和存储数据两次。
我想做这样的事情:
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D_ARRAY, tex);
glTexImage3D(GL_TEXTURE_2D_ARRAY, ...); // allocate & store pixel data
然后:
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_3D, tex); // "reuse" the texture storage with a
// different dimensionality in another
// texture unit
但最后一行显然无效。
有没有办法做类似的事情?
答案 0 :(得分:0)
OpenGL(4.3+)有一个名为view textures的概念。如果使用immutable storage创建纹理,则可以创建引用该不可变存储的纹理。或者是不可变存储的一部分。您可以更改图像格式(如果它们兼容)甚至纹理目标等内容。您可以提取2D阵列的单个元素并将其用作常规2D纹理。或者您可以将2D纹理转换为1层的2D数组。
但是,您无法将2D数组纹理的存储视为3D纹理。或相反亦然。他们的mipmaps不会以同样的方式工作。在3D纹理中,mipmaps在X,Y和Z中减小。在2D数组纹理中,它们在X和Y中仅变小。
即使 Vulkan 也不允许您创建VkImageView
VkImage
,这是<a>
的3D图像视图,该视图被分配为阵列2D图像(或副-versa)。