好久没写这样的系列了,上一次总结渲染的改进,还是4.5的时候。最近,又对KlayGE的渲染做了一些系统性的修改,所以在这里总结一下。
材质系统
原先的材质系统里,diffuse颜色和specular颜色是分开的。要放到GBuffer里的时候,specular颜色就剩下亮度,之后跟光的亮度操作后,从diffuse的颜色恢复出specular颜色。这只是一个情非得已的hack,因为G-Buffer里只有4个通道可供使用,放不下diffuse和specular颜色。
2015年的Physics and Math of Shading里,详细分析了导体、绝缘体、半导体的diffuse和specular分布,得到的结论是,只需要有个albedo的颜色(3通道)以及一个metalness(1通道),就已经足够。因为导体的diffuse是0,绝缘体的s ...
上一篇讲了基于CS的TBDR,目前KlayGE中一共有三条deferred的code path,传统的DR,基于PS的TBDR和基于CS的TBDR。但不论是什么样的deferred,都不可避免需要在G-Buffer上存normal。对G-Buffer优化的重要议题之一也是如何尽量紧凑地存储normal。
原先的做法
在KlayGE 4.0之前,G-Buffer是2张64bpp的纹理,normal用spheremap transform的方式存在2个fp16的通道里,共32bit。这样的G-Buffer占用空间相当大。在4.0的时候,G-Buffer改成了2张32bpp的纹理,normal用best fit的方法存在3个8bit通道里,共24bit。Best fit的有效位数是23bit,两个fp16的总有效位数是22bit,所以这么做反而有助于质量提升。
Normal压缩
Normal的压缩其实应该分为两 ...