【从UnityURP开始探索游戏渲染】专栏-直达

核心定义

光照模型‌是计算机图形学中用于模拟光线与物体表面相互作用的数学算法,它通过计算光能传播的物理特性,决定场景中每个像素的最终颜色值。其本质是求解‌光能传输方程‌的简化实现。

graph LR
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)$:余弦衰减项

光照模型分类体系

游戏中的光照模型分类

graph TD
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[微表面理论]

按物理经验分类

graph TD
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为例的更多相关文章

  1. 游戏引擎中三大及时光照渲染方法介绍(以unity3d为例)

    (转)游戏引擎中三大及时光照渲染方法介绍(以unity3d为例)   重要:在目前市面上常见的游戏引擎中,主要采用以下三种灯光实现方式: 顶点照明渲染路径细节 Vertex Lit Rendering ...

  2. (转)游戏引擎中三大及时光照渲染方法介绍(以unity3d为例)

    重要:在目前市面上常见的游戏引擎中,主要采用以下三种灯光实现方式: 顶点照明渲染路径细节 Vertex Lit Rendering Path Details 正向渲染路径细节 Forward Rend ...

  3. Unity预计算光照的学习(速度优化,LightProb,LPPV)

    1.前言 写这篇文章一方面是因为unity的微博最近出了关于预计算光照相关的翻译文章,另一方面一些美术朋友一直在抱怨烘培速度慢 所以抱着好奇的心态来学习一下unity5的PRGI预计算实时光照 2.基 ...

  4. Unity预计算全局光照的学习(速度优化,LightProbe,LPPV)

    1.基本参数与使用 1.1 常规介绍 使用预计算光照需要在Window/Lighting面板下找到预计算光照选项,保持勾选预计算光照并保证场景中有一个光照静态的物体 此时在编辑器内构建后,预计算光照开 ...

  5. Unity 5.6中的混合光照(上)

    https://mp.weixin.qq.com/s/AbWM21sihHw5pFdMzENDPg 在Unity 5中,光照得到了很大的改进.现在,创建高度逼真的游戏已成为可能.但是,出于对性能的考虑 ...

  6. Stealth视频教程学习笔记(第一章)

    Stealth视频教程学习笔记(第一章) 本文是对Unity官方视频教程Stealth的学习笔记.在此之前,本人整理了Stealth视频的英文字幕,并放到了优酷上.本文将分别对各个视频进行学习总结,提 ...

  7. Unite 2017 | Unity引擎发展四大方向

    Unite 2017 Shanghai已落幕,今天为大家分享本次大会备受关注的Keynote主题演讲.本次大会Keynote主题演讲聚焦了Unity全球领导团队,包括Unity创始人David Hel ...

  8. OpenGL ES 光照模型之——环境光照(RenderMonkey测试)

    概述及目录(版权所有,请勿转载 www.cnblogs.com/feng-sc/) 本文总结如何在RenderMonkey下做简单的OpenGL ES环境光光照模型测试. 主要包括如下内容: 1.使用 ...

  9. D3D 光照和材料 小样例

    1.实现一个旋转的圆柱体,体现d3d光照效果 2.程序实现 #pragma once #pragma comment(lib,"winmm.lib") #pragma commen ...

  10. 【浅墨Unity3D Shader编程】之二 雪山飞狐篇:Unity的基本Shader框架写法&颜色、光照与材质

    本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/40955607 作者:毛星云(浅墨)  ...

随机推荐

  1. nginx部署发布Vite项目

    1 引言 在之前的文章<Ubuntu云服务器上部署发布Vite项目>中笔者使用了Vite提供的预览服务(npm run preview)来在云服务器上发布Web应用.这样做轻量应用是没问题 ...

  2. C# 中使用线程、Task和 ThreadPool 的并发性

    C# 中的并发性涉及使用线程和任务等功能在程序中同时执行任务.这就像让多个工人同时完成不同的工作.这在现代应用程序中至关重要,因为它使它们更快.响应更迅速.并发性可确保我们的应用程序平稳运行,快速响应 ...

  3. AtCoder Beginner Contest 184 ABCDE 题解

    A - Determinant 签到. B - Quizzes 签到. C - Super Ryuma 贪心,同时分情况讨论: 1.本身就在范围里面,就1次(特判起始点和终点重合). 2.在两步范围内 ...

  4. Codeforces Round #685 (Div. 2) C. String Equality 思维

    传送门 题意:给你一个原串和模式串,问你能否通过两种操作把原串变成模式串. 操作方法: 1.交换任意相邻字符. 2.将k长度的相同字符子串全+1. 思路: 对于操作1,相当于我们可以任意排序原串. 结 ...

  5. linux操作系统下C语言编程入门小结

    Makefile $@--目标文件,$^--所有的依赖文件,$<--第一个依赖文件.# 这是简化后的 Makefilemain:main.o mytool1.o mytool2.ogcc -o ...

  6. 比特位计数 leetcode 338

    简介 问题的答案就在问题之中 问题说不允许使用 如 C++ 中的 __builtin_popcount 那么我们知道了可以用的为什么不去试试呢? 参考连接 https://leetcode-cn.co ...

  7. java Filehandler

    简介 最近的好像都没有手敲,只是看了一下.这个是文件管理的 code /* * @Author: your name * @Date: 2020-11-08 15:30:36 * @LastEditT ...

  8. 模拟退火解 深圳杯2020C题

    简介 下面链接有赛题和数据 http://www.m2ct.org/view-page.jsp?editId=12&uri=0D00233&gobackUrl=modular-list ...

  9. 洛谷 P9680 string[_view] 题解

    洛谷 P9680 string[_view] 题解 link Sol 模拟题. 我们先定义一个结构体,来存储定义的字符串的名字,内容和长度.每一次输入分两个字符串,一个是类型,一个是名字和赋值内容.当 ...

  10. 开发环境: googletest + abseil-cpp-20230802.1 + protobuf

    googletest: mkdir build && cd build && cmake -DCMAKE_CXX_STANDARD=17 -DABSL_BUILD_TE ...