渲染中的光照着色方式:PBR(Physically Based Rendering,物理基础渲染)与 传统经验渲染
一本比较牛的PBR书籍:
Unity 从 5.0 版本开始支持 PBR 材质(Standard材质),并且该Shader是开源的,可以去官网下载。
以下是网友分析的Standard.shader源码实现:
Unity shader内置standard代码解析_unity官方的standard-CSDN博客
猴子都懂的Unity Standard Shader - 知乎
Unity Buildin Shaders - Standard Shader | Zuig Blog
一些网友开源的PBR实现:
nylonee/unity-standard-shader-mobile: Mobile optimised shader for Unity 3D
penumbra23/PBR-Shaders: Standard PBR shader written in Unity Cg
gomson/AnisotropicStandardShader:使用各向异性 GGX BRDF 的 Unity 标准着色器的修改版本
Cibbi/Toony-standard: A toon shader with standard elements for vrchat
参考《Unity Shader 入门精要》十八章 基于物理的渲染
游戏中的物体着色方式有以下几种:
- 基于物理着色 (Physically Based Shading)
- 简单着色 (传统经验渲染)(Simple Shading)
- 烘焙光照着色 (Baked Lit Shading)
- 无光照 (No lighting)
与PBR(Physically Based Rendering,物理基础渲染)对应的渲染方法通常被称为“传统渲染”或“基于经验的渲染”(Empirical Rendering)。以下是两者的主要区别:
传统渲染
传统渲染方法基于经验规则和艺术调整,而不是物理定律。这种方法主要依赖于开发人员和艺术家的直觉和经验,通过调整各种参数和技巧来实现所需的视觉效果。
特点
- 
经验法则: - 传统渲染方法依赖于经验法则和艺术调整,而非严格的物理模拟。
 
- 
简单的光照模型: - 使用简单的光照模型,如 Phong 着色模型、Blinn-Phong 着色模型和 Lambert 着色模型。
 
- 
不一定遵循能量守恒: - 光照计算不一定遵循能量守恒原则,可能导致非物理的光照效果。
 
- 
容易实现和调整: - 实现相对简单,适用于硬件性能有限或开发周期较短的项目。
 
常见的传统着色模型
- 
Lambert 着色模型: - 仅考虑漫反射光,是许多更复杂光照模型的基础。
- 
 
- 
fixed3 worldNormal = normalize(i.worldNormal); // 归一化世界空间法线 fixed3 lightDir = normalize(_WorldSpaceLightPos0.xyz); // 获取平行光方向 fixed diff = max(0, dot(worldNormal, lightDir)); // 计算漫反射系数 fixed3 lighting = col.rgb * lightColor * diff; // I_light * c_albedo * diff 
 
- 
Phong 着色模型: - 在Lambert漫反射的基础上,增加了镜面反射(高光) 项。
- 
 
 
- 
Blinn-Phong 着色模型: - Phong 模型的改进版,引入了半角向量以简化计算。
- 
 
 
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 项、几何遮蔽项和微表面法线分布项。通过这些理论和数学模型,可以在游戏和图形应用中实现高度逼真的材质和光照效果。
 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号