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.
通过排除缩小我的问题范围:
- 带像素解压缩缓冲区的 glCompressed* 不是一个选项。
- TexStorage 不能有压缩的内部格式。这是 GL 4.5,已被删除。
- OpenGL 规范说以下这对是兼容的:GL_RGTC2_RG、GL_COMPRESSED_RG_RGTC2。但是 GL_RGTC2_RG 不是 GL 定义或任何 header 或规范中定义的值。
您不能分配非压缩格式的存储空间并使用压缩格式查看它。或相反亦然。您可以通过 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 位无符号整数格式,视图的每个像素都有足够的组件,以对应于块字节大小格式。
如果我打算将原始存储分配为非压缩纹理并且纹理视图将其解释为 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.
通过排除缩小我的问题范围:
- 带像素解压缩缓冲区的 glCompressed* 不是一个选项。
- TexStorage 不能有压缩的内部格式。这是 GL 4.5,已被删除。
- OpenGL 规范说以下这对是兼容的:GL_RGTC2_RG、GL_COMPRESSED_RG_RGTC2。但是 GL_RGTC2_RG 不是 GL 定义或任何 header 或规范中定义的值。
您不能分配非压缩格式的存储空间并使用压缩格式查看它。或相反亦然。您可以通过 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 位无符号整数格式,视图的每个像素都有足够的组件,以对应于块字节大小格式。