光照模型公式与对比速查表

本表汇总了 The Unity Shaders Bible 第 7-8 章中涉及的所有光照模型公式、Shader 实现要点和跨引擎对比。

一、光照公式速查

1.1 环境光(Ambient Color)

光照公式ambient = UNITY_LIGHTMODEL_AMBIENT × _Ambient

输入:全局环境颜色 + 强度标量 [0, 1]

输出:float3 RGB 环境色

Unity 变量UNITY_LIGHTMODEL_AMBIENT

说明:最简单的全局光照近似,无方向性。在 Unity 中通过 Lighting 窗口的 Environment 面板配置。

1.2 Lambert 漫反射

光照公式D = Dr× Dl× max(0,n·l)

输入:法线 n,光照方向 l,光源颜色 Dr,光源强度 Dl

输出:float3 RGB 漫反射色

Unity 变量_WorldSpaceLightPos0(光照方向)、_LightColor0(光源颜色)

1.3 Blinn-Phong 高光反射

光照公式

h= normalize(l+e)(半程向量)

S = Sa× Sp× max(0,n·h)p

输入:法线 n,光照方向 l,视线方向 e,高光颜色 Sa,高光强度 Sp,指数 p [1, 128]

输出:float3 RGB 高光色

Unity 变量_WorldSpaceCameraPos(相机位置,用于计算视线方向)

1.4 环境反射(Cubemap)

光照公式

r= reflect(e,n) =e− 2n(n·e)

cubemap = texCUBElod(samplerCUBE, float4(r, detail))

reflection = intensity × cubemap.rgb × (cubemap.a × exposure)

快捷方法UNITY_SAMPLE_TEXCUBE(unity_SpecCube0, reflect_world)

输出:float3 RGB 环境反射色

1.5 Fresnel 效应(菲涅尔效应)

光照公式

F = pow(1 − saturate(n·e), power)

输入:法线 n,视线方向 e,指数 power

输出:float(标量,范围 [0, 1])

物理意义:视线与法线夹角越大(掠射角),反射越强

1.6 Schlick Fresnel 近似(PBR)

公式

F(θ) = F0 + (1 − F0) × (1 − cosθ)5

其中 cosθ = saturate(n·e)F0 为法线入射反射率

F0 参考值

材质类型F0
非金属0.02
玻璃非金属0.04
塑料非金属0.04-0.05
钻石非金属0.17
金属0.56
金属0.71
金属0.95

二、标准 Lighting 函数实现模板

2.1 LambertShading

2.2 SpecularShading (Blinn-Phong)

2.3 AmbientReflection (Cubemap)

2.4 Fresnel 效应

三、Unity 内置变量速查

变量名类型说明所属
UNITY_LIGHTMODEL_AMBIENTfloat4环境光颜色UnityCG.cginc
_WorldSpaceLightPos0float4方向光方向(世界空间)UnityCG.cginc
_LightColor0float4光源颜色需手动声明
_WorldSpaceCameraPosfloat3相机位置(世界空间)UnityCG.cginc
_ProjectionParamsfloat4x: 翻转标志, y: Znear, z: Zfar, w: 1/Zfar内置
_ScreenParamsfloat4x: 宽度, y: 高度, z: 1+1/宽, w: 1+1/高内置
unity_ObjectToWorldfloat4x4物体→世界矩阵内置
unity_WorldToObjectfloat4x4世界→物体矩阵内置
unity_SpecCube0samplerCUBE默认反射探针内置
_ShadowMapTexturesampler2D阴影贴图(Built-in RP)AutoLight.cginc

四、PBR 参数对照表

Unity StandardUnreal EngineFilamentThree.js物理意义
AlbedoBase ColorBaseColorcolor / map表面基础颜色(非金属的漫反射色 / 金属的 F0)
MetallicMetallicMetallicmetalness金属度:0=绝缘体, 1=导体
SmoothnessRoughness(反向)Roughnessroughness(反向)表面光滑程度(1=完美镜面, 0=完全粗糙)
NormalNormalNormalnormalMap法线贴图(切线空间)
OcclusionAmbient OcclusionAmbient OcclusionaoMap环境光遮蔽
EmissionEmissive ColorEmissiveemissive / emissiveMap自发光(不受光照影响)

五、阴影映射速查

5.1 Built-in RP 阴影宏

使用位置作用
V2F_SHADOW_CASTERv2f 结构体声明阴影投射所需的插值器
TRANSFER_SHADOW_CASTER_NORMALOFFSET(o)vert 函数变换顶点坐标 + 法线偏移
SHADOW_CASTER_FRAGMENT(i)frag 函数输出阴影深度值
SHADOW_COORDS(n)v2f 结构体声明阴影 UV 坐标在 TEXCOORD[n]
TRANSFER_SHADOW(o)vert 函数计算阴影 UV 坐标
SHADOW_ATTENUATION(i)frag 函数获取阴影衰减值 [0, 1]

5.2 URP 阴影关键函数

函数/宏所在文件作用
TransformObjectToHClip()Core.hlsl物体空间→齐次裁剪空间
GetVertexPositionInputs()ShaderVariablesFunctions.hlsl获取顶点位置信息
GetShadowCoord()Shadows.hlsl计算阴影坐标
GetMainLight(shadowCoord)Lighting.hlsl获取主光源信息(含阴影衰减)

5.3 常见阴影问题及解决方案

问题现象解决方案
Shadow Acne(阴影锯齿)表面条带状闪烁增加 Depth Bias
Peter Panning(阴影漂浮)阴影与物体分离减小 Depth Bias 或调整 Normal Bias
锯齿边缘阴影边缘有锯齿提高 Shadow Map 分辨率 / 开启 PCF
阴影完全消失所有阴影不见了检查 Light Mode 标签和 Shader 变体编译

六、引擎光照模型跨平台对比

功能Unity (Built-in)Unity (URP)Unreal EngineGodotThree.js
Shader 语言CG/HLSLHLSLHLSL (USD)GLSL (Godot Shader)GLSL (WebGL)
默认光照模型Standard (Cook-Torrance)Lit (Cook-Torrance)Default Lit (Cook-Torrance)StandardMaterial3DMeshStandardMaterial
PBR 工作流Metallic / SpecularMetallicMetallicMetallic / SpecularMetallic / Specular
PBR 工作流Surface ShaderShader Graph / HLSLMaterial GraphShader Graph (4.0+)Material (JS)
阴影默认方法Shadow Mapping + PCFShadow Mapping + PCFShadow Mapping / DF SoftShadow Mapping + PCFShadow Mapping + PCF
环境反射Reflection ProbeReflection ProbeReflection CaptureReflectionProbeCubeCamera / envMap

七、推荐资源


教材对照The Unity Shaders Bible Chapter II, Sections 6.0.1—8.0.6