顶点数据压缩

看过敏敏的http://www.klayge.org/2012/09/21/%E5%8E%8B%E7%BC%A9tangent-frame/

今年2、3月份曾经整过这玩意,做到用tangent.w来存handedness,解决了uv mirror的问题

没想到顶点数据压缩还有这么深的学问,于是乎按照资料对max插件进行了修改,效果超出想象

目前做到使用unsigned char x 4来存normal和tangent,short x 2来存texcoord,我们可以大致算一下

之前是normal = float x 3,tangent = float x 4,texcoord = float x 2(还要看一共有几层uv) ,一共是12 + 16 + 8 = 36

压缩之后变成normal = unsigned char x 4,tangent = unsigned char x 4,texcoord = short x 2,一共是4 + 4 + 4 = 12

每个顶点从36字节减少到12字节,少了一半多,通过观察一个20000多面的模型,mesh的大小从1388KB减少到552KB,压缩后是原大小的0.39倍

还没有像文中介绍的那样将tangent frame压缩到仅用8个字节的程度

其优点是数据量大大减少,这样vertex cache的命中率会提高,据观察fps有约5%的提高

其缺点是vs中的计算量稍微增加了一些,另外压缩导致精度上会有损失 


float f =  0.1234567f;
unsigned  char uc = (unsigned  char)((f *  0.5f +  0.5f) *  255);
short s = ( short)((f *  0.5f +  0.5f) *  32767.0f);

float unpackuc = uc *  2.0f /  255.0f -  1.0f;
float unpacks = s *  2.0f /  32767.0f -  1.0f;


unpackuc =  0.12156863
unpacks =  0.12344737

 

参考资料:

http://www.humus.name/Articles/Persson_CreatingVastGameWorlds.pdf 

http://www.crytek.com/download/izfrey_siggraph2011.pdf 

http://fabiensanglard.net/dEngine/index.php 

http://oddeffects.blogspot.com/ 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值