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扩展

最低支持

所支持压缩格式

GL_EXT_texture_compression_s3tc

OpenGL Compatibility Profile

BC1, BC2和BC3

GL_ARB_texture_compression_rgtc

OpenGL 3.0 Core Profile

BC4和BC5

GL_ARB_texture_compression_bptc

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压缩纹理是完全可以的。

posted @ 2014-01-01 10:37 YangZhao1992 阅读(...) 评论(...) 编辑 收藏