渲染中的光照着色方式:PBR(Physically Based Rendering,物理基础渲染)与 传统经验渲染

参考《Unity Shader 入门精要》十八章 基于物理的渲染

游戏中的物体着色方式有以下几种:

 

与PBR(Physically Based Rendering,物理基础渲染)对应的渲染方法通常被称为“传统渲染”或“基于经验的渲染”(Empirical Rendering)。以下是两者的主要区别:

传统渲染

传统渲染方法基于经验规则和艺术调整,而不是物理定律。这种方法主要依赖于开发人员和艺术家的直觉和经验,通过调整各种参数和技巧来实现所需的视觉效果。

特点

  1. 经验法则

    • 传统渲染方法依赖于经验法则和艺术调整,而非严格的物理模拟。
  2. 简单的光照模型

    • 使用简单的光照模型,如 Phong 着色模型、Blinn-Phong 着色模型和 Lambert 着色模型。
  3. 不一定遵循能量守恒

    • 光照计算不一定遵循能量守恒原则,可能导致非物理的光照效果。
  4. 容易实现和调整

    • 实现相对简单,适用于硬件性能有限或开发周期较短的项目。

常见的传统着色模型

  1. Phong 着色模型

    • 计算出每个顶点的颜色,并在片元(像素)阶段进行插值。
  2. Blinn-Phong 着色模型

    • Phong 模型的改进版,引入了半角向量以简化计算。
  3. Lambert 着色模型

    • 仅考虑漫反射光。

 

PBR(Physically Based Rendering,物理基础渲染)是一种计算机图形学技术,用于实现更加逼真和一致的光照效果。PBR 通过模拟光与物体表面相互作用的物理原理,生成更加真实的图像。PBR 着色模型的核心理念是将物理属性作为基础,结合环境光和材质属性,计算出最终的光照效果。

PBR 的基本概念

PBR 基于以下几个核心概念:

  1. BRDF(双向反射分布函数)

    • BRDF 描述了光线如何从表面反射。常用的 BRDF 模型包括 Lambertian(用于漫反射)和 Cook-Torrance(用于镜面反射)。
  2. 能量守恒

    • PBR 着色模型遵循能量守恒原理,即反射的光线总能量不会超过入射光线的总能量。
  3. 微表面理论

    • 微表面理论假设表面由许多微小的面片组成,这些面片的法线方向分布决定了光的反射特性。

PBR 的材质属性

PBR 着色通常使用以下几种材质属性:

  1. Albedo(反照率)

    • 表示表面的基础颜色,不包含任何光照信息。
  2. Metalness(金属度)

    • 表示材质的金属性质。金属材质的金属度为1,非金属材质的金属度为0。金属材质通常会影响表面的反射特性和颜色。
  3. Roughness(粗糙度)

    • 描述表面的光滑程度。粗糙度为0表示完全光滑的表面,粗糙度为1表示完全粗糙的表面。粗糙度会影响高光的扩散程度。
  4. Normal(法线)

    • 用于表示表面的法线方向,影响光线的反射和折射。
  5. Ambient Occlusion(环境光遮蔽)

    • 表示表面的自阴影效果,用于模拟小范围内的光线遮蔽。
  6. Specular(镜面反射)

    • 用于非金属材质,表示镜面反射的颜色和强度。

PBR 着色模型

常见的 PBR 着色模型包括:

  1. 金属/粗糙度(Metallic/Roughness)

    • 使用 Albedo、Metalness 和 Roughness 等属性。
    • Unity 标准着色器使用的就是这种模型。
  2. 镜面/光滑度(Specular/Glossiness)

    • 使用 Albedo、Specular 和 Glossiness 等属性。

Unity 中的 PBR

在 Unity 中,可以使用标准着色器(Standard Shader)实现 PBR。Unity 标准着色器支持金属/粗糙度模型,可以通过材质属性面板设置相关参数。

 

物理基础渲染(PBR)的理论和数学实现基于模拟光线与物体表面相互作用的物理原理。PBR的核心是BRDF(双向反射分布函数),它描述了入射光线和反射光线之间的关系。以下是PBR的理论基础和数学实现的详细介绍。

PBR 的理论基础

1. 能量守恒

PBR 遵循能量守恒原理,即反射的光线总能量不会超过入射光线的总能量。反射光和吸收光之和等于入射光。

2. 微表面理论

微表面理论假设表面由许多微小的面片组成,这些面片的法线方向分布决定了光的反射特性。

3. Fresnel 效应

Fresnel 效应描述了反射光的强度随着观察角度的变化而变化。对于金属材质,反射光颜色与材质颜色相关;对于非金属材质,反射光为白色。

4. Cook-Torrance BRDF

Cook-Torrance BRDF 是一种常用的 BRDF 模型,它由三部分组成:Fresnel 项、几何项和微表面法线分布项。

PBR 的数学实现

1. Cook-Torrance BRDF

Cook-Torrance BRDF 用于计算反射光的强度和颜色。其公式如下:

2. Fresnel 项

Fresnel 项描述了反射光的强度随着观察角度的变化:

3. 几何遮蔽项

几何遮蔽项描述了光线被遮蔽的程度:

4. 微表面法线分布项

微表面法线分布项描述了表面微法线的分布:

PBR 着色器示例

以下是一个使用 Cook-Torrance BRDF 的 Unity 着色器示例:

Shader "Custom/PBRShader"
{
    Properties
    {
        _MainTex("Albedo (RGB)", 2D) = "white" {}
        _Metallic("Metallic", Range(0.0, 1.0)) = 0.0
        _Glossiness("Smoothness", Range(0.0, 1.0)) = 0.5
        _NormalMap("Normal Map", 2D) = "bump" {}
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 200

        CGPROGRAM
        #pragma surface surf Standard fullforwardshadows

        sampler2D _MainTex;
        sampler2D _BumpMap;
        half _Metallic;
        half _Glossiness;

        struct Input
        {
            float2 uv_MainTex;
            float2 uv_BumpMap;
        };

        void surf(Input IN, inout SurfaceOutputStandard o)
        {
            half4 c = tex2D(_MainTex, IN.uv_MainTex);
            o.Albedo = c.rgb;
            o.Metallic = _Metallic;
            o.Smoothness = _Glossiness;
            o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap));
        }
        ENDCG
    }
    FallBack "Diffuse"
}

具体的实现步骤

  1. 计算半角向量

    float3 halfVector = normalize(lightDir + viewDir);
  2. 计算 Fresnel 项

    float3 F = F0 + (1.0 - F0) * pow(1.0 - dot(viewDir, halfVector), 5.0);
  3. 计算几何遮蔽项

    float G = G_Smith(normal, viewDir, lightDir, roughness);
  4. 计算微表面法线分布项

    float D = D_GGX(normal, halfVector, roughness);
  5. 计算 Cook-Torrance BRDF

    float3 specular = (D * G * F) / (4 * dot(normal, lightDir) * dot(normal, viewDir));

通过这些步骤,可以实现 PBR 的核心计算,并将结果用于最终的光照计算,从而生成逼真的光照效果。

总结

PBR(物理基础渲染)基于模拟光线与物体表面相互作用的物理原理,通过 BRDF(特别是 Cook-Torrance BRDF)实现更为逼真的光照效果。PBR 的核心概念包括能量守恒、微表面理论和 Fresnel 效应,其数学实现涉及 Fresnel 项、几何遮蔽项和微表面法线分布项。通过这些理论和数学模型,可以在游戏和图形应用中实现高度逼真的材质和光照效果。

posted @ 2024-06-18 16:20  JeasonBoy  阅读(8)  评论(0编辑  收藏  举报