Unity3D インタビュー古典:PBR レンダリングプロセスの詳細な説明

はじめに
PBR (物理ベース レンダリング) は、物理光学原理に基づいたレンダリング テクノロジであり、物体表面の光の反射と屈折の効果をより現実的にシミュレートできます。Unity3D では、PBR レンダリングが主流のレンダリング方法になっているため、Unity3D 開発者にとって PBR レンダリング プロセスを習得することは非常に重要です。この記事では、BRDF モデル、周囲光のオクルージョン、グローバル イルミネーション、間接イルミネーションなどを含む、Unity3D での PBR レンダリングのプロセスを詳細に紹介し、対応するコードの実装を示します。

はい、ここにゲーム開発交流グループがあります。皆さんもクリックして一緒に開発経験を交換していただければ幸いです。

BRDF モデル
BRDF (双方向反射率分布関数) は、入射光に対する物体表面の反射特性を記述する反射分布関数を指します。PBR レンダリングでは、Lambertian モデルと Cook-Torrance モデルという 2 つの一般的に使用される BRDF モデルがあります。

ランバーシアン モデルは最も単純な BRDF モデルであり、物体の表面は完全に粗く、入射光は物体の表面でランダムに反射され、反射光の強度は入射光の強度に比例すると仮定します。 。Unity3D では、ランバーシアン モデルに対応するシェーダー コードは次のとおりです。

