OpenGL 4.3 上 ETC2 纹理压缩的视频内存
Video Memory from ETC2 Texture Compression on OpenGL 4.3
目前我正在编写一个渲染器,它使用许多纹理并且会填满我的显卡的显存(我的 nVidia GTX 780 Ti 为 3 Gb)。因此,我使用 Mali's texture compression tool and integrated my renderer with libktx 加载压缩纹理 (*.ktx).
来预压缩所有必要的图像
压缩效果非常好。对于 RGB 图像(使用 GL_COMPRESSED_RGB8_ETC2 压缩),它始终达到 4 bpp,RGBA 图像达到 8 bpp(GL_COMPRESSED_RGBA8_ETC2_EAC ) 如规格中所述。但是无论何时将这些压缩图像上传到 GPU,它们都会显示为原始大小(压缩前)
我正在使用以下方式加载压缩纹理:
ktxLoadTextureN(...);
我可以看到在该函数内部,libktx 将调用:
glCompressedTexImage2D( GLenum target, GLint level,
GLenum internalformat,
GLsizei width, GLsizei height,
GLint border,
GLsizei imageSize,
const GLvoid * data);
glCompressedTexImage2D()中的imageSize参数;与我的压缩数据大小相匹配,但是执行该函数后,显存增加了解压图像大小。
所以我的问题是:压缩纹理在上传到 GPU 之前是否总是解压缩?如果是这样,是否有任何标准化的纹理压缩格式允许在 gpu 上动态解码压缩纹理?
ETC2
和 ETC
格式不常被桌面应用程序使用。因此,它们可能不受桌面 GPU and/or 驱动程序的原生支持。但是,它们是 GLES 3.0 兼容性所必需的,因此如果您的桌面 OpenGL 驱动程序报告 GL_ARB_ES3_compatibility,那么它也必须支持 ETC2
格式。由于很多开发者希望在自己的桌面上开发GLES 3.0应用程序,避免不断部署,调试更方便,所以希望驱动报告这个扩展。
您的驱动程序很可能只是通过将软件中的数据解压缩为未压缩的 RGB(A) 目标来模拟对 ETC2
格式的支持。这可以解释未压缩纹理的内存使用量不变。这不一定适用于每个桌面驱动程序,但可能适用于大多数桌面驱动程序。它仍然符合规范 - 虽然它是假设的,但不要求压缩纹理消耗传递给 glCompressedTexImage2D
.
的内存
如果您想在桌面上模拟相同级别的内存使用,您应该将纹理压缩为常用的桌面压缩格式,例如 S3TC 格式之一,使用 GL_texture_compression_s3tc 扩展名,它应该在所有桌面 GPU 驱动程序上可用。
目前我正在编写一个渲染器,它使用许多纹理并且会填满我的显卡的显存(我的 nVidia GTX 780 Ti 为 3 Gb)。因此,我使用 Mali's texture compression tool and integrated my renderer with libktx 加载压缩纹理 (*.ktx).
来预压缩所有必要的图像压缩效果非常好。对于 RGB 图像(使用 GL_COMPRESSED_RGB8_ETC2 压缩),它始终达到 4 bpp,RGBA 图像达到 8 bpp(GL_COMPRESSED_RGBA8_ETC2_EAC ) 如规格中所述。但是无论何时将这些压缩图像上传到 GPU,它们都会显示为原始大小(压缩前)
我正在使用以下方式加载压缩纹理:
ktxLoadTextureN(...);
我可以看到在该函数内部,libktx 将调用:
glCompressedTexImage2D( GLenum target, GLint level,
GLenum internalformat,
GLsizei width, GLsizei height,
GLint border,
GLsizei imageSize,
const GLvoid * data);
glCompressedTexImage2D()中的imageSize参数;与我的压缩数据大小相匹配,但是执行该函数后,显存增加了解压图像大小。
所以我的问题是:压缩纹理在上传到 GPU 之前是否总是解压缩?如果是这样,是否有任何标准化的纹理压缩格式允许在 gpu 上动态解码压缩纹理?
ETC2
和 ETC
格式不常被桌面应用程序使用。因此,它们可能不受桌面 GPU and/or 驱动程序的原生支持。但是,它们是 GLES 3.0 兼容性所必需的,因此如果您的桌面 OpenGL 驱动程序报告 GL_ARB_ES3_compatibility,那么它也必须支持 ETC2
格式。由于很多开发者希望在自己的桌面上开发GLES 3.0应用程序,避免不断部署,调试更方便,所以希望驱动报告这个扩展。
您的驱动程序很可能只是通过将软件中的数据解压缩为未压缩的 RGB(A) 目标来模拟对 ETC2
格式的支持。这可以解释未压缩纹理的内存使用量不变。这不一定适用于每个桌面驱动程序,但可能适用于大多数桌面驱动程序。它仍然符合规范 - 虽然它是假设的,但不要求压缩纹理消耗传递给 glCompressedTexImage2D
.
如果您想在桌面上模拟相同级别的内存使用,您应该将纹理压缩为常用的桌面压缩格式,例如 S3TC 格式之一,使用 GL_texture_compression_s3tc 扩展名,它应该在所有桌面 GPU 驱动程序上可用。