游戏开发论坛

 找回密码
 立即注册
搜索
查看: 29718|回复: 22

DXT1格式压缩高质量法线贴图

[复制链接]

13

主题

49

帖子

60

积分

注册会员

Rank: 2

积分
60
发表于 2007-6-9 09:59:00 | 显示全部楼层 |阅读模式
DXT1格式压缩高质量法线贴图
        ---法线延长算法
       
        DXT1格式的压缩比是3Dc或DXT5的两倍,使用DXT1贴图可以成倍提高显卡总线和CACHE的效率,极大地提高性能。
        可是如果不加任何处理地压缩法线贴图,会产生严重的马赛克。
       
        我最近想到了一个DXT1存储高质量法线贴图的简单算法,命名为法线延长法,既有DXT1的高性能,又有较高质量。
       
        算法
       
        法线贴图一般是和漫反射贴图成对使用的。对两幅贴图的各级mipmaps逐像素进行以下处理:
        (伪代码。因为是预处理所以使用double没关系)
        double3 iNORMAL : 输入的法线贴图
        double3 iCOLOR        : 输入的漫反射贴图
        double3 oNORMAL : 输出的法线贴图
        double3 oCOLOR        : 输出的漫反射贴图       
       
        double l = max( iNORMAL.x , iNORMAL.y , iNORMAL.z );
       
        oNORMAL = iNORMAL / l;
        oCOLOR  = iCOLOR * l;
       
        再找个nvDXT之类的高质量DXT压缩工具一压就可以当作普通的法线贴图和漫反射贴图用了,只是使用时千万不要进行单位化。
       
        效果对比
               
          见后面所附图片       
       
        分析
       
        直接压缩成DXT1会产生马赛克的原因并不是DXT1精度不够,而是因为法向量的单位化。
        DXT1是用双16位色进行插值的,每像素存了两位的插值权值,这样共有2^18种取值。
        但是对于法线贴图其中只有长度为1的取值有用。例如切空间法线贴图Z的取值是由XY的取值唯一确定的。这样,XY的取值只有在单位圆以内的那些点即只有        2^5*2^6*PI/4        = 1068种取值。
        而经过法线延长处理后压缩的法线贴图,XYZ中必然有一个绝对值为1
        Z= 1 时有 2^5*2^6                 =2^11        种取值
        X= 1 时有 2^5*2^6/2        =2^10        种取值
        X=-1 时有 2^5*2^6/2        =2^10        种取值       
        Y= 1 时有 2^5*2^5/2        =2^9        种取
        Y=-1 时有 2^5*2^5/2        =2^9        种取值
        共5120种取值范围扩大了许多。
       
        总结讨论
       
        法线延长算法实现简单,但却使dxt1压缩法线成为可能,极大地提高了显卡总线和CACHE的效率。
        省略了向量单位化过程,在sm1.0以前这还是很大的开销。
        抛砖引玉而已。
        更进一步,如果有一种编码方法能把2^18种取值都用于存储法线那就更精确了。
       
        例程
       
        命令行下的处理程序,含源程序,输入输出均为R8G8B8格式的DDS文件.
        格式 
        textconv 输入法线贴图文件名 输入漫反射贴图文件名 输出法线贴图文件名 输出漫反射贴图文件名
        例如:
       
        textconv iNORMAL.DDS iCOLOR.DDS oNORMAL.DDS oCOLOR.DDS
       
        然后请再用压缩工具将输出文件转化成DXT1格式,推荐使用NVDXT。
        但是注意最好不要使用这个工具自动生成的mipmaps。
       
        如果有什么问题
        请联系
       
        zhouhe@163.com

        我目前还在上大学,毕业之前还会发几篇算法:
《法线扰动---预处理实现动态"radiosity"》《几种光照贴图的比较》

sf_20076995831.rar

22.7 KB, 下载次数:

13

主题

49

帖子

60

积分

注册会员

Rank: 2

积分
60
 楼主| 发表于 2007-6-9 10:00:00 | 显示全部楼层

Re: DXT1格式压缩高质量法线贴图

例图
sf_20076995949.jpg

13

主题

49

帖子

60

积分

注册会员

Rank: 2

积分
60
 楼主| 发表于 2007-6-9 10:01:00 | 显示全部楼层

Re: DXT1格式压缩高质量法线贴图

例图
sf_20076910049.jpg

13

主题

49

帖子

60

积分

注册会员

Rank: 2

积分
60
 楼主| 发表于 2007-6-9 10:02:00 | 显示全部楼层

Re: DXT1格式压缩高质量法线贴图

使用法线延长处理
sf_20076910158.jpg

13

主题

49

帖子

60

积分

注册会员

Rank: 2

积分
60
 楼主| 发表于 2007-6-9 10:03:00 | 显示全部楼层

Re: DXT1格式压缩高质量法线贴图

未处理
sf_20076910244.jpg

13

主题

49

帖子

60

积分

注册会员

Rank: 2

积分
60
 楼主| 发表于 2007-6-9 10:05:00 | 显示全部楼层

Re:DXT1格式压缩高质量法线贴图

另外关于法线贴图压缩的3DC与swizzled DXT5格式,大家可以参考

http://ati.de/developer/NormalMapCompression.pdf

4

主题

45

帖子

45

积分

注册会员

Rank: 2

积分
45
发表于 2007-6-9 16:27:00 | 显示全部楼层

Re:DXT1格式压缩高质量法线贴图

dxt1和2是16位的,其他是32位的,是以失真为前提的,之所以觉得还是高质量,是因为这个法线贴图本身并不高质量而已.
不过做游戏的话应该已经足够了吧.

8

主题

245

帖子

245

积分

中级会员

Rank: 3Rank: 3

积分
245
发表于 2007-6-9 20:48:00 | 显示全部楼层

Re:DXT1格式压缩高质量法线贴图

请教LZ一个问题,,目前法线贴图使用之后对效率的影响严重吗?

13

主题

49

帖子

60

积分

注册会员

Rank: 2

积分
60
 楼主| 发表于 2007-6-10 10:22:00 | 显示全部楼层

Re:DXT1格式压缩高质量法线贴图

回复楼上:
目前,法线贴图是十分廉价的,入门级的,在固定管线就可以使用。
如果使用shader,有三种情况:
1.ps2.0 nrm指令单位化。 需要一条贴图指令,两条算术指令。
2.ps1.0 cubicmap单位化。 需要两条贴图指令,一条算术指令。
3.不做任何单位化,就像本文中提供的算法,需要一条贴图指令,一条算术指令。
我发现其中贴图指令耗时较多,毕竟是读内存操作。而贴图指令耗时很是手贴图格式的影响。
我使用的显卡是geforce6200a,用a8r8g8b8和dxt1速度比是1:2.5左右。
(当然并没有夸张到1:8因为算术指令也是要耗时间的)
目前还有relief mapping、parallax occlcusion mapping 等等更牛的凹凸贴图算法,他门的耗时相当巨,但还是被quake4等游戏采用着。

54

主题

2918

帖子

3765

积分

论坛元老

Rank: 8Rank: 8

积分
3765
QQ
发表于 2007-6-11 18:29:00 | 显示全部楼层

Re: Re:DXT1格式压缩高质量法线贴图

RAIDENII: ReXT1格式压缩高质量法线贴图

请教LZ一个问题,,目前法线贴图使用之后对效率的影响严重吗?


肯定严重。
如果同屏出现人数不多的话可以考虑。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-6-8 15:23

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表