【光照】[光照模型]是什么?以UnityURP为例
【从UnityURP开始探索游戏渲染】专栏-直达
核心定义
光照模型是计算机图形学中用于模拟光线与物体表面相互作用的数学算法,它通过计算光能传播的物理特性,决定场景中每个像素的最终颜色值。其本质是求解光能传输方程的简化实现。
A[光源发射光子] --> B[与物体表面交互]
B --> C[反射/折射/吸收]
C --> D[进入人眼或传感器]
D --> E[形成视觉颜色]
核心组成要素
光照模型通常包含以下物理现象的数学描述:
光-物交互基础组件
| 组件 | 物理原理 | 数学描述 |
|---|---|---|
| 环境光 | 全局间接光照 | Lₐ = kₐ * Iₐ |
| 漫反射 | 朗伯余弦定律 | L_d = k_d * I * max(0, N·L) |
| 镜面反射 | 菲涅尔反射 | L_s = k_s * I * (R·V)^n |
| 自发光 | 物体辐射 | L_e = emissiveColor |
高级光传输特性
- 能量守恒:
入射光能 = 反射光能 + 吸收光能 + 透射光能 - 微表面理论:使用法线分布函数(D)、几何遮蔽(G)、菲涅尔(F)描述微观结构
- 次表面散射:光在材质内部的传播(皮肤、玉石等)
光照模型的数学本质
光照模型是渲染方程的特定解形式:
$$
L_o(x,ω_o) = L_e(x,ω_o) + ∫_Ω f_r(x,ω_i,ω_o) L_i(x,ω_i) (n·ω_i) dω_i
$$
其中:
- $L_o$:出射辐射度
- $f_r$:双向反射分布函数(BRDF)
- $L_i$:入射辐射度
- $(n·ω_i)$:余弦衰减项
光照模型分类体系
游戏中的光照模型分类
A[标准光照模型] --> B[漫反射]
A --> C[高光反射]
B --> D[兰伯特模型]
C --> E[Phong模型]
C --> F[Blinn-Phong模型]
G[BRDF] --> H[漫反射]
G --> I[镜面反射]
I --> J[GGX]
I --> K[菲涅尔效应]
L[PBR] --> G
L --> M[能量守恒]
L --> N[微表面理论]
按物理经验分类
A[光照模型] --> B[经验模型]
A --> C[物理模型]
B --> B1[Lambert]
B --> B2[Phong]
B --> B3[Blinn-Phong]
C --> C1[Cook-Torrance]
C --> C2[Oren-Nayar]
C --> C3[Disney BRDF]
按光照范围分类
| 类型 | 原理 | 代表模型 |
|---|---|---|
| 局部光照 | 仅考虑直接光照 | Phong, Blinn-Phong |
| 全局光照 | 包含间接光照 | 路径追踪,辐射度算法 |
| 混合光照 | 直接+简化间接 | 屏幕空间环境光遮蔽(SSAO) |
典型光照模型实现对比
| 模型 | 核心公式 | 适用场景 | 计算复杂度 |
|---|---|---|---|
| Lambert | L = k_d I (N·L) |
粗糙无光泽表面 | ★☆☆☆☆ |
| Phong | L = k_d(N·L) + k_s(R·V)^n |
塑料/陶瓷 | ★★☆☆☆ |
| Blinn-Phong | L = k_d(N·L) + k_s(N·H)^n |
实时渲染通用 | ★★☆☆☆ |
| Cook-Torrance | f = (D·F·G)/(4(N·V)(N·L)) |
金属/高光材质 | ★★★★☆ |
| Oren-Nayar | L = k_d I (A + B·max(0,cosφ)sinα tanβ) |
布料/粗糙表面 | ★★★☆☆ |
现代应用中的关键作用
在游戏引擎中的实现
Unity URP:
csharp
// 表面着色器示例
void surf (Input IN, inout SurfaceOutputStandard o) {
o.Albedo = _Color.rgb;
o.Metallic = _Metallic;
o.Smoothness = _Glossiness;
o.Normal = UnpackNormal(tex2D(_NormalMap, IN.uv_MainTex));
}
Unreal Engine:基于物理的材质编辑器(PBR)
电影级渲染应用
RenderMan RIS:使用路径追踪求解完整渲染方程
Arnold:
surface PBR(
color baseColor = 0.8,
float metallic = 0,
float roughness = 0.5)
{
// GGX微表面BRDF实现
bsdf = ggx_brdf(normal, roughness, metallic);
Ci = baseColor * illuminate(bsdf);
}
技术演进里程碑
- 1967:Bui Tuong Phong 提出漫反射模型
- 1975:Phong 镜面反射模型完善
- 1981:Cook-Torrance 推出首个物理BRDF
- 2010:Disney 提出艺术家友好的PBR工作流
- 2020:神经辐射场(NeRF)实现照片级渲染
前沿研究方向
- 神经光照模型:使用深度学习预测复杂光传输
- 示例:MIT 2023年提出的NeILF(神经逆光场)
- 量子光照计算:光量子处理器加速路径追踪
- 全息光场渲染:光波前重建技术(如Looking Glass显示屏)
光照模型是连接虚拟与现实的桥梁——从简单的(N·L)点积运算到包含数百万光路的路径追踪,其演进史就是计算机图形学追求物理真实性的奋斗史。理解光照模型不仅需要掌握其数学形式,更要洞察光与物质相互作用的物理本质。
【从UnityURP开始探索游戏渲染】专栏-直达
(欢迎点赞留言探讨,更多人加入进来能更加完善这个探索的过程,)
【光照】[光照模型]是什么?以UnityURP为例的更多相关文章
- 游戏引擎中三大及时光照渲染方法介绍(以unity3d为例)
(转)游戏引擎中三大及时光照渲染方法介绍(以unity3d为例) 重要:在目前市面上常见的游戏引擎中,主要采用以下三种灯光实现方式: 顶点照明渲染路径细节 Vertex Lit Rendering ...
- (转)游戏引擎中三大及时光照渲染方法介绍(以unity3d为例)
重要:在目前市面上常见的游戏引擎中,主要采用以下三种灯光实现方式: 顶点照明渲染路径细节 Vertex Lit Rendering Path Details 正向渲染路径细节 Forward Rend ...
- Unity预计算光照的学习(速度优化,LightProb,LPPV)
1.前言 写这篇文章一方面是因为unity的微博最近出了关于预计算光照相关的翻译文章,另一方面一些美术朋友一直在抱怨烘培速度慢 所以抱着好奇的心态来学习一下unity5的PRGI预计算实时光照 2.基 ...
- Unity预计算全局光照的学习(速度优化,LightProbe,LPPV)
1.基本参数与使用 1.1 常规介绍 使用预计算光照需要在Window/Lighting面板下找到预计算光照选项,保持勾选预计算光照并保证场景中有一个光照静态的物体 此时在编辑器内构建后,预计算光照开 ...
- Unity 5.6中的混合光照(上)
https://mp.weixin.qq.com/s/AbWM21sihHw5pFdMzENDPg 在Unity 5中,光照得到了很大的改进.现在,创建高度逼真的游戏已成为可能.但是,出于对性能的考虑 ...
- Stealth视频教程学习笔记(第一章)
Stealth视频教程学习笔记(第一章) 本文是对Unity官方视频教程Stealth的学习笔记.在此之前,本人整理了Stealth视频的英文字幕,并放到了优酷上.本文将分别对各个视频进行学习总结,提 ...
- Unite 2017 | Unity引擎发展四大方向
Unite 2017 Shanghai已落幕,今天为大家分享本次大会备受关注的Keynote主题演讲.本次大会Keynote主题演讲聚焦了Unity全球领导团队,包括Unity创始人David Hel ...
- OpenGL ES 光照模型之——环境光照(RenderMonkey测试)
概述及目录(版权所有,请勿转载 www.cnblogs.com/feng-sc/) 本文总结如何在RenderMonkey下做简单的OpenGL ES环境光光照模型测试. 主要包括如下内容: 1.使用 ...
- D3D 光照和材料 小样例
1.实现一个旋转的圆柱体,体现d3d光照效果 2.程序实现 #pragma once #pragma comment(lib,"winmm.lib") #pragma commen ...
- 【浅墨Unity3D Shader编程】之二 雪山飞狐篇:Unity的基本Shader框架写法&颜色、光照与材质
本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/40955607 作者:毛星云(浅墨) ...
随机推荐
- vite V3.0.0 vite.config.ts 引入插件vite-plugin-vue-setup-extend-plus报错(vueSetupExtend不是一个函数)
vite V3.0.0 vite.config.ts 引入插件报错(***** 不是函数) ·问题 #9414 ·Vitejs/Vite (github.com) 我的错误提示如下 ERROR fai ...
- Xamarin.Android - 防止 AlertDialog 在 PositiveButton 的使用方法
https://www.coder.work/article/399382 var builder = new AlertDialog.Builder(this); View v = LayoutIn ...
- C# 关于try-catch 异常无法被捕捉,解决方法
https://blog.csdn.net/weixin_30919571/article/details/102321538 有个处理方法在引发异常的发放上面加上 [System.Runtime.E ...
- 开源 vGPU 方案 HAMi 原理分析 Part1:hami-device-plugin-nvidia 实现
本文为开源的 vGPU 方案 HAMi 实现原理分析第一篇,主要分析 hami-device-plugin-nvidia 实现原理. 之前在 开源 vGPU 方案:HAMi,实现细粒度 GPU 切分 ...
- pdfjs-dist v3.x渲染pdf
import './App.css' import * as pdfjsLib from "pdfjs-dist"; import { useEffect, useRef, use ...
- Bootstrap fileinput(ssm版)
这是一篇我早起学习java-ssm的记录,这里主要是学习了文件上传 Bootstrap fileinput v1.0 前言bootstrap fileinput是一个很好的文件上传插件.但是官方不出a ...
- 前端开发系列125-进阶篇之Iterator
本文简单说明[ 迭代器接口 Iterator]() 接口的基本使用,涉及 Array .Set .Map 和 String 以及伪数组等数据结构,以及 `for...of`循环的用法等. Iterat ...
- Scrcpy Shortcuts
Actions can be performed on the scrcpy window using keyboard and mouse shortcuts. In the following l ...
- linux安装ActiveMQ,并配置开机自启--九五小庞
1.解压activemq压缩包,重命名文件夹 # cd /usr/local# tar -zxvf apache-activemq-5.11.1-bin.tar.gz# mv apache-activ ...
- git拉取远程指定分支到本地
git拉取远程指定分支到本地 以前写自己模块的时候,曾经建了一个本地分支dev,然后这个分支很久没有使用了,最近又要使用这个分支dev,然后要将远程仓库master分支上的内容同步到我本地dev分支 ...