工作经历
环境相关
大气散射(Atmosphere Scattering)
熟悉算法的基本原理,并在工作室引擎中移植实现并评估3个已有方案,包括Gpu gems2 中的单次散射《Accurate Atmospheric Scattering》,UE4引擎中的AtmosphereFog,以及Brunetons 最新提出的Improved Atmosphere。单次散射效率高,实现简单,但效果略差,尤其在日出夕阳表现不佳。UE4实现的Brunetons 08年《Precomputed Atmosphere Scattering》和 之后的Improved 版本可以进行多次散射(UE4 中限制最多4次),效果很好,但是实时计算效率低下,需要采用预计算的方式存储中间数据查找表(可缓存到硬盘),并在运行时调用。考虑到后者参数意义更为明确,中间数据更加灵活美术方便引擎最终选择了Improved的版本。因为预计算过程需要对每次散射遍历缓存,Inscattering项更是4维数组需要用到3D贴图,同时保证结果完全正确,故此过程略有复杂,最终使用ComputeShader 完成。运行时只需要对缓存的查找表查值,一个简单后期即可搞定。
高度雾(HeightFog)
实现UE4 中的指数级高度雾。
光束(LightShaft)
实现UE4 中的LightShaftBloom 和LightShaftOcclusion两种光束,完成简单的体积光效果。
体积云(VolumetricCloud)
参考地平线论文、在Stingray中的实现、以及Unity中的, 最终在自己的引擎中实现。
云海(Raymarch CloudSea)
参考Untiy FogVolume 插件,使用Raymarch 算法,实现。因为效率问题,最终并没有被应用到重制版中。
后期相关
ColorGrading & Aces Tonemapping
参考UE4 中校色的做法,在HDR空间下,把ACES Tonemapping 和常规ColorGrading校色的转换信息,预生成一个3d的Lut 查找表,运行时一个简单后期实现搞定。
自动曝光, VisulHDR
参考UE4实现,根据屏幕像素颜色离散统计亮度的柱状图,当然也可以根据需求比如Vignette 时,亮度的权重不同,中心比两边低。有了柱状图,计算平均亮度,接着就是自动曝光的常规思路了。当然还可以将柱状图画在屏幕上,方便调试。
Bloom
参考UE4,常规做法,计算画面中灰值,过滤暗部,多次DownSampe 并 高斯模糊,Upsample最终结果加到场景颜色中。
Lensflare
Taa
材质相关
OIT
SkySystem
参考UE4 Ultra 天空插件,在Unity 以及工作室的引擎中实现了其功能,包括简单的天空背景、日月星辰、飘动的云。
特效材质:下雨下雪、河流、瀑布、溶解
光照相关
Enlighten 中间件集成
在4个月评估期间内,负责尝试集成Enlighten,已独立完成引擎场景静态网格、材质、地形导出,交由Enlighten预烘培生成数据,并在引擎运行时使用其数据完成部分GI,但是由于一些原因,导致在大场景下,全部场景数据使用Enlighten的Probe、Lightmap 方案计算均耗时太大,生成中间数据过大,Amd官方停止对Enlighten的更新费用太高等等问题,只能终止对Enlgithen 集成。
地形相关
简单地形管理与绘制(实习):四叉树、曲面细分实现地形Lod
工具相关
RC编辑器 研发
实习期一个人使用Qt的框架,完成内部节点编辑器的研发,节点由xml书写,包括输入、输出、属性、python脚本内容,支持自定义属性控件,支持曲线属性,可用编辑器曲线工具编辑。编辑器扫描磁盘创建节点库,动态解析并创建节点,支持复合节点,复合节点可收藏至磁盘,最终编辑器将遍历整个有向图,生成资源文件传给引擎使用。