渲染中的光照着色方式:PBR(Physically Based Rendering,物理基础渲染)与 传统经验渲染
参考《Unity Shader 入门精要》十八章 基于物理的渲染
游戏中的物体着色方式有以下几种:
- 基于物理着色 (Physically Based Shading)
- 简单着色 (传统经验渲染)(Simple Shading)
- 烘焙光照着色 (Baked Lit Shading)
- 无光照 (No lighting)
与PBR(Physically Based Rendering,物理基础渲染)对应的渲染方法通常被称为“传统渲染”或“基于经验的渲染”(Empirical Rendering)。以下是两者的主要区别:
传统渲染
传统渲染方法基于经验规则和艺术调整,而不是物理定律。这种方法主要依赖于开发人员和艺术家的直觉和经验,通过调整各种参数和技巧来实现所需的视觉效果。
特点
-
经验法则:
- 传统渲染方法依赖于经验法则和艺术调整,而非严格的物理模拟。
-
简单的光照模型:
- 使用简单的光照模型,如 Phong 着色模型、Blinn-Phong 着色模型和 Lambert 着色模型。
-
不一定遵循能量守恒:
- 光照计算不一定遵循能量守恒原则,可能导致非物理的光照效果。
-
容易实现和调整:
- 实现相对简单,适用于硬件性能有限或开发周期较短的项目。
常见的传统着色模型
-
Phong 着色模型:
- 计算出每个顶点的颜色,并在片元(像素)阶段进行插值。
-
Blinn-Phong 着色模型:
- Phong 模型的改进版,引入了半角向量以简化计算。
-
Lambert 着色模型:
- 仅考虑漫反射光。
PBR(Physically Based Rendering,物理基础渲染)是一种计算机图形学技术,用于实现更加逼真和一致的光照效果。PBR 通过模拟光与物体表面相互作用的物理原理,生成更加真实的图像。PBR 着色模型的核心理念是将物理属性作为基础,结合环境光和材质属性,计算出最终的光照效果。
PBR 的基本概念
PBR 基于以下几个核心概念:
-
BRDF(双向反射分布函数):
- BRDF 描述了光线如何从表面反射。常用的 BRDF 模型包括 Lambertian(用于漫反射)和 Cook-Torrance(用于镜面反射)。
-
能量守恒:
- PBR 着色模型遵循能量守恒原理,即反射的光线总能量不会超过入射光线的总能量。
-
微表面理论:
- 微表面理论假设表面由许多微小的面片组成,这些面片的法线方向分布决定了光的反射特性。
PBR 的材质属性
PBR 着色通常使用以下几种材质属性:
-
Albedo(反照率):
- 表示表面的基础颜色,不包含任何光照信息。
-
Metalness(金属度):
- 表示材质的金属性质。金属材质的金属度为1,非金属材质的金属度为0。金属材质通常会影响表面的反射特性和颜色。
-
Roughness(粗糙度):
- 描述表面的光滑程度。粗糙度为0表示完全光滑的表面,粗糙度为1表示完全粗糙的表面。粗糙度会影响高光的扩散程度。
-
Normal(法线):
- 用于表示表面的法线方向,影响光线的反射和折射。
-
Ambient Occlusion(环境光遮蔽):
- 表示表面的自阴影效果,用于模拟小范围内的光线遮蔽。
-
Specular(镜面反射):
- 用于非金属材质,表示镜面反射的颜色和强度。
PBR 着色模型
常见的 PBR 着色模型包括:
-
金属/粗糙度(Metallic/Roughness):
- 使用 Albedo、Metalness 和 Roughness 等属性。
- Unity 标准着色器使用的就是这种模型。
-
镜面/光滑度(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" }
具体的实现步骤
-
计算半角向量:
float3 halfVector = normalize(lightDir + viewDir);
-
计算 Fresnel 项:
float3 F = F0 + (1.0 - F0) * pow(1.0 - dot(viewDir, halfVector), 5.0);
-
计算几何遮蔽项:
float G = G_Smith(normal, viewDir, lightDir, roughness);
-
计算微表面法线分布项:
float D = D_GGX(normal, halfVector, roughness);
-
计算 Cook-Torrance BRDF:
float3 specular = (D * G * F) / (4 * dot(normal, lightDir) * dot(normal, viewDir));
通过这些步骤,可以实现 PBR 的核心计算,并将结果用于最终的光照计算,从而生成逼真的光照效果。
总结
PBR(物理基础渲染)基于模拟光线与物体表面相互作用的物理原理,通过 BRDF(特别是 Cook-Torrance BRDF)实现更为逼真的光照效果。PBR 的核心概念包括能量守恒、微表面理论和 Fresnel 效应,其数学实现涉及 Fresnel 项、几何遮蔽项和微表面法线分布项。通过这些理论和数学模型,可以在游戏和图形应用中实现高度逼真的材质和光照效果。