揭开3D纹理的面纱 朱云 abs3d.yeah.net 2000年 第15期   3月23日,nVidia公司宣布微软将在新一代DirectX中采用nVidia开发的Volume Texture Compression Format(体积纹理压缩格式),简称VTC。这标志着3D纹理的压缩格式第一次正式进入了主流3D软件和硬件领域,它的出现将缓解因特网上传输高质量纹理的高带宽需求,也将使高质量的PC游戏更为真实、细腻。 #1 3D纹理的缘起   现有的纹理贴图,就是将各种不同的2D平面图形贴在3D物体的表面上,同种物体使用同样的2D纹理,以此来简化表现不同种类物体的不同表面效果,既节省了系统存储和物体表面信息的资源,又比较真实地反映出了客观(或想象)的世界。2D纹理就是一张张的平面图形(往往是正方形的),因此只包括一个平面上的像素点(称图素,Texel),每个点在纹理内部只有二维的相对坐标(贴在物体上后就有三维的实际坐标了)。2D纹理由于过于简化,因此在各个方向上看起来并没有质地上的不同,如果物体是平滑的就很难表现出局部的高低,光线从不同角度照射也基本没有区别。   为了达到更真实多变的纹理贴图效果,各大硬件、软件公司想出了很多改进方法,其中3D纹理是最为彻底的革新途径。3D纹理可以看作是各种不同的立方体材料,内部包括整个体积的像素点(称体素,Voxel),每个点在纹理内部空间中有三维的相对坐标——你把它想象成有内部花纹的大理石(或水晶)立方体就行了。3D纹理贴图其实称作3D立方体的雕刻和变形更为合适,因为不再需要将图案贴在表面,而是将3D纹理部分地取舍和扭曲,把它变成最终物体的形状。这样我们就有了非常接近于实际物体的材料来构成虚幻的3D世界(最终取消纹理、让每个物体都各不相同的3D系统还非常遥远),尽管我们付出的系统资源将随着纹理的复杂程度呈立方级数增加(2D纹理耗费的系统资源只随着纹理的复杂程度呈几何级数增加)。 #1 3D纹理的发展   很难准确地说3D纹理是从何时开始出现的:当年3Dlabs在Permedia 3中提出有少许高度的纹理概念,Matrox从G400开始使用凹凸纹理,其他3D芯片也可以实现简单的凹凸纹理,后来又出现了多种环境贴图纹理(从各方向上看起来有些不同):有G400凹凸环境贴图(3层纹理)、nVidia的GeForce 256的立方环境贴图(6层纹理)和ATI的Rage 6C的各种环境贴图(从1层纹理到6层纹理)。现在,3D纹理终于有了真正的内部三维相对坐标(相当于数十层、甚至数百层2D纹理),至今已经有包括Rage 6C的3D纹理和开头说到的nVidia的VTC。   3D纹理的优点不言而喻,它为新一代更加细腻、拟真的3D图形系统提供了发展基础。3D纹理的缺点也同优点一样明显:首先是非常大的数据量会占用难以想象的系统资源,3D处理的过程中进行纹理数据的过滤和半透明混合等工作也都比较困难——3D纹理的双线性过滤涉及8个点的平均数据(2D纹理是只要4个点),接近于2D纹理三线性过滤的运算量(9个点);3D纹理的半透明混合则涉及很多层体素点数据的色彩混合,运算量也相当大;另外,3D纹理仅仅是现在这样直接被“雕刻”成物体倒还简单,今后不可避免地将对3D纹理进行几何变形,以往T&L引擎(以及CPU)只负责物体顶点的几何变换,这样一来就得计算3D纹理中每一个点的空间坐标,难以想象的浮点几何变换的运算量恐怕不是短时间内能实现的。 #1 3D纹理的压缩   让我们来直观地了解一下3D纹理的数据量。2D纹理一般是正方形的,如256×256(图素)、512×512等,最大的可以达到4096×4096;3D纹理则一般是正方体的,如32×32×32(体素)、64×64×64等,最大暂时也只能有256×256×256。因为256×256×256就是16M个体素点,再乘上每个点16位(2Byte)或32位(4Byte)的色彩精度就是32MB或64MB的数据量,也就是说现在主流的显示卡内存只能装下一个低档次的3D纹理(Voodoo时代,2D大纹理的标准就是256×256/16位)。因此3D纹理一定要经过压缩才具有实用价值。   说到图像压缩,大家肯定会想到JPG、GIF等静态图像压缩格式和MPEG动态图像压缩格式,但实用的纹理压缩算法必须符合几个条件:一要能高速、实时解压缩,不影响纹理贴图过程的速度,所以JPEG(静态图像专家组)、Wavelets(子波压缩)等高压缩率、低速度的的方法就不合适了(试过S3TC纹理压缩程序的朋友就能发现,S3TC格式的图形文件,比高压缩系数的JPG等格式的文件大得多,一般是BMP格式的1/2~1/4);二要能够部分解压缩,就是不用把整个纹理全部解压缩(有大量数据互相相关的算法就是这样,如MPEG必须有上一帧图像为基础才能计算下一帧)后再进行纹理贴图,因为没有“地方”放解压缩后的数据(如要全部存放就失去压缩的意义了),实际上只能在贴图过程中用少量高速CACHE随时缓冲当前使用的部分纹理的数据。   2D纹理共有三种主要压缩方法:Videologic最早的VQ(Vector Quantization,矢量压缩)、S3的S3TC(微软在DirectX 6中使用时称为DXTC,OpenGL里仍称S3TC)、3dfx的FXT1(DXTC改进版),最大压缩率都在1/6~1/8。这些压缩方法都是建立图形单位(多个图素单元组成)的索引表,再用索引表中的地址(索引号)来代替原数据,将数据量较大幅度减少。不同的是S3TC和FXT1在纹理的多个部分建立不同的索引表,因此对小纹理的压缩效果同大纹理一样好;而VQ只为整个纹理建立一个索引表,纹理越大压缩率越高。   2D纹理压缩方法很容易扩展到3D纹理领域,nVidia和ATI都没有公布自己的3D纹理压缩方法的细节,但我们可以估计到由于S3TC是2D纹理压缩的事实标准,nVidia的新3D纹理压缩标准VTC应该以它为基础(最近nVidia同S3达成了互相使用专利的许可协议),至少有相当多的类似之处。有一点可以肯定,目前3D纹理压缩需要极大的压缩率,才能使天文数字的3D纹理数据量变得尽量的小;如果VTC能达到1/100左右的压缩率,主流的1024×1024×1024/32位的纹理就能被控制在可以忍受的32MB~40MB大小以内。 #1 3D纹理的实现   由于3D纹理的贴图和压缩都需要强大的硬件支持,估计软件模拟是难以实用化的。nVidia宣布将在今年年中开始使用VTC标准,届时正是GeForce2(代号为NV15)和NV11全面推出之时,因此我们可以顺理成章地推断至少GeForce2一定会具有VTC标准3D纹理贴图及压缩的硬件加速功能。ATI代号为Rage 6C的新产品的上市日期很可能同GeForce2相近,ATI的硬件3D纹理功能也将在Rage 6C中亮相。不同的是,nVidia强调3D纹理数据的线性存取,而ATI注重已有的OpenGL兼容性。   新的3D特性没有软件的使用也是不行的,而API的兼容和支持尤为重要。OpenGL 1.2已经能够支持S3TC、T&L和3D纹理,但对纹理压缩采取开放性的“放任”态度;DirectX中的Direct3D是从5.0版开始完善起来,而且普及程度超过了OpenGL和3dfx“私有”的Glide,从6.0版开始包括来自S3的S3TC(DXTC),从7.0版开始使用也是来自nVidia的T&L,现在新版的DirectX将支持VTC 3D纹理压缩标准,看样子就是预定今年夏天发行、打算在各方面超越OpenGL的8.0版。   在软硬件同时到位的情况下,希望3D纹理能得到游戏业界的广泛接受,再不要像S3TC那样叫好不叫座,至少也得接近T&L的普及水平才能算成功。 #1 纹理技术的前景   3D纹理是继T&L之后,主流3D体系结构的又一次重大变革和提高,以游戏为目标的主流3D的发展第一次领先于以制图为中心的专业3D。但同时3D纹理也是解决3D芯片每半年翻一番的处理能力的一个“好出路”,不然还有多少人打算买新的3D显示卡呢?   由于3D纹理有着鲜明的优势和弱点,3D纹理和2D纹理将在很长的时间内共存,直到系统资源极大丰富或者新的算法能够生成复杂而且低数据量的纹理时才会有所改变。将来用更多层次的(甚至是深度不同的)2D纹理表现出更丰富的图形效果,用3D纹理来表达重要的、复杂的物体,两者相互取长补短才能达到图形质量、速度之间的最佳平衡。另外,3D纹理的使用对开发人员提出了截然不同的挑战:谁会为了大理石内部看不到的花纹浪费大量时间呢?因此3D纹理的接受和使用一定是一个长期的过程。