http://blog.sina.com.cn/s/blog_76d02ce90102xr4x.html
unreal应该算是现在最实用的开源渲染引擎之一了
基于物理的渲染(PBS)用起来真的是为所欲为
这里决定花点时间研究下unreal低层的渲染代码,这里假设读者具有基本的渲染知识,至少知道BRDF是什么
引擎中的着色器代码都在Engine/Shaders中,不同版本之间会有些差别,不过不会差太多就是了
这里使用的版本是4.17
打开Engine/Shaders/Private文件夹,可以看见大量的.usf和.ush文件,这些就是unreal渲染的核心
两者的语法都类似GLSL或HLSL,区别是ush没有入口函数,只能被其他ush或usf来引用,而usf有入口函数,不可被应用。
整个Engine/Shaders/Private中有近300个文件,一行一行解释显然不现实,这篇决定优先分析引擎中material的源码
这部分源码主要在ShadingModels.ush中,会引用其他的BRDF.ush,下面来慢慢分析
首先是下面两个函数:
NormalText Code
|
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
// @param DiffSpecMask .r: diffuse, .g:specular e.g. float2(1,1) for both, float2(1,0) for diffuse only
float3 SurfaceShading( FGBufferData GBuffer, float3 LobeRoughness, float3 LobeEnergy, float3 L, float3 V, half3 N, uint2 Random ) { switch( GBuffer.ShadingModelID ) { case SHADINGMODELID_UNLIT: case SHADINGMODELID_DEFAULT_LIT: case SHADINGMODELID_SUBSURFACE: case SHADINGMODELID_PREINTEGRATED_SKIN: case SHADINGMODELID_SUBSURFACE_PROFILE: case SHADINGMODELID_TWOSIDED_FOLIAGE: return StandardShading( GBuffer.DiffuseColor, GBuffer.SpecularColor, LobeRoughness, LobeEnergy, L, V, N ); case SHADINGMODELID_CLEAR_COAT: return ClearCoatShading( GBuffer, LobeRoughness, LobeEnergy, L, V, N ); case SHADINGMODELID_CLOTH: return ClothShading( GBuffer, LobeRoughness, LobeEnergy, L, V, N ); case SHADINGMODELID_EYE: return EyeShading( GBuffer, LobeRoughness, LobeEnergy, L, V, N ); default: return 0; } } float3 SubsurfaceShading( FGBufferData GBuffer, float3 L, float3 V, half3 N, float Shadow, uint2 Random ) { float3 SubsurfaceColor = ExtractSubsurfaceColor(GBuffer); |