

由于最近太忙,一点文章没写。听朋友说终末地内测了(都结束了),才想起来看看终末地的人物渲染如何做的,不得不说这人物渲染和场景渲染非常棒。
先整理下模型。
发现normal通道只有1float,猜测是法线做了压缩,这部分具体使用情况后续再分析。

mesh内可以看到存了gpu骨骼动画相关的通道。

Houdini里还原下模型各通道信息:

导入Unity先看下UnLit效果:



还原下终末地的法线压缩算法:
private Vector4 DecompressNormal(float compressedValue)
{
uint compressedValueInt = System.BitConverter.ToUInt32(System.BitConverter.GetBytes(compressedValue), 0);
// 分别计算 x, y, z 轴的 normalOSInt
int x = Extract10BitSigned(compressedValueInt,22); // 0-9 bit
int y = Extract10BitSigned(compressedValueInt,12); // 10-19 bit
int z = Extract10BitSigned(compressedValueInt,2); // 20-29 bit
Vector4 normal;
normal.x = x * 0.002f;
normal.y = y * 0.002f;
normal.z = z * 0.002f;
int sign = (int)(compressedValueInt >> 31);
normal.w = sign * 2.0f - 1.0f;
return normal;
}
private static int Extract10BitSigned(uint value, int offset)
{
int bits = (int)(value << offset);
return bits >> 22;
}
需要注意的是,renderdoc默认只保留5位小数点,需要在设置内修改(上面是显示的位数,下面画圈的截断的位数,要修改截断的位数为32),这样导出的数据才能保证精度正确。
