魔兽世界虽然是一个老游戏了,但是它在图形渲染上还在不断地更新,虽然跟现在的很多引擎相比有些方面不是同一时代的,但是不得不说魔兽世界有些地方做的很到位,他的反射就用了一个很讨巧的方法就是前面一直提到的Screen Space Local Reflection(SSLR),这方面魔兽世界应该说是做的最好的,只用了一次检测就可以模拟反射,应该和MotorGP类似,但是魔兽世界的过渡过的很长出色,让你很难觉察到瑕疵。
对于中低端显卡来说水的反射是一个很费的操作,我尝试了Screen Space Local Reflection(SSLR),一提到SSLR可能大家会想到Crysis的Presentation,实际上这并不是一个新技术,在魔兽世界TBC之后的资料片里魔兽世界的水的反射就是用的这个技术,而且魔兽世界的方法比Crysis更加简单。当时的魔兽世界还能通过nvPerfHud来Cpature,抓到了水的ps的asm,经过分析发现魔兽的方法非常简单,只是沿着反射的方向cast了一根射线,然后把这个射线投影到当前摄像机的屏幕空间,如果接近当前屏幕空间就fadeout掉。下面给出了我从魔兽世界的asm中整理出来的Local Reflection的shader代码,可能和魔兽世界的有些不同,毕竟是将asm理解后自己写出来的。出于公司保密,还是把给出的Shader删掉了,不好意思。
float4 CalcLocalReflection(float3 viewDir, float3 normal,float3 reflectDir, float3 waterPos, float factor, float depthSoft,float2 screenUv);