OpenGL 压缩纹理视图有效格式

OpenGL compressed texture views valid formats

如果我打算将原始存储分配为非压缩纹理并且纹理视图将其解释为 BC5/RGTC,那么以下代码示例适用于哪些内部格式组合?

GLuint texId;
glGenTextures(1, &texId);
glBindTexture(GL_TEXTURE_3D, texId);
glTexStorage3D(GL_TEXTURE_3D, 1, GL_RGBA32UI, 4, 4, 16);
glBindTexture(GL_TEXTURE_3D, 0);

assertNoError();

GLuint viewId;
glGenTextures(1, &viewId);
glTextureView(viewId, GL_TEXTURE_3D, texId, GL_COMPRESSED_RG_RGTC2, 0, 1, 0, 1);
assertNoError();

glDeleteTextures(1, &viewId);
glDeleteTextures(1, &texId);
assertNoError();

此示例因 INVALID_OPERATION 而失败,并且 GL 调试输出消息显示:

Internal formats neither compatible nor identical.

通过排除缩小我的问题范围:

您不能分配非压缩格式的存储空间并使用压缩格式查看它。或相反亦然。您可以通过 glCopyImageSubData copy between compressed and uncompressed formats。但是你不能做你想做的那种“转换”。

此外:

TexStorage cannot have the compressed internal format. This is GL 4.5 and that has been removed.

您不能使用通用压缩图像格式,但特定格式(如GL_COMPRESSED_RG_RGTC2)仍然可用。只是不适用于 3D 纹理(BPTC 可以使用 3D 纹理,但不能使用 RGTC)。


Vulkan 有一种创建压缩格式 VkImage 的机制,然后您可以从中创建具有适当未压缩格式的 VkImageView(不允许反向操作,但那是不允许的)真的没那么重要)。为此,必须使用 VK_IMAGE_CREATE_BLOCK_TEXEL_VIEW_COMPATIBLE_BIT 创建标志创建图像,并且视图必须使用 32 位无符号整数格式,视图的每个像素都有足够的组件,以对应于块字节大小格式。