将相同的 "texture memory" 绑定到不同维度的纹理
Bind the same "texture memory" to textures with different dimensionalities
如何将相同的 "texture memory" 绑定到具有不同维度的纹理。
例如,我需要在着色器中使用 sampler2DArray
并在另一个着色器中使用 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
但是最后一行显然是无效的
有什么方法可以做到这一点吗?
OpenGL (4.3+) 有一个概念叫做view textures. If you create a texture with immutable storage,那么你可以创建一个引用那个不可变存储的纹理。或该不可变存储的一部分。您可以更改图像格式(如果它们兼容)甚至纹理目标等内容。您可以提取二维数组的单个元素并将其用作常规二维纹理。或者,您可以将 2D 纹理转换为 1 层的 2D 阵列。
但是,您不能将 2D 数组纹理的存储视为 3D 纹理。或相反亦然。他们的 mipmap 的工作方式不同。在 3D 纹理中,mipmap 在 X、Y 和 Z 方向减小。在 2D 阵列纹理中,它们仅在 X 和 Y 方向变小。
即使 Vulkan 也不允许您从分配为阵列 2D 图像的 VkImage
创建 3D 图像视图 VkImageView
(反之亦然)。
如何将相同的 "texture memory" 绑定到具有不同维度的纹理。
例如,我需要在着色器中使用 sampler2DArray
并在另一个着色器中使用 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
但是最后一行显然是无效的
有什么方法可以做到这一点吗?
OpenGL (4.3+) 有一个概念叫做view textures. If you create a texture with immutable storage,那么你可以创建一个引用那个不可变存储的纹理。或该不可变存储的一部分。您可以更改图像格式(如果它们兼容)甚至纹理目标等内容。您可以提取二维数组的单个元素并将其用作常规二维纹理。或者,您可以将 2D 纹理转换为 1 层的 2D 阵列。
但是,您不能将 2D 数组纹理的存储视为 3D 纹理。或相反亦然。他们的 mipmap 的工作方式不同。在 3D 纹理中,mipmap 在 X、Y 和 Z 方向减小。在 2D 阵列纹理中,它们仅在 X 和 Y 方向变小。
即使 Vulkan 也不允许您从分配为阵列 2D 图像的 VkImage
创建 3D 图像视图 VkImageView
(反之亦然)。