シェーダー "カスタム/ランバーシアン" { プロパティ { _MainTex ("テクスチャ", 2D) = "白" {} }サブシェーダー { タグ { "RenderType"="不透明" } LOD 100





    CGPROGRAM
    #pragma surface surf Lambert
    sampler2D _MainTex;

    struct Input {
        float2 uv_MainTex;
    };

    void surf (Input IN, inout SurfaceOutput o) {
        o.Albedo = tex2D (_MainTex, IN.uv_MainTex).rgb;
    }
    ENDCG
}
FallBack "Diffuse"


Cook-Torrance モデルは、オブジェクト表面の粗さと鏡面反射を考慮した、より複雑な BRDF モデルですUnity3D では、Cook-Torrance モデルに対応するシェーダー コードは次のとおりです。

シェーダ “Custom/Cook-Torrance” { プロパティ { _MainTex (“テクスチャ”, 2D) = “白” {} _Metallic (“メタリック”, Range(0,1)) = 0 _Glossiness (“滑らかさ”, Range(0, 1)) = 0.5 }サブシェーダー { タグ { “RenderType”=“Opaque” } LOD 100







    CGPROGRAM
    #pragma surface surf Standard
    sampler2D _MainTex;
    float _Metallic;
    float _Glossiness;

    struct Input {
        float2 uv_MainTex;
    };

    void surf (Input IN, inout SurfaceOutputStandard o) {
        o.Albedo = tex2D (_MainTex, IN.uv_MainTex).rgb;
        o.Metallic = _Metallic;
        o.Smoothness = _Glossiness;
    }
    ENDCG
}
FallBack "Standard"

アンビエント
オクルージョン
アンビエント オクルージョンは、オブジェクトの表面ジオメトリのオクルージョンによって引き起こされるシャドウ効果を指します。PBR レンダリングでは、アンビエント オクルージョンは、オブジェクトの表面と周囲の環境の間のオクルージョンの度合いを計算することで、このシャドウ効果をシミュレートできます。Unity3D では、AmbientOcclusion マップを使用してアンビエント オクルージョンを実現できます。AmbientOcclusion マップには、オブジェクトの表面上の各ピクセルの環境オクルージョンの程度に関する情報が含まれています。アンビエント オクルージョン エフェクトは、このマップをシェーダで使用することによって実現されます。Unity3D では、次のコードを通じて環境光のオクルージョンを実現できます。

Shader “Custom/Cook-Torrance-AO” { Properties { _MainTex (“Texture”, 2D) = “white” {} _Metallic (“Metallic”, Range(0,1)) = 0 _Glossiness (“Smoothness”, Range( 0,1)) = 0.5 _Occlusion (“オクルージョン”, 2D) = “白” {} }サブシェーダー { タグ { “RenderType”=“Opaque” } LOD 100








    CGPROGRAM
    #pragma surface surf Standard
    sampler2D _MainTex;
    sampler2D _Occlusion;
    float _Metallic;
    float _Glossiness;

    struct Input {
        float2 uv_MainTex;
        float2 uv_Occlusion;
    };

    void surf (Input IN, inout SurfaceOutputStandard o) {
        o.Albedo = tex2D (_MainTex, IN.uv_MainTex).rgb;
        o.Metallic = _Metallic;
        o.Smoothness = _Glossiness;
        o.Occlusion = tex2D (_Occlusion, IN.uv_Occlusion).r;
    }
    ENDCG
}
FallBack "Standard"

}
グローバル イルミネーション
グローバル イルミネーション (グローバル イルミネーション) は、シーン内の光の複数の反射と屈折によって引き起こされる間接照明効果を指します。PBR レンダリングでは、Unity3D の組み込みライティング システムを使用してグローバル イルミネーションを実現できます。Unity3D の組み込みライティング システムには、リアルタイム ライティングと事前計算されたライティングという 2 つのメソッドが含まれています。

リアルタイム ライティングとは、実行時に照明効果を計算することを指し、これによりリアルタイムの動的な照明効果を実現できます。Unity3D では、Lighting モジュールを使用してリアルタイム ライティングを実現できます。ライティング モジュールには、リアルタイム ライティング、リアルタイム シャドウ、リアルタイム リフレクションなどの機能が含まれており、これらの機能は、ライティング コンポーネントをシーンに追加することで有効になります。Unity3D では、次のコードを通じてリアルタイム ライティングを有効にすることができます。

void Start () { ライト light = GetComponent(); light.type = LightType.Directional; ライト.カラー = カラー.ホワイト; 光の強度 = 1.0f; light.shadows = ライトシャドウ.ソフト; light.shadowStrength = 0.7f; light.shadowBias = 0.05f; light.shadowNormalBias = 0.4f; light.shadowNearPlane = 0.1f; light.renderMode = LightRenderMode.ForcePixel; light.cullingMask = 1 << LayerMask.NameToLayer(“デフォルト”); light.useOcclusionCulling = true; ライト.バウンス強度 = 0; light.lightmapBakeType = LightmapBakeType.Realtime; ライト.フレア = null; }
















事前計算されたライティングとは、エディターでシーン上でライティング計算を実行し、計算結果をライトマップに保存し、最後に実行時にライトマップをロードしてライティング効果を実現することを指します。Unity3D では、Lightmapping モジュールを使用して、事前に計算されたライティングを実現できます。Lightmapping モジュールには、ライトマップの生成および読み込み機能が含まれており、ライトマップ コンポーネントをシーンに追加することで有効にできます。Unity3D では、次のコードを通じて事前計算されたライティングを有効にすることができます。

void Start () { LightmapData[] lightmaps = new LightmapData[2]; lightmaps[0] = new LightmapData(); lightmaps[0].lightmapColor = Resources.Load(“Lightmap-0”); lightmaps[1] = new LightmapData(); lightmaps[1].lightmapColor = Resources.Load(“Lightmap-1”); LightmapSettings.lightmaps = lightmaps; }間接照明間接照明 (間接照明) は、シーン内の光の複数の反射と屈折を指します。これによる間接照明効果。PBR レンダリングでは、Unity3D の組み込みグローバル イルミネーション システムを使用して間接照明を実現できます。Unity3D の組み込みグローバル イルミネーション システムには、リアルタイム グローバル イルミネーションと事前計算されたグローバル イルミネーションの 2 つの方法が含まれています。








リアルタイム グローバル イルミネーションとは、実行時にシーン内のオブジェクトの間接照明効果を計算することを指し、これによりリアルタイムの動的な間接照明効果を実現できます。Unity3D では、リアルタイム グローバル イルミネーション (RGI) を使用してリアルタイム グローバル イルミネーションを実現できます。RGI には、リアルタイム ライティング、リアルタイム間接照明、リアルタイム リフレクションなどの機能が含まれており、これらの機能は、シーンにライティング コンポーネントを追加することで有効になります。Unity3D では、次のコードを通じてリアルタイム グローバル イルミネーションを有効にすることができます。

void Start () { LightProbes プローブ = new LightProbes(); プローブ数 = 1; プローブ.ベイクドプローブ = 新しい SphericalHarmonicsL2[1]; probes.bakedProbes[0] = 新しい SphericalHarmonicsL2(); プローブ.ベイクドプローブ[0][0] = 新しい Vector3(1, 0, 0); プローブ.ベイクドプローブ[0][1] = 新しい Vector3(0, 1, 0); プローブ.ベイクドプローブ[0][2] = 新しい Vector3(0, 0, 1); プローブ.ベイクドプローブ[0][3] = 新しい Vector3(0, 0, 0); プローブ.ベイクドプローブ[0][4] = 新しい Vector3(0, 0, 0); プローブ.ベイクドプローブ[0][5] = 新しい Vector3(0, 0, 0); プローブ.ベイクドプローブ[0][6] = 新しい Vector3(0, 0, 0); プローブ.ベイクドプローブ[0][7] = 新しい Vector3(0, 0, 0); LightmapSettings.lightProbes = プローブ; }














グローバル イルミネーションの事前計算とは、エディタ内のシーンでグローバル イルミネーションの計算を実行し、計算結果をライトマップに保存し、最後に実行時にライトマップをロードしてグローバル イルミネーション効果を実現することを指します。Unity3D では、Baked Global Illumination (BGI) を使用して、事前計算されたグローバル イルミネーションを実現できます。BGI にはライトマップの生成および読み込み機能が含まれており、ライトマップ コンポーネントをシーンに追加することで有効にできます。Unity3D では、次のコードを通じて事前計算されたグローバル イルミネーションを有効にすることができます。

void Start () { LightmapData[] lightmaps = new LightmapData[2]; ライトマップ[0] = 新しいライトマップデータ(); ライトマップ[0].ライトマップカラー = Resources.Load(“ライトマップ-0”); lightmaps[0].lightmapDir = Resources.Load(“Lightmap-0-dir”); ライトマップ[1] = 新しいライトマップデータ(); ライトマップ[1].ライトマップカラー = Resources.Load(“ライトマップ-1”); lightmaps[1].lightmapDir = Resources.Load(“Lightmap-1-dir”); LightmapSettings.lightmaps = ライトマップ; }总结









この記事では、BRDF モデル、環境光のオクルージョン、グローバル イルミネーション、間接イルミネーションなどを含む、Unity3D での PBR レンダリング プロセスを詳細に紹介し、対応するコードの実装を提供します。PBR レンダリング プロセスをマスターすると、Unity3D 開発者がよりリアルなレンダリング効果を実現できるようになります。

添付: ビデオチュートリアル
Unity / Interview Zone Interview Classic: PBR レンダリングプロセスの詳細な説明

おすすめ

転載: blog.csdn.net/weixin_49669470/article/details/131005844