[PBS真的可以为所欲为] Unreal材质模型源码分析

http://blog.sina.com.cn/s/blog_76d02ce90102xr4x.html


unreal应该算是现在最实用的开源渲染引擎之一了


基于物理的渲染(PBS)用起来真的是为所欲为

这里决定花点时间研究下unreal低层的渲染代码,这里假设读者具有基本的渲染知识,至少知道BRDF是什么

引擎中的着色器代码都在Engine/Shaders中,不同版本之间会有些差别,不过不会差太多就是了

这里使用的版本是4.17

打开Engine/Shaders/Private文件夹,可以看见大量的.usf和.ush文件,这些就是unreal渲染的核心
[PBS真的可以为所欲为] Unreal材质模型源码分析_第1张图片


两者的语法都类似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);

你可能感兴趣的:(【Unreal】)