《使命召唤:无限战争》的多层材质技术,siggraph17,activision.infinity ward带来。
PBR的发展趋势
从activision在cod上面做的一些工作上看,可以明显的看到PBR的发展趋势,从最开始的把基于物理模型,追求数学正确到现在的引入更多的材质属性,更多的光照模型以及他们之间的更加复杂的组合,从表达能力上更加接近真实世界,业内视角就是更加接近电影的渲染。
unified shader/parameter
activision这里的做法形式上是支持多种材质属性并且支持多层:
多属性
首先是将材质分成了三大类:
- surface: normal/roughness
- macro:density/thickness
- micro:材质的介质属性
实际光照模型对于这些属性进行一个完整支持,并且支持多层:
多层
像上图中下面一列的部分都是多层材质的结果(涂油漆的木头等等)
activision做法是,就是一层层的计算,计算包括: - 光的absorption,scattering
- 积累光照的结果
forward lighting+
这些放在一起,deferred shading就不给力了,forward lighting来处理这些复杂的材质计算。
deferred shading从07年killzone2的paper开始正式流行,到现在的PBR的阶段,预计是要逐渐退出历史舞台了。
material compiler
形式上更加趋近于电影的方式。
具体的技术细节
opacity计算
这里就是考虑到alpha和thickness
直接代码吧:
float PhysicallyBased_GeometricOpacity( float NdotV, float alpha, float t ) // t - thickness
{
float x = NdotV;
float g = 1.0f - ( x / ( x * ( 1.0 - t ) + t ) ); // Smith-Schlick G
return lerp( alpha, 1.0f, g ); // base opacity lerp to ‘shadowed’. Counteracts opacity change due to mips
}
thin fim layer
thin film这里讲得是材质表面上盖得另外一层比较薄的一层,但是会影响光的wavelength的这种材质。
这种材质的表达,会很大的影响材质的表达能力
hmm推理过程套路就还是那些,要点是我们要知道有这么个东西,而从早期pbr过来的时候,这些概念还比较缺乏,而直接上movie industry的一套,取舍的研究要做很久,知道那个在实际游戏中用那个不用即可,细节直接看论文吧,贴下代码:
float3 ApplyThinFilm( float3 fresnel, float NdotL, float2 thicknessAndIntensity, float3 specSample ){
float3 lutSample = thinFilmLUT.SampleLevel( linear, float2( thicknessAndIntensity.x, NdotL ), 0 ).rgb - 0.5f;
float3 intensity = thicknessAndIntensity.y * 4.0f * ( specSample * ( 1.0f - specSample ) );
return saturate( lutSample * intensity + fresnel );}
float3 PhysicallyBased_GetPrimaryFresnelWithSpecColor( SurfaceAttributes surfaceAttributes, float dotH ){
float3 primaryFresnel = SchlickPrimaryFresnel( abs( dotH ), surfaceAttributes.specColor );
return = ApplyThinFilm( primaryFresnel, abs( dotH ), surfaceAttributes.thinFilmThicknessAndIntensity, surfaceAttributes.specColor ); }