3D纹理的缘起(转)

3D纹理的缘起  
 现有的纹理贴图,就是将各种不同的2D平面图形贴在3D物体的表面上,同种物体使用同样的2D纹理,以此来简化表现不同种类物体的不同表面效果,既节省了系统存储和物体表面信息的资源,又比较真实地反映出了客观(或想象)的世界。2D纹理就是一张张的平面图形(往往是正方形的),因此只包括一个平面上的像素点(称图素,Texel),每个点在纹理内部只有二维的相对坐标(贴在物体上后就有三维的实际坐标了)。2D纹理由于过于简化,因此在各个方向上看起来并没有质地上的不同,如果物体是平滑的就很难表现出局部的高低,光线从不同角度照射也基本没有区别。
  为了达到更真实多变的纹理贴图效果,各大硬件、软件公司想出了很多改进方法,其中3D纹理是最为彻底的革新途径。3D纹理可以看作是各种不同的立方体材料,内部包括整个体积的像素点(称体素,Voxel),每个点在纹理内部空间中有三维的相对坐标——你把它想象成有内部花纹的大理石(或水晶)立方体就行了。3D纹理贴图其实称作3D立方体的雕刻和变形更为合适,因为不再需要将图案贴在表面,而是将3D纹理部分地取舍和扭曲,把它变成最终物体的形状。这样我们就有了非常接近于实际物体的材料来构成虚幻的3D世界(最终取消纹理、让每个物体都各不相同的3D系统还非常遥远),尽管我们付出的系统资源将随着纹理的复杂程度呈立方级数增加(2D纹理耗费的系统资源只随着纹理的复杂程度呈几何级数增加)。

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纹理中每一个点的空间坐标,难以想象的浮点几何变换的运算量恐怕不是短时间内能实现的。

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大小。

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,DirectX8.0支持VTC 3D纹理压缩标准,在各方面超越OpenGL的8.0版。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值