将相同的“纹理记忆”绑定到具有不同维度的纹理

时间:2016-07-19 17:04:43

标签: opengl textures

如何将相同的“纹理记忆”绑定到具有不同维度的纹理。

例如,我需要在着色器中使用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

但最后一行显然无效。

有没有办法做类似的事情?

1 个答案:

答案 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)。