OpenGL中的Block Compression
来源请注明:http://www.cnblogs.com/vertexshader/articles/3500275.html
导言:
在Microsoft Direct3D 11中,Block Compression压缩纹理算法已经升级到了BC6H和BC7,而加上之前支持的BC1~5这些压缩算法,其现阶段总共支持了7种纹理压缩算法,肯定会有OpenGL开发者提出这样的一个问题:这些压缩算法是否存在于OpenGL中?
描述:
在Microsoft Direct3D 11中,Block Compression压缩纹理算法已经升级到了BC6H和BC7,分别擅长HDR压缩和高质量的LDR的压缩,运算量也巨大很多。而加上之前Direct3D 11支持的BC1~5这些压缩算法,其现阶段总共支持了7种纹理压缩算法,算法的方法比较类似,但是计算复杂程度不同。下面便先略看一下Direct3D 11现阶段支持的所有压缩算法:
源像素数据 |
最好压缩结果 |
压缩格式 |
最低支持 |
Three-channel color with alpha channel |
Three color channels (5 bits:6 bits:5 bits), with 0 or 1 bit(s) of alpha |
BC1 |
Direct3D 9.1 |
Three-channel color with alpha channel |
Three color channels (5 bits:6 bits:5 bits), with 4 bits of alpha |
BC2 |
Direct3D 9.1 |
Three-channel color with alpha channel |
Three color channels (5 bits:6 bits:5 bits) with 8 bits of alpha |
BC3 |
Direct3D 9.1 |
One-channel color |
One color channel (8 bits) |
BC4 |
Direct3D 10 |
Two-channel color |
Two color channels (8 bits:8 bits) |
BC5 |
Direct3D 10 |
Three-channel high dynamic range (HDR) color |
Three color channels (16 bits:16 bits:16 bits) in "half" floating point* |
BC6H |
Direct3D 11 |
Three-channel color, alpha channel optional |
Three color channels (4 to 7 bits per channel) with 0 to 8 bits of alpha |
BC7 |
Direct3D 11 |
那么现在肯定会有OpenGL开发者提出这样的一个问题:这些压缩算法是否存在于OpenGL中?答案是肯定的,而且这些压缩算法有一些已经成为OpenGL的Core Profile的一部分。因为Block Compresstion算法是有专利的,微软向s3购买了这些算法专利的授权;而OpenGL不一定,需要各大厂商分别购买专利的授权,所以不管是在OpenGL Spec中还是Registry中对这些算法的叙述有时候都比较模糊。其实OpenGL已经支持了上面的所有压缩格式,下面便看看OpenGL通过哪些扩展支持了BC压缩算法:
OpenGL扩展 |
最低支持 |
所支持压缩格式 |
OpenGL Compatibility Profile |
BC1, BC2和BC3 |
|
OpenGL 3.0 Core Profile |
BC4和BC5 |
|
OpenGL 4.2 Core Profile |
BC6H和BC7 |
对于GL_EXT_texture_compression_s3tc,这个扩展并不是核心扩展,不过这个扩展和各向异性过滤扩展一样成为了“非核心的核心扩展”,主流的厂商Nvidia、AMD和Intel都支持了这个扩展,当然移动端也有支持的,在使用BC1~3压缩算法时可以和各向异性过滤一样比较少地考虑硬件支持的问题;而GL_ARB_texture_compression_rgtc和GL_ARB_texture_compression_bptc已经进入核心,所以只要是良好支持OpenGL Core Profile的硬件都能放心的使用BC4~7这些压缩算法。下列便是Direct3D和OpenGL中这些压缩纹理格式的标识符的比较:
Direct3D标识符 |
OpenGL标识符 |
DXGI_FORMAT_BC1_UNORM |
GL_COMPRESSED_RGBA_S3TC_DXT1_EXT |
DXGI_FORMAT_BC1_UNORM_SRGB |
GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT |
DXGI_FORMAT_BC2_UNORM |
GL_COMPRESSED_RGBA_S3TC_DXT3_EXT |
DXGI_FORMAT_BC2_UNORM_SRGB |
GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT |
DXGI_FORMAT_BC3_UNORM |
GL_COMPRESSED_RGBA_S3TC_DXT5_EXT |
DXGI_FORMAT_BC3_UNORM_SRGB |
GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT |
DXGI_FORMAT_BC4_UNORM |
GL_COMPRESSED_RED_RGTC1 |
DXGI_FORMAT_BC4_SNORM |
GL_COMPRESSED_SIGNED_RED_RGTC1 |
DXGI_FORMAT_BC5_UNORM |
GL_COMPRESSED_RG_RGTC2 |
DXGI_FORMAT_BC5_SNORM |
GL_COMPRESSED_SIGNED_RG_RGTC2 |
DXGI_FORMAT_BC6H_UF16 |
GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT |
DXGI_FORMAT_BC6H_SF16 |
GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT |
DXGI_FORMAT_BC7_UNORM |
GL_COMPRESSED_RGBA_BPTC_UNORM |
DXGI_FORMAT_BC7_UNORM_SRGB |
GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM |
SRGBA相关的标识符需要额外的GL_EXT_texture_sRGB扩展支持(其实又是一个“非核心的核心扩展”,基本上绝大多数的显卡都会支持这个扩展),OpenGL其实可以完全支持Direct3D 11中的所有Block Compressed压缩算法,并且已经有BC4~7已经存在于OpenGL核心之中,而其他的又是各大厂商肯定会实现的功能,所以要在OpenGL上用Block Compressed压缩纹理是完全可以的。