顶点数据压缩

看过敏敏的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/ 

原文地址:https://www.cnblogs.com/oiramario/p/2703277.html