<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Real-Time Rendering 4th on wanfeng</title>
        <link>https://sdpyy1.github.io/categories/books/real-time-rendering-4th/</link>
        <description>Recent content in Real-Time Rendering 4th on wanfeng</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>zh-cn</language>
        <copyright>爱喝东方树叶</copyright>
        <lastBuildDate>Wed, 29 Oct 2025 13:51:52 +0800</lastBuildDate><atom:link href="https://sdpyy1.github.io/categories/books/real-time-rendering-4th/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>Beyond Polygons 超越多边形</title>
        <link>https://sdpyy1.github.io/p/beyond-polygons-%E8%B6%85%E8%B6%8A%E5%A4%9A%E8%BE%B9%E5%BD%A2/</link>
        <pubDate>Wed, 29 Oct 2025 13:51:52 +0800</pubDate>
        
        <guid>https://sdpyy1.github.io/p/beyond-polygons-%E8%B6%85%E8%B6%8A%E5%A4%9A%E8%BE%B9%E5%BD%A2/</guid>
        <description>&lt;img src="https://sdpyy1.github.io/202308191853823.png" alt="Featured image of post Beyond Polygons 超越多边形" /&gt;&lt;blockquote&gt;
&lt;p&gt;这里主要说出了三角形渲染，还有其他的渲染方式，主要是了解各种优化渲染技巧&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&#34;https://sdpyy1.github.io/202308181916610.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;img&#34;
	
	
&gt;&lt;/p&gt;
&lt;h1 id=&#34;天空盒&#34;&gt;天空盒
&lt;/h1&gt;&lt;blockquote&gt;
&lt;p&gt;&amp;hellip;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id=&#34;光场渲染&#34;&gt;光场渲染
&lt;/h1&gt;&lt;h3 id=&#34;radiance-捕获与计算摄影&#34;&gt;Radiance 捕获与计算摄影
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Radiance&lt;/strong&gt;（辐射亮度）可以在：
&lt;ul&gt;
&lt;li&gt;不同位置&lt;/li&gt;
&lt;li&gt;不同方向&lt;/li&gt;
&lt;li&gt;不同时间&lt;/li&gt;
&lt;li&gt;不同光照条件
下进行捕获。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;计算摄影&lt;/strong&gt;领域研究如何从这些捕获的数据中提取有用结果，例如高动态范围成像（HDR）、光照重建等。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;​&lt;/p&gt;
&lt;h3 id=&#34;基于图像的物体表示&#34;&gt;基于图像的物体表示
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Lumigraph&lt;/strong&gt; 和 &lt;strong&gt;光场渲染（Light-field Rendering）&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;通过一组离散观察点捕获物体。&lt;/li&gt;
&lt;li&gt;给定一个新视角，通过&lt;strong&gt;在已存储视图之间插值&lt;/strong&gt;生成新视图。&lt;/li&gt;
&lt;li&gt;类似于&lt;strong&gt;全息摄影（Holography）&lt;/strong&gt;：用二维视图数组表示物体。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;优点&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;能够表示任意复杂表面与光照。&lt;/li&gt;
&lt;li&gt;显示速率几乎恒定，与物体几何复杂度无关。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;缺点&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;数据量大，需要存储大量视图。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&#34;sprite和图层&#34;&gt;Sprite和图层
&lt;/h1&gt;&lt;p&gt;&lt;strong&gt;Sprite（精灵图）&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;屏幕上可移动的图像元素，例如鼠标光标、游戏角色。&lt;/li&gt;
&lt;li&gt;不一定是矩形，支持透明像素。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;简单sprite&lt;/strong&gt;：每个像素直接映射到屏幕像素。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;动画sprite&lt;/strong&gt;：通过显示不同的sprite序列生成动画。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;通用sprite&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;将纹理渲染到始终面向观众的多边形（通常是四边形）上。&lt;/li&gt;
&lt;li&gt;支持大小调整和拉伸。&lt;/li&gt;
&lt;li&gt;Alpha通道提供透明度和边缘抗锯齿。&lt;/li&gt;
&lt;li&gt;可包含深度信息，使sprite有三维位置。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;场景可以看作是一系列&lt;strong&gt;sprite层&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;典型例子：二维序列帧动画（cel animation）。&lt;/li&gt;
&lt;li&gt;每层都有深度信息，用于确定前后关系。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;渲染顺序&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;画家算法（Painter’s Algorithm）：从后向前渲染，无需z-buffer。&lt;/li&gt;
&lt;li&gt;相机移动时：
&lt;ul&gt;
&lt;li&gt;物体变大 → 可使用相同sprite或mipmap处理。&lt;/li&gt;
&lt;li&gt;前景与背景的相对覆盖可通过修改sprite层位置调整。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;https://sdpyy1.github.io/202308191053337.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;img&#34;
	
	
&gt;&lt;/p&gt;
&lt;h1 id=&#34;广告牌技术&#34;&gt;广告牌技术
&lt;/h1&gt;&lt;p&gt;基于观察方向来修改纹理矩形朝向的技术被称为广告牌技术（billboarding），这个矩形被称为广告牌（billboard）&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://sdpyy1.github.io/202308191139790.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;img&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;这就是通过两个向量构建正交基的办法：首先，计算 &lt;strong&gt;right 向量&lt;/strong&gt;：
&lt;/p&gt;
$$
\mathbf{r} = \mathbf{u} \times \mathbf{n}
$$&lt;p&gt;
然后，用 &lt;strong&gt;right 向量&lt;/strong&gt; 和法线重新计算一个正交的 up 向量：
&lt;/p&gt;
$$
\mathbf{u}&#39; = \mathbf{n} \times \mathbf{r}
$$&lt;p&gt;
最终得到一个标准正交基：
&lt;/p&gt;
$$
\{\mathbf{r}, \mathbf{u}&#39;, \mathbf{n}\}
$$&lt;p&gt;
这样 $\mathbf{r}$、$\mathbf{u}&amp;rsquo;$ 和 $\mathbf{n}$ 三个向量两两垂直。&lt;/p&gt;
&lt;p&gt;有了这些初步的准备，剩下的主要任务就是决定用什么表面法线和up向量来定义广告牌的方向。&lt;strong&gt;构建正交基 + 平移 + 缩放的操作，其核心目的就是生成模型变换矩阵（Model Matrix），也就是把广告牌从局部模型空间变换到世界空间的矩阵。&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&#34;屏幕对齐screen-aligned的广告牌&#34;&gt;屏幕对齐（screen-aligned）的广告牌
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;法线向量&lt;/strong&gt;：
&lt;/p&gt;
$$
  \mathbf{n} = -\mathbf{v}_n
  $$&lt;ul&gt;
&lt;li&gt;$\mathbf{v}_n$ 是视平面法线，指向远离观察点。&lt;/li&gt;
&lt;li&gt;法线指向观察者。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Up 向量&lt;/strong&gt;：
&lt;/p&gt;
$$
  \mathbf{u} = \text{camera up vector}
  $$&lt;ul&gt;
&lt;li&gt;定义了广告牌在视平面上的上方向。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Right 向量&lt;/strong&gt;：
&lt;/p&gt;
$$
  \mathbf{r} = \mathbf{u} \times \mathbf{n}
  $$&lt;ul&gt;
&lt;li&gt;由 up 和法线叉乘得到，完成正交基。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;旋转矩阵&lt;/strong&gt;：
&lt;/p&gt;
$$
  R = [\mathbf{r} \;\; \mathbf{u} \;\; \mathbf{n}]
  $$&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;面向世界world-oriented的广告牌&#34;&gt;面向世界（world oriented）的广告牌
&lt;/h2&gt;&lt;p&gt;&lt;img src=&#34;https://sdpyy1.github.io/202308191554483.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;img&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;两种不同对齐方式的广告牌的俯视图。根据不同的对齐方法，五块广告牌的朝向也不同。&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;特性&lt;/th&gt;
          &lt;th&gt;屏幕对齐（Screen-aligned）&lt;/th&gt;
          &lt;th&gt;面向视点（Viewpoint-oriented）&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;法线方向&lt;/td&gt;
          &lt;td&gt;固定指向视平面&lt;/td&gt;
          &lt;td&gt;指向观察者&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;扭曲情况&lt;/td&gt;
          &lt;td&gt;对所有sprite相同，远处可能被拉伸&lt;/td&gt;
          &lt;td&gt;遵循真实透视，投影形变正确&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;使用场景&lt;/td&gt;
          &lt;td&gt;小sprite、文本注释、地图标记&lt;/td&gt;
          &lt;td&gt;粒子效果、火焰、烟雾、爆炸等&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;渲染复杂度&lt;/td&gt;
          &lt;td&gt;低&lt;/td&gt;
          &lt;td&gt;高，需要每帧计算法线&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Wang [1839, 1840]详细介绍了微软飞行模拟器产品中所使用的云建模和渲染技术。每片云都由5到400块广告牌组成，但是只需要16种不同的基本sprite纹理即可实现各种各样的云，因为这些基本的sprite纹理可以使用非均匀缩放和旋转来进行修改，从而组合形成各种各样类型的云。还会根据距离云中心的距离来修改该点的透明度，从而模拟云的形成和消散。为了节省处理时间，远处的云都被渲染为一组环绕场景的8个全景纹理，类似于天空盒。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://sdpyy1.github.io/202308191853823.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;img&#34;
	
	
&gt;&lt;/p&gt;
&lt;h2 id=&#34;轴向广告牌&#34;&gt;轴向广告牌
&lt;/h2&gt;&lt;p&gt;最后一种常见类型的广告牌被称为轴向广告牌（axial billboarding）。在这个方案中，被纹理化的物体通常并不会直接面对观察者。相反，它可以围绕一些固定的世界空间轴进行旋转，并在这个范围内尽可能多地面向观察者。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://sdpyy1.github.io/202308192013423.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;img&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;当观察者在场景中移动时，灌木广告牌会发生旋转以面向前方。在这个例子中，灌木从南面被照亮，因此不断变化的视野会使得整体着色随着旋转而发生变化。&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;广告牌类型&lt;/th&gt;
          &lt;th&gt;法线朝向&lt;/th&gt;
          &lt;th&gt;Up 向量&lt;/th&gt;
          &lt;th&gt;特点&lt;/th&gt;
          &lt;th&gt;示例&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;屏幕对齐（Screen-aligned）&lt;/td&gt;
          &lt;td&gt;固定视平面法线&lt;/td&gt;
          &lt;td&gt;相机 up&lt;/td&gt;
          &lt;td&gt;固定旋转矩阵，适合小sprite/文本&lt;/td&gt;
          &lt;td&gt;HUD、标记&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;面向视点（Viewpoint-oriented）&lt;/td&gt;
          &lt;td&gt;指向观察者&lt;/td&gt;
          &lt;td&gt;尽量对齐世界 up&lt;/td&gt;
          &lt;td&gt;可保持透视形变&lt;/td&gt;
          &lt;td&gt;粒子效果、火焰、爆炸&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;轴向（Axial）&lt;/td&gt;
          &lt;td&gt;尽量面向观察者，但绕固定轴&lt;/td&gt;
          &lt;td&gt;世界 up&lt;/td&gt;
          &lt;td&gt;保持直立，适合圆柱形对称物体&lt;/td&gt;
          &lt;td&gt;远景树木、光柱、激光束&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&#34;impostor&#34;&gt;Impostor
&lt;/h2&gt;&lt;p&gt;Impostor 是一个广告牌，通过渲染复杂物体到纹理上，然后将纹理映射到广告牌上，替代原始几何体。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://sdpyy1.github.io/202308192106566.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;img&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;在左边，通过视锥体从侧面观察物体，从而创建了一个impostor。观察方向朝向物体的中心点\mathbf{c}，使用这个相机设置渲染一副图像，并将其用作impostor纹理。如右侧所示，将imposter纹理应用于一个四边形上。impostor的中心等于原始物体的中心，法线（从imposter中心发出）直接指向视点。&lt;/p&gt;
&lt;h1 id=&#34;位移技术&#34;&gt;位移技术
&lt;/h1&gt;&lt;p&gt;&lt;strong&gt;通过图像编码几何信息&lt;/strong&gt;：不仅是颜色，也包括高度、深度、法线&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;优势&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;减少几何复杂度&lt;/li&gt;
&lt;li&gt;与传统impostor或sprite相比，渲染更真实&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;应用场景&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;远景人群、粒子系统、点云&lt;/li&gt;
&lt;li&gt;复杂表面细节建模（纹理化模拟几何）&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&#34;粒子系统&#34;&gt;粒子系统
&lt;/h1&gt;&lt;blockquote&gt;
&lt;p&gt;等学习GPU粒子时再记录&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;定义&lt;/strong&gt;：由独立微小物体组成的集合，通过算法控制运动和生命周期（创建、移动、修改、删除）。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;应用&lt;/strong&gt;：火、烟、爆炸、水流、星系等自然现象和特效。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;渲染&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;每个粒子可以是单像素、轨迹线段或四边形广告牌（sprite）。&lt;/li&gt;
&lt;li&gt;圆形粒子可只考虑位置，不必考虑旋转方向。&lt;/li&gt;
&lt;li&gt;可以用几何着色器生成，也可用顶点着色器生成，后者更高效。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;纹理&lt;/strong&gt;：可使用颜色、法线、法线贴图等。&lt;/p&gt;
&lt;h1 id=&#34;点渲染&#34;&gt;点渲染
&lt;/h1&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;概念&lt;/strong&gt;：使用点（point）作为基本图元来表示物体表面，然后通过高斯滤波填补点之间的空隙。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;历史&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;1985 年，Levoy 和 Whitted 首次提出。&lt;/li&gt;
&lt;li&gt;约 15 年后再次兴起，原因：
&lt;ol&gt;
&lt;li&gt;计算能力提升，支持交互速率渲染；&lt;/li&gt;
&lt;li&gt;激光扫描仪等设备提供高密度点云数据（RGB-D、LIDAR、Kinect、iPhone TrueDepth、Tango、自动驾驶激光雷达等）。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;点云数据&lt;/strong&gt;：每个点通常包含位置、颜色/强度，有时还有分类信息（建筑、路面等）。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;https://sdpyy1.github.io/202308211536110.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;img&#34;
	
	
&gt;&lt;/p&gt;
&lt;h1 id=&#34;体素&#34;&gt;体素
&lt;/h1&gt;&lt;h3 id=&#34;体素化输入来源&#34;&gt;&lt;strong&gt;体素化输入来源&lt;/strong&gt;
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;点云&lt;/strong&gt;：扫描设备生成的任意位置点。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;多边形网格&lt;/strong&gt;：通过 GPU 加速体素化。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;医学影像&lt;/strong&gt;：通过切片堆叠生成体素。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;图像集合&lt;/strong&gt;：可通过视觉外壳（visual hull）或轮廓切割生成体素。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;常见体素化方法&#34;&gt;&lt;strong&gt;常见体素化方法&lt;/strong&gt;
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;六正交视图体素化&lt;/strong&gt;（Karabassi et al.）：
&lt;ul&gt;
&lt;li&gt;从六个方向（上下左右前后）渲染深度。&lt;/li&gt;
&lt;li&gt;标记不可见体素为内部体素。&lt;/li&gt;
&lt;li&gt;优点：可识别内部体素；缺点：漏掉六视图不可见特征。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;视觉外壳体素化&lt;/strong&gt;（Loop et al.）：
&lt;ul&gt;
&lt;li&gt;基于相机捕获的轮廓图像生成体素。&lt;/li&gt;
&lt;li&gt;只在可见像素位置生成体素，适合人体重建。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;切片渲染体素化&lt;/strong&gt;（Eisemann &amp;amp; Decoret）：
&lt;ul&gt;
&lt;li&gt;使用 32bit 渲染目标存储多层体素（slicemap）。&lt;/li&gt;
&lt;li&gt;优点：可在 GPU 上一次渲染多层。&lt;/li&gt;
&lt;li&gt;局限：只生成表面体素，无法识别内部体素。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;现代 GPU 体素化&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;计算着色器 + 图像加载/存储操作&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;支持随机读写纹理。&lt;/li&gt;
&lt;li&gt;可进行保守光栅化，记录与体素重叠的三角形。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;可直接构建 &lt;strong&gt;SVO（Sparse Voxel Octree）&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;自上而下体素化非空节点。&lt;/li&gt;
&lt;li&gt;自下而上 mipmap 填充结构。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;动态场景处理&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;渐进式更新体素（progressive voxelization）。&lt;/li&gt;
&lt;li&gt;使用深度缓冲清除/设置体素。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;体素类型&#34;&gt;&lt;strong&gt;体素类型&lt;/strong&gt;
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;实体体素&lt;/strong&gt;：内部体素和外部体素完全分离。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;26-分离体素&lt;/strong&gt;：内部体素不与外部体素共享面、边或顶点。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;6-分离体素&lt;/strong&gt;：内部体素与外部体素共享边角（更保守的表面表示）。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;存储方式&#34;&gt;&lt;strong&gt;存储方式&lt;/strong&gt;
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;体素数据通常存储在三维数组或三维纹理中。&lt;/li&gt;
&lt;li&gt;每个体素可用 bit 或更高精度数据表示状态（内部/外部、密度、颜色、法线等）。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;渲染方法&#34;&gt;&lt;strong&gt;渲染方法&lt;/strong&gt;
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;直接立方体渲染&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;将每个体素绘制为立方体。&lt;/li&gt;
&lt;li&gt;相邻立方体共享面可剔除，减少多边形数量。&lt;/li&gt;
&lt;li&gt;可使用快速贪心算法进一步合并小面片。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;表面提取（Surface Extraction）&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Marching Cubes&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;每个体素的 8 个角点确定表面穿过位置。&lt;/li&gt;
&lt;li&gt;通过查表生成三角形网格。&lt;/li&gt;
&lt;li&gt;可插值顶点位置以获得平滑表面。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;水平集（Level Set）&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;体素存储到表面的距离（正内部，负外部）。&lt;/li&gt;
&lt;li&gt;可直接进行光线追踪或调整网格顶点位置。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;稀疏体素光线投射&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;针对稀疏体素数据直接进行光线投射。&lt;/li&gt;
&lt;li&gt;GPU 高效实现，支持交互式帧率。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;锥形追踪（Cone Tracing）&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;类似 mipmap 的采样方法。&lt;/li&gt;
&lt;li&gt;支持软阴影、景深、可变法线滤波。&lt;/li&gt;
&lt;li&gt;利用体素规则性进行区域采样。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;优化与数据结构&#34;&gt;&lt;strong&gt;优化与数据结构&lt;/strong&gt;
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;八叉树（Octree）：
&lt;ul&gt;
&lt;li&gt;优点：易构建，支持稀疏数据。&lt;/li&gt;
&lt;li&gt;缺点：树遍历开销大，动态变化不便。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;VDB 树 / 索引表：
&lt;ul&gt;
&lt;li&gt;提高 GPU 光线追踪性能。&lt;/li&gt;
&lt;li&gt;支持动态体素变化。&lt;/li&gt;
&lt;li&gt;可分块流式加载，处理大规模场景。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>Image Space Effects 图像空间特效</title>
        <link>https://sdpyy1.github.io/p/image-space-effects-%E5%9B%BE%E5%83%8F%E7%A9%BA%E9%97%B4%E7%89%B9%E6%95%88/</link>
        <pubDate>Tue, 28 Oct 2025 11:59:27 +0800</pubDate>
        
        <guid>https://sdpyy1.github.io/p/image-space-effects-%E5%9B%BE%E5%83%8F%E7%A9%BA%E9%97%B4%E7%89%B9%E6%95%88/</guid>
        <description>&lt;img src="https://sdpyy1.github.io/202307131302667.png" alt="Featured image of post Image Space Effects 图像空间特效" /&gt;&lt;h1 id=&#34;图像处理&#34;&gt;图像处理
&lt;/h1&gt;&lt;blockquote&gt;
&lt;p&gt;这里介绍的就是什么是后处理，以及用三角形代替四边形的方法，这个我在OpenGL渲染器已经在使用了&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&#34;https://sdpyy1.github.io/202307061135551.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;img&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;紧接着介绍图像处理的高斯滤波器是一种常用的滤波核，其形状是著名的钟形曲线：&lt;/p&gt;
$$
\operatorname{Gaussian}(x)=\left(\frac{1}{\sigma \sqrt{2 \pi}}\right) e^{-\frac{r^{2}}{2 \sigma^{2}}}
\tag{12.1}
$$&lt;p&gt;
&lt;img src=&#34;https://sdpyy1.github.io/image_EyiNW92NBT.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;img&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;将（b）中的权重乘上（c）中的权重，可以得到与（a）相同的权重，这表明两个滤波器实际上是等效的，因此是可分离的。使用（a）对一个像素进行滤波需要25个样本，而单独使用（b）和（c）对一个像素进行滤波分别只要5个样本，总共10个样本，这大大降低了计算量。&lt;/p&gt;
&lt;p&gt;边界像素怎么取？在 GPU 后处理里，一般有以下几种方式来“处理边界外的像素”：&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;策略&lt;/th&gt;
          &lt;th&gt;名称&lt;/th&gt;
          &lt;th&gt;含义&lt;/th&gt;
          &lt;th&gt;视觉效果&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Clamp to Edge（边界钳制）&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;最常用&lt;/td&gt;
          &lt;td&gt;超出范围的采样坐标自动钳制到最近的边界像素&lt;/td&gt;
          &lt;td&gt;✅ 边缘平滑、不会产生黑框&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Repeat（平铺）&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;重复采样&lt;/td&gt;
          &lt;td&gt;超出范围部分从另一侧重头取样&lt;/td&gt;
          &lt;td&gt;🚫 不适合模糊，会出现重复图案&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Mirror（镜像）&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;对称反射&lt;/td&gt;
          &lt;td&gt;超出边界部分以边界为轴镜像反射&lt;/td&gt;
          &lt;td&gt;✅ 比 clamp 更平滑，但略贵&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Constant / Black（填充0）&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;超出范围直接返回黑色或常量&lt;/td&gt;
          &lt;td&gt;🚫 会产生黑边、亮度损失&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;因为Shader中采样本身就可以不在像素中心，他可以自动插值，所以3*3的滤波核不需要采样9次，而是把采样点放在两个像素之间。通过调整样本的权重，以及样本采样的位置达到原来滤波核的效果。（比如采样点偏向权重高的一边，那自然插值就会分配更高的权重）&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://sdpyy1.github.io/202307061349068.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;img&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;下面讲了：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;圆盘滤波器能产生漂亮的虚化，但代价高；可用复数技巧实现高效近似。&lt;/li&gt;
&lt;li&gt;ComputerShader做这种操作效果更好（线程组共享内容，随意写入）&lt;/li&gt;
&lt;li&gt;“移动平均（Moving Average）”技巧：对每行（或列）第一个像素计算完整滤波和；后续像素只需：加上进入核的新样本；减去离开核的旧样本；每个像素的模糊结果都能在 &lt;strong&gt;O(1)&lt;/strong&gt; 时间更新。&lt;/li&gt;
&lt;li&gt;下采样：先通过原图生成一张分辨率更低的图片，在低分辨率下进行滤波，再放大回去，效果类似，速度更快&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;双边滤波&#34;&gt;双边滤波
&lt;/h2&gt;&lt;p&gt;图像处理中，双边滤波指的是 &lt;strong&gt;滤波权重同时考虑两个“方面”&lt;/strong&gt;：&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;方面&lt;/th&gt;
          &lt;th&gt;解释&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;空间距离（Spatial）&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;像素离中心的物理距离：越近权重越大（普通高斯模糊的做法）&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;颜色差异 / 强度差异（Range / Intensity）&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;像素颜色或亮度差异：越相近权重越大，越不同权重越小（边缘保留）&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;img src=&#34;https://sdpyy1.github.io/202307061555689.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;img&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://sdpyy1.github.io/202307131302667.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;img&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;使用像素着色器进行图像处理操作。其中左上角为原始图像，在其基础上进行了各种处理。右上角为高斯差分运算（Gaussian difference operation），左下角为边缘检测，右下角为边缘检测与原始图像混合后的合成图像。&lt;/p&gt;
&lt;h2 id=&#34;乒乓缓冲区后处理pass的资源管理方式&#34;&gt;乒乓缓冲区（后处理Pass的资源管理方式）
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;使用 &lt;strong&gt;两个离屏缓冲区（Framebuffer / Texture）&lt;/strong&gt; 交替作为输入和输出。&lt;/li&gt;
&lt;li&gt;流程示例：&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Pass&lt;/th&gt;
          &lt;th&gt;输入&lt;/th&gt;
          &lt;th&gt;输出&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;第1个Pass&lt;/td&gt;
          &lt;td&gt;缓冲区 A&lt;/td&gt;
          &lt;td&gt;缓冲区 B&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;第2个Pass&lt;/td&gt;
          &lt;td&gt;缓冲区 B&lt;/td&gt;
          &lt;td&gt;缓冲区 A&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;第3个Pass&lt;/td&gt;
          &lt;td&gt;缓冲区 A&lt;/td&gt;
          &lt;td&gt;缓冲区 B&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;每个 Pass 都可以使用前一个 Pass 的输出作为输入，同时写入另一个缓冲区。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;优点&lt;/strong&gt;：不需要为每个中间结果创建新的纹理，节省 GPU 内存和管理成本。&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&#34;重投影技术&#34;&gt;重投影技术
&lt;/h1&gt;&lt;blockquote&gt;
&lt;p&gt;利用上一帧已经渲染的数据来渲染本帧&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;反向重投影&#34;&gt;反向重投影
&lt;/h2&gt;&lt;p&gt;会计算当前帧（t）和前一帧（t−1）的顶点位置。使用顶点着色中的z和w分量，像素着色器可以为t和t - 1时刻计算插值z/w，如果两帧之间的距离足够近，那么可以在前一帧的颜色缓冲中来对位置$\mathbf{p}_{i}^{t-1}$的颜色进行双线性查找，并使用这个颜色值来代替当前帧的颜色值，而不是重新计算一个新的着色值。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://sdpyy1.github.io/202307131510213.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;img&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;淡绿色的位置上一帧也是可见的，所以可以重用，暗绿色上一帧不可见，所以需要计算&lt;/p&gt;
&lt;p&gt;为了获得更好的质量，还可以使用一个运行时平均滤波器（running-average filter）[1264, 1556]，它会逐步淘汰旧的着色值。它特别适用于空间抗锯齿（spatial antialiasing）、软阴影和全局光照。这个滤波器的描述如下：&lt;/p&gt;
$$
\mathbf{c}_{f}\left(\mathbf{p}^{t}\right)=\alpha \mathbf{c}\left(\mathbf{p}^{t}\right)+(1-\alpha) \mathbf{c}\left(\mathbf{p}^{t-1}\right)
\tag{12.2} 
$$&lt;p&gt;其中$\mathbf{c}\left(\mathbf{p}^{t}\right)$是点$\mathbf{p}^{t}$上的新着色值，$\mathbf{c}\left(\mathbf{p}^{t-1}\right)$是前一帧中的重投影颜色，$\mathbf{c}_{f}\left(\mathbf{p}^{t}\right)
$是应用滤波器之后的最终颜色。Nehab等人在某些用例中使用$α = 3/5$，但是他建议根据具体的渲染内容来尝试使用不同的值。&lt;/p&gt;
&lt;h2 id=&#34;正向重投影&#34;&gt;正向重投影
&lt;/h2&gt;&lt;p&gt;正向重投影则是从第t - 1帧的像素开始，并将它们投影到第t帧中，因此不需要进行两次顶点着色。这意味着来自第t−1帧的像素会被分散到第t帧中，而反向重投影方法则会收集从第t−1帧到第t帧的像素值。反向重投影方法还需要处理那些变得可见的遮挡区域，通常会通过一些启发式的空洞填充方法来完成，即使用周围像素的信息来推断出缺失区域的值。Yu等人[1952]使用正向重投影方法，以一种廉价的方式来计算景深效果。Didyk等人[350]基于运动向量（motion vector），在第t−1帧中自适应地生成网格来避免空洞，而不是使用经典的空洞填充方法。这个网格是通过深度测试来进行渲染的，然后会将其投影到第t帧中，这意味着遮挡问题和折叠问题，是作为带深度测试的自适应三角形网格光栅化的一部分来进行处理的。Didyk等人将他们的方法从左眼重投影到右眼，从而为虚拟现实生成一对立体图像，这两个图像之间的相关性通常会很高。后来，Didyk等人[351]提出了一种感知驱动的方法（perceptually motivated method）来执行时域采样，例如：将帧率从40 Hz增加到120 Hz。&lt;/p&gt;
&lt;h1 id=&#34;镜头光晕和泛光&#34;&gt;镜头光晕和泛光
&lt;/h1&gt;&lt;p&gt;光学现象&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;光晕（Halo）&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;由镜头晶体结构的径向纤维引起。&lt;/li&gt;
&lt;li&gt;外缘红色，内部紫色，环绕光源。&lt;/li&gt;
&lt;li&gt;尺寸恒定，与光源距离无关。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;绒毛状光环（Ciliary corona）&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;由透镜密度波动造成。&lt;/li&gt;
&lt;li&gt;表现为从光源向外辐射的射线。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;其他次要效果&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;光圈叶片 → 多边形图案&lt;/li&gt;
&lt;li&gt;玻璃凹槽 → 条状光线&lt;/li&gt;
&lt;li&gt;CCD溢出 → 泛光效果&lt;/li&gt;
&lt;li&gt;这些统称为 &lt;strong&gt;炫光效果（glare effect）&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;p&gt;数字化实现&lt;/p&gt;
&lt;p&gt;(1) 基本思路&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;将光源或高亮像素分离出来（bright-pass filter）。&lt;/li&gt;
&lt;li&gt;对这些像素进行模糊处理（通常高斯模糊，也可以是径向或尖峰形状）。&lt;/li&gt;
&lt;li&gt;将模糊后的结果叠加回原图。&lt;/li&gt;
&lt;li&gt;可以下采样以降低计算量（½ 到 1/8 分辨率），再上采样回原图。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;(2) 镜头光晕纹理（Lens Flare Texture）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;使用纹理（例如一系列小正方块）模拟光晕效果。&lt;/li&gt;
&lt;li&gt;光源远离屏幕中心 → 光晕小且透明&lt;/li&gt;
&lt;li&gt;光源靠近屏幕中心 → 光晕大且不透明&lt;/li&gt;
&lt;li&gt;可以结合 &lt;strong&gt;屏幕空间可见性&lt;/strong&gt; 调整亮度（遮挡检测）。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;(3) 条纹（Star streaks）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;使用 &lt;strong&gt;steerable filter&lt;/strong&gt; 在给定方向上累加像素值。&lt;/li&gt;
&lt;li&gt;通常结合乒乓缓冲区和下采样，实现高效渲染。&lt;/li&gt;
&lt;li&gt;常用于光源周围的线性光条或星状光晕。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;(4) 泛光（Bloom）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;只保留过亮区域，暗部变黑 → bright-pass。&lt;/li&gt;
&lt;li&gt;对 bright-pass 图像进行模糊（高斯或锐化型）。&lt;/li&gt;
&lt;li&gt;模糊结果叠加回原图（加法混合）。&lt;/li&gt;
&lt;li&gt;可结合 HDR 渲染：先 tone-mapping，再叠加 bloom。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;(5) 优化技巧&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;低分辨率渲染&lt;/strong&gt;：减少模糊计算量，扩大相对核尺寸。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;多级下采样&lt;/strong&gt;：可产生更广泛的模糊效果。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;遮挡采样&lt;/strong&gt;：如 Maughan 的 GPU 遮挡采样，调整光晕亮度。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;累积历史帧&lt;/strong&gt;：对动画物体形成条纹光晕或持久感。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;典型渲染流程（后处理管线）&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;场景渲染&lt;/strong&gt; → 得到 HDR 场景缓冲。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bright-pass 提取高亮像素&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;模糊处理&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;可以径向模糊（halo）&lt;/li&gt;
&lt;li&gt;可以方向模糊（star streaks）&lt;/li&gt;
&lt;li&gt;使用低分辨率或乒乓缓冲区优化&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;光晕纹理叠加&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;根据光源位置、遮挡信息调整大小与亮度&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;合成&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;bloom 或 lens flare 结果加到原图&lt;/li&gt;
&lt;li&gt;tone mapping &amp;amp; HDR → LDR&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h1 id=&#34;景深&#34;&gt;景深
&lt;/h1&gt;&lt;p&gt;&lt;img src=&#34;https://sdpyy1.github.io/image_QQa1DAb17H.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;img&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;累积缓冲区方法（Accumulate Buffer）&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;通过移动镜头位置（保持焦点固定），多次渲染图像并累积平均。&lt;/li&gt;
&lt;li&gt;焦点附近的像素保持清晰，远近场模糊。&lt;/li&gt;
&lt;li&gt;可以收敛到物理正确的ground-truth景深图像。&lt;/li&gt;
&lt;li&gt;缺点：渲染成本高，不适合实时应用。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;分层渲染&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;焦点层：清晰聚焦。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;远场层：模糊处理。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;近场层：模糊处理。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;通过改变裁剪平面和模糊处理，将层组合，形成景深。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;缺点：物体跨越多层时会产生突变；模糊不随距离连续变化。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;焦点外像素被扩散到弥散圆内。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;散射（Scatter）方法&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;将像素颜色散射到弥散圆覆盖的邻域像素。&lt;/li&gt;
&lt;li&gt;GPU上直接散射困难 → 可用Sprite渲染或可分离滤波。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;聚集（Gather / Backward Mapping）方法&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;对每个像素，采样其弥散圆内的邻域像素颜色并聚合。&lt;/li&gt;
&lt;li&gt;可使用深度信息来调整模糊半径，效率高且可预测。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;现代算法通常结合前景/背景分层 + 可分离滤波 + 聚集方法。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://sdpyy1.github.io/202308180930147.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;img&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;散射（scatter）操作是获取像素的着色值，并将其扩散到邻近区域的像素上，例如通过渲染一个圆形的sprite。在聚集操作中，相邻区域的值被采样并用于影响某一个像素。GPU的像素着色器经过优化，可以通过纹理采样来执行聚集操作。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;近场与远场模糊处理&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;近场&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;独立图像渲染并模糊。&lt;/li&gt;
&lt;li&gt;使用alpha通道控制混合，避免清晰边缘被模糊。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;远场&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;使用弥散圆半径插值焦点图像。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;组合&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;根据弥散圆半径插值焦点、远场图像。&lt;/li&gt;
&lt;li&gt;使用近场alpha覆盖合成，形成自然的景深。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&#34;运动模糊&#34;&gt;运动模糊
&lt;/h1&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;本质&lt;/strong&gt;：运动模糊是由于物体或相机在快门打开时间内移动，导致图像在时间上被平均，从而产生模糊。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;电影中的运动模糊&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;电影每秒24帧（FPS），快门通常在1/40s-1/60s。&lt;/li&gt;
&lt;li&gt;每一帧画面本身已经有运动模糊，所以即使24 FPS，画面也看起来平滑。&lt;/li&gt;
&lt;li&gt;快门时间越短（如1/500s），会产生“hyperkinetic”效果，看起来非常快、清晰。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;实时图形中的问题&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;FPS 低于一定值时，运动显得跳跃。&lt;/li&gt;
&lt;li&gt;高速物体在没有运动模糊时出现“时间锯齿”（temporal aliasing）。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;多帧累积（Frame Accumulation）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;思路：在一段时间内累积若干帧并求平均。&lt;/li&gt;
&lt;li&gt;问题：
&lt;ul&gt;
&lt;li&gt;会降低帧率（每帧需渲染多次）。&lt;/li&gt;
&lt;li&gt;快速移动物体容易出现鬼影。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;优化：
&lt;ul&gt;
&lt;li&gt;滑动累积（sliding accumulation）：只渲染新帧，减去最早帧，累加当前帧。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;b. 速度缓冲区（Velocity Buffer / Motion Vector）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;每个像素记录当前帧与上一帧在屏幕空间的位置差（速度向量）。&lt;/li&gt;
&lt;li&gt;用法：
&lt;ol&gt;
&lt;li&gt;渲染当前帧图像。&lt;/li&gt;
&lt;li&gt;根据速度缓冲区进行像素方向上的模糊。&lt;/li&gt;
&lt;li&gt;可在GPU中通过滤波、瓦片处理加速（tile-based max velocity）。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;优点：
&lt;ul&gt;
&lt;li&gt;只需渲染一帧。&lt;/li&gt;
&lt;li&gt;可处理复杂场景的物体运动。&lt;/li&gt;
&lt;li&gt;支持遮挡处理（前景物体不被背景模糊覆盖）。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;几何方法（Geometry-based Motion Blur）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;对快速移动物体生成拉伸的几何（如剑挥动）。&lt;/li&gt;
&lt;li&gt;缺点：
&lt;ul&gt;
&lt;li&gt;计算复杂。&lt;/li&gt;
&lt;li&gt;需要对每个物体处理纹理和高光。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;结合景深与运动模糊&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;通过对速度向量和弥散圆结合，统一处理景深模糊和运动模糊。&lt;/li&gt;
&lt;li&gt;可使用随机采样、交错采样、快速重建等技术减少采样噪声。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;https://sdpyy1.github.io/202308181445428.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;img&#34;
	
	
&gt;&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Global Illumination 全局光照</title>
        <link>https://sdpyy1.github.io/p/global-illumination-%E5%85%A8%E5%B1%80%E5%85%89%E7%85%A7/</link>
        <pubDate>Sat, 25 Oct 2025 13:59:45 +0800</pubDate>
        
        <guid>https://sdpyy1.github.io/p/global-illumination-%E5%85%A8%E5%B1%80%E5%85%89%E7%85%A7/</guid>
        <description>&lt;img src="https://sdpyy1.github.io/202307031150341.png" alt="Featured image of post Global Illumination 全局光照" /&gt;&lt;p&gt;渲染过程最终计算的是radiance，到目前为止，我们一直在使用反射方程（reflectance equation）来对其进行计算：&lt;/p&gt;
$$
L_{o}(\mathbf{p}, \mathbf{v})=\int_{\mathbf{l} \in \Omega} f(\mathbf{l}, \mathbf{v}) L_{i}(\mathbf{p}, \mathbf{l})(\mathbf{n} \cdot \mathbf{l})^{+} d \mathbf{l}
\tag{11.1} 
$$&lt;p&gt;其中$L_{o}(\mathbf{p}, \mathbf{v})$是表面位置$\mathbf{p}$在观察方向$\mathbf{v}$上的出射radiance；$\Omega$是表面位置$\mathbf{p}$的上半球范围；$f(\mathbf{l}, \mathbf{v})$是观察方向$\mathbf{v}$和当前光线入射方向$\mathbf{l}$上的BRDF；$L_{i}(\mathbf{p}, \mathbf{l})$是从光线方向$\mathbf{l}$到达表面位置$\mathbf{p}$的入射radiance；$(\mathbf{n} \cdot \mathbf{l})^{+}$是光线方向$\mathbf{l}$和表面法线$\mathbf{n}$之间的点积，并将负数结果clamp到0，即将来自表面下方的光线过滤掉。&lt;/p&gt;
&lt;h1 id=&#34;通用全局光照算法&#34;&gt;通用全局光照算法
&lt;/h1&gt;&lt;p&gt;&lt;strong&gt;通用&lt;/strong&gt; = &lt;strong&gt;适用于所有类型的光照交互，不局限于特定材质或光源类型&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;它强调的是算法&lt;strong&gt;完整求解渲染方程&lt;/strong&gt;，可以模拟现实世界中各种光线传输现象，而不是仅仅处理直接光或特定反射类型。&lt;/p&gt;
&lt;h2 id=&#34;辐射度&#34;&gt;辐射度
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;目标&lt;/strong&gt;：模拟漫反射表面间的光线反弹，尤其是面光源产生的软阴影。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;假设&lt;/strong&gt;：所有间接光来自漫反射表面（不适合镜面或高光材质）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;基本思想&lt;/strong&gt;：光在环境中弹射，直到达到稳定平衡，每个表面可以视为光源。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;光传输路径&lt;/strong&gt;：通常记作 $LD*E$（光源 $L$ → 漫反射 $D$ → 眼睛 $E$）。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;算法实现&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;面片划分&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;场景表面分割为若干面片（patch），每个面片计算一个平均辐射度值。（就是把Mesh分成一个一个片来计算）&lt;/li&gt;
&lt;li&gt;面片大小不必与原始三角形网格一致，但要足够小以捕捉阴影和光照细节。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;辐射度方程&lt;/strong&gt;
&lt;/p&gt;
$$
   B_{i} = B_i^e + \rho_{\mathrm{ss}} \sum_j F_{ij} B_j
   $$&lt;ul&gt;
&lt;li&gt;$B_i$：面片 $i$ 的辐射度&lt;/li&gt;
&lt;li&gt;$B_i^e$：面片自身发出的辐射度&lt;/li&gt;
&lt;li&gt;$\rho_{\mathrm{ss}}$：次表面反照率&lt;/li&gt;
&lt;li&gt;$F_{ij}$：形状因子（form factor），表示面片 $i$ 发出的光有多少到达面片 $j$&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;通俗理解&#34;&gt;通俗理解
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;自己发光的部分&lt;/strong&gt; → $B_i^e$
&lt;ul&gt;
&lt;li&gt;面片本身是光源时才有&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;其他面片反射来的光&lt;/strong&gt; → $\rho_{\mathrm{ss}} \sum_j F_{ij} B_j$
&lt;ul&gt;
&lt;li&gt;房间里其他面片反射的光经过漫反射照到面片 $i$&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;总和&lt;/strong&gt; → $B_i$
&lt;ul&gt;
&lt;li&gt;面片 $i$ 的最终辐射度就是“自己发光 + 别人反射的光”&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;形状因子&lt;/strong&gt;（描述一个面片受到另一个面片的影响程度）&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://sdpyy1.github.io/202306221508114.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;img&#34;
	
	
&gt;
&lt;/p&gt;
$$
   F_{ij} = \frac{1}{A_i} \int_{A_i} \int_{A_j} V(i,j) \frac{\cos \theta_i \cos \theta_j}{\pi d_{ij}^2} \, da_i da_j
   $$&lt;ul&gt;
&lt;li&gt;$A_i$：面片面积&lt;/li&gt;
&lt;li&gt;$V(i,j)$：可见性函数（1 = 可见，0 = 被遮挡）&lt;/li&gt;
&lt;li&gt;$\theta_i, \theta_j$：法线与连线的夹角&lt;/li&gt;
&lt;li&gt;$d_{ij}$：两面片中心距离&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;求解方法&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;形状因子计算完成后，所有面片方程组成一个线性系统（一个由线性方程组成的数学模型）&lt;/li&gt;
&lt;li&gt;解线性系统得到每个面片的辐射度&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;限制与应用&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;扩展性差，面片数量大时矩阵求解开销高&lt;/li&gt;
&lt;li&gt;不适合高光或镜面材质&lt;/li&gt;
&lt;li&gt;现代实时系统借鉴思想：预计算形状因子，然后在运行时进行光线传播&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;辐射度算法是一种基于有限元的全局光照方法，适合漫反射环境，通过面片划分、形状因子计算和线性系统求解，模拟间接光照。虽然计算量大，但其理论基础和预计算思想对实时渲染设计仍有重要参考价值。&lt;/p&gt;
&lt;h2 id=&#34;光线追踪&#34;&gt;光线追踪
&lt;/h2&gt;&lt;p&gt;这块倒是原理比较熟悉了&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://sdpyy1.github.io/202306230953424.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;img&#34;
	
	
&gt;&lt;/p&gt;
&lt;h1 id=&#34;环境光遮蔽&#34;&gt;环境光遮蔽
&lt;/h1&gt;&lt;p&gt;上一小节中所介绍的通用全局光照算法，它们的计算成本都很高。虽然它们可以产生各种复杂的效果，但是生成一幅图像往往需要好几个小时。我们将首先介绍一些最简单的，但是在视觉上很有说服力的方法，并在本章节逐步探索实时替代方案，逐步构建更加复杂的效果。&lt;/p&gt;
&lt;p&gt;AO的话也比较熟悉了，跳过。在GameEngine真正实现时，再回来看&lt;/p&gt;
&lt;h1 id=&#34;漫反射全局光照&#34;&gt;漫反射全局光照
&lt;/h1&gt;&lt;p&gt;这部分针对漫反射的全局光照的各种技术进行介绍&lt;/p&gt;
&lt;h2 id=&#34;表面预照明静态场景固定法线&#34;&gt;表面预照明（静态场景，固定法线）
&lt;/h2&gt;&lt;p&gt;静态场景烘培&lt;/p&gt;
&lt;p&gt;对于一个法线已知的Lambertian表面，其irradiance可以预先计算出来。在运行过程中，将这个值乘以实际的表面颜色（例如纹理颜色），从而获得反射的radiance。根据表面颜色的确切形式，可能还需要额外除以\pi 来确保能量守恒。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://sdpyy1.github.io/202306301817467.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;img&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;除了限制最为严格的硬件平台之外，如今已经很少使用预计算irradiance的方法了。因为根据定义，irradiance是针对给定的法线方向进行计算的，这意味着我们无法对物体的表面法线进行修改，我们无法使用法线映射来提供高频的表面细节。这也意味着只能对平面进行预计算irradiance。如果我们需要在动态几何物体上使用烘焙光照，我们就需要其他的方法来存储这些光照信息。这些限制条件促使人们寻找一种方法，来存储带有方向分量的预计算光照。&lt;/p&gt;
&lt;h2 id=&#34;定向表面预照明静态场景法线可变&#34;&gt;定向表面预照明（静态场景，法线可变）
&lt;/h2&gt;&lt;p&gt;1️⃣ 为什么需要定向表面预照明&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;对 &lt;strong&gt;Lambertian 漫反射表面&lt;/strong&gt;，简单的环境光照（irradiance）只存储一个标量就够了，但如果要：
&lt;ul&gt;
&lt;li&gt;使用 &lt;strong&gt;法线贴图&lt;/strong&gt;（normal map）提高细节&lt;/li&gt;
&lt;li&gt;给动态几何提供间接光&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;就需要存储 &lt;strong&gt;irradiance 随表面法线变化&lt;/strong&gt; 的信息，也就是方向性信息。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;2️⃣ 常用表示方法&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;球谐函数（Spherical Harmonics, SH）&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;可以存储完整的半球或球面光照函数。&lt;/li&gt;
&lt;li&gt;优点：插值简单，支持动态法线。&lt;/li&gt;
&lt;li&gt;缺点：系数多（3阶SH每通道9个系数），可能有振铃现象（振铃现象就是在用有限阶球谐函数近似光照时，高频细节无法精确表达，在边界或高对比区域出现的伪波纹或亮暗误差）。&lt;/li&gt;
&lt;li&gt;优化变体：
&lt;ul&gt;
&lt;li&gt;Chen 的方法：将主要方向光用一个方向+颜色存储，其余用二阶SH编码 → 18个系数，降低存储。&lt;/li&gt;
&lt;li&gt;H-basis：仅对半球编码，可用更少系数（6个）获得三阶SH精度。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;半球基（AHD / Half-angle Basis）&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;《半条命2》使用：每个样本 3 颜色通道，总共 9 个系数。&lt;/li&gt;
&lt;li&gt;简单，成本低，效果可接受。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;切线空间高斯 / 环境波瓣&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Crytek 和《教团：1886》方法：
&lt;ul&gt;
&lt;li&gt;存储 &lt;strong&gt;平均光线方向 + 颜色 + 混合因子&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;用球面高斯波瓣（cos^n 权重）表示光照分布。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;优点：高质量、可做漫反射和镜面高光卷积。&lt;/li&gt;
&lt;li&gt;缺点：存储和计算成本高。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;环境立方 / 环境骰子&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;用几个方向的余弦波瓣表示光照（cos² 或 cos⁴）。&lt;/li&gt;
&lt;li&gt;优点：存储少（6-12个方向），局部支持好，重建质量接近二阶SH。&lt;/li&gt;
&lt;li&gt;已应用在《半条命2》《使命召唤》《孤岛惊魂3》等游戏。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;预计算传输-prt静态场景但光源可变&#34;&gt;预计算传输 PRT（静态场景，但光源可变）
&lt;/h2&gt;&lt;p&gt;虽然上述的预计算光照看起来很惊艳，但是它本质上还是静态的。&lt;/p&gt;
&lt;p&gt;如果我们假设场景中的几何物体没有发生变化，只有光照发生了变化，那么我们可以对光线与模型的相互作用进行预计算。物体之间的影响（例如相互反射或者次表面散射），可以预先进行一定程度的分析，并将结果存储下来，而不需要对实际的radiance进行操作。接收入射光线，并将其转换为整个场景的radiance分布，这个函数被称为传输函数（transfer function）。这样的方法被称为预计算传输（precomputed transfer）或者预计算radiance传输（precomputed radiance transfer，PRT）。&lt;/p&gt;
&lt;p&gt;简单讲就是对于每种光源都可以提前对他单独进行预计算，最终场景光照可以由这些单独的光源预计算结果进行累加即可&lt;/p&gt;
&lt;p&gt;使用预计算radiance传输的渲染示例。会预先计算三个显示器的完整光照传输，分别获得一个归一化的“单位”响应。由于光线传输的线性叠加特点，这些单独的解可以分别乘以显示器的颜色（本例中是粉色、黄色和蓝色），从而获得最终的光照效果。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://sdpyy1.github.io/202307011024303.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;img&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;上述过程可以写出如下数学形式：&lt;/p&gt;
$$
L(\mathbf{p})=\sum_{i} L_{i}(\mathbf{p}) \mathbf{w}_{i}
\tag{11.36} 
$$&lt;p&gt;其中$L(\mathbf{p})$是点$\mathbf{p}$的最终radiance；$L_{i}(\mathbf{p})$是来自显示器$i$的预计算单位（归一化）贡献；$\mathbf{w}_{i}$是该显示器的当前亮度。这个方程在数学意义上定义了一个向量空间（vector space），$L_i$是这个空间中的基向量。任何可能的光照效果，都可以通过这些光源贡献的线性组合来生成。&lt;/p&gt;
&lt;h2 id=&#34;存储方法&#34;&gt;存储方法
&lt;/h2&gt;&lt;p&gt;光照信息存储的目的&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;无论是完全预计算的光照（例如光照贴图）还是只预计算部分传输信息（PRT等），都需要将结果数据存储在 &lt;strong&gt;GPU友好的形式&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;存储的形式必须便于 &lt;strong&gt;运行时高效访问&lt;/strong&gt;，以便着色器能快速获取光照信息。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;光照贴图（Lightmap）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;定义&lt;/strong&gt;：存储预计算光照的纹理。术语上可以涵盖irradiance贴图或其他光照存储。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;特点&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;GPU上使用纹理机制进行访问，通常经过双线性过滤。&lt;/li&gt;
&lt;li&gt;有些表示方法（如AHD）是非线性的，插值后需要归一化。&lt;/li&gt;
&lt;li&gt;光照贴图通常 &lt;strong&gt;不使用 mipmap&lt;/strong&gt;，因为贴图分辨率已经很低，每个纹素覆盖面积大（约 20×20 cm）。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;参数化要求&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;模型网格需要唯一的参数化（unique parameterization），每个三角形都有自己的纹理区域。&lt;/li&gt;
&lt;li&gt;网格通常被分成 &lt;strong&gt;chart 或 shell&lt;/strong&gt;，然后打包到同一纹理中。&lt;/li&gt;
&lt;li&gt;需要注意 chart 之间不重叠，并保证过滤占用空间独立，以防颜色溢出。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;接缝问题&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;因为 chart 独立展开，纹素边界可能不连续。&lt;/li&gt;
&lt;li&gt;可以通过手动放置接缝、后处理或者约束优化来减小可见瑕疵。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;光照信息被烘焙到一个场景中，将光照贴图应用到物体表面上从而实现光照。光照贴图使用了一个唯一的参数化。场景会被划分成多个元素，这些元素被展开并打包成一个共同的纹理。例如：右图左下角的小块对应了地面，它展示了两个立方体的阴影。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;https://sdpyy1.github.io/202307011533930.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;img&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;顶点光照存储&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;预计算光照也可以存储在顶点上，但：
&lt;ul&gt;
&lt;li&gt;光照质量依赖网格细分程度。&lt;/li&gt;
&lt;li&gt;网格过粗会导致光照表现不准确，过细会增加计算成本。&lt;/li&gt;
&lt;li&gt;在现代GPU上，顶点之间传递大量光照参数会降低效率，因此很少使用。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;体积光照存储（Irradiance Volume / Light Probe）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;概念&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;在场景中预计算空间中多个点的光照信息。&lt;/li&gt;
&lt;li&gt;可用于动态物体，也可用于静态物体。也就是说光照信息分布在场景中，而不是物体上，即使新物体来了也能直接用&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;存储方式&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;原始方法：每个样本点存储小纹理。&lt;/li&gt;
&lt;li&gt;现代方法：存储在三维纹理或其他体积结构中，可用GPU加速过滤。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;常用表示方法&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;二阶或三阶 &lt;strong&gt;球谐函数（SH）&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;球面高斯函数&lt;/li&gt;
&lt;li&gt;环境立方体贴图（cube map）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;采样方法&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;可用最近探针插值，或者基于四面体网格/点云+重心坐标的插值（图11.30、11.31）。&lt;/li&gt;
&lt;li&gt;精度依赖探针密度和网格结构。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;注意问题&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;光照体素可能跨越不同光照特征的表面，需要处理边界问题。&lt;/li&gt;
&lt;li&gt;体积存储比光照贴图占用更多内存（立方关系）。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Unity引擎使用了一个四面体网格，来从一组探针中插值出光照信息。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;https://sdpyy1.github.io/202307031150341.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;img&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;对于静态和动态的几何物体，通常会使用不同的光照存储方法。例如：静态物体可以使用光照贴图，而动态物体则可以从体积结构中获得光照信息。虽然这样做很流行，但是这种方案可能会导致不同类型的几何物体之间产生不一致的外观表现。其中一些差异可以通过正则化（regularization）来消除，即在这些表示方法中对光照信息进行平均。&lt;/p&gt;
&lt;h2 id=&#34;动态漫反射全局光照&#34;&gt;动态漫反射全局光照
&lt;/h2&gt;&lt;p&gt;预计算光照的局限性&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;优点&lt;/strong&gt;：能产生高质量的光照效果。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;缺点&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;需要离线烘焙，耗时长（可能几个小时甚至更多）。&lt;/li&gt;
&lt;li&gt;烘焙-调整-再烘焙循环非常耗费时间，影响工作效率。&lt;/li&gt;
&lt;li&gt;不适用于动态几何或用户生成的场景，因为场景会在运行时变化。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;为了适应场景动态变化，需要即时计算间接光照（无需长时间预计算），主要方法包括：&lt;/p&gt;
&lt;p&gt;即时辐射度（Instant Radiosity）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;思路：从光源向场景投射光线，每个被光线照到的点放置一个 &lt;strong&gt;虚拟点光源（VPL, Virtual Point Light）&lt;/strong&gt; 来模拟间接照明。&lt;/li&gt;
&lt;li&gt;实现：Tabellion &amp;amp; Lamorlette（《怪物史莱克2》）
&lt;ul&gt;
&lt;li&gt;对场景表面做一次直接光照 Pass 并存储纹理。&lt;/li&gt;
&lt;li&gt;渲染时使用这些缓存数据生成一次弹射的间接光照。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;优点：一次弹射即可产生合理效果。&lt;/li&gt;
&lt;li&gt;缺点：仍然是部分离线，需要一定计算。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;反射阴影贴图（Reflective Shadow Maps, RSM）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;基于光源视角渲染的阴影贴图，不仅存储深度，还存储 &lt;strong&gt;法线、反照率、直接光照&lt;/strong&gt; 等信息。&lt;/li&gt;
&lt;li&gt;纹素视作虚拟点光源，在渲染时生成单次弹射的间接光照。&lt;/li&gt;
&lt;li&gt;优化：
&lt;ul&gt;
&lt;li&gt;不使用全部像素作为点光源，而是用 &lt;strong&gt;重要性驱动选择子集&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;可在屏幕空间 splat 虚拟光源，而不是每个着色点都选取纹素。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;缺点：
&lt;ul&gt;
&lt;li&gt;无法提供间接光照的遮挡信息（近似效果）。&lt;/li&gt;
&lt;li&gt;间接光源数量不足时，会出现闪烁。&lt;/li&gt;
&lt;li&gt;数量太多则性能挑战大。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;其他改进&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;双抛物面阴影贴图&lt;/strong&gt;：逐步添加间接光源，保证每帧只用少量阴影贴图。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;点场景表示 + 不完美阴影贴图（imperfect shadow maps）&lt;/strong&gt;：小贴图 + 后处理过滤，实现间接光照遮挡效果。&lt;/li&gt;
&lt;li&gt;游戏应用示例：
&lt;ul&gt;
&lt;li&gt;《Dust 514》使用多纹理图层收集间接光照。&lt;/li&gt;
&lt;li&gt;UE 风筝 Demo 用类似方法处理地形间接光照。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;光照传播体积lpv&#34;&gt;光照传播体积（LPV）
&lt;/h2&gt;&lt;p&gt;场景被离散成一个规则的三维网格，每个单元格内都会维护一个穿过它的定向radiance分布，他使用二阶球谐函数来处理这些信息&lt;/p&gt;
&lt;p&gt;LPV 的基本流程&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;注入光照（Injection）&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;将直接光照注入与表面接触的体素（volume cell）中。&lt;/li&gt;
&lt;li&gt;注入值是表面反射光（根据材质颜色调节）。&lt;/li&gt;
&lt;li&gt;可以使用 &lt;strong&gt;反射阴影贴图（RSM）&lt;/strong&gt; 或其他方法找到这些体素。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;光照传播（Propagation）&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;每个体素分析邻居体素的 radiance 分布，更新自身 radiance。&lt;/li&gt;
&lt;li&gt;每次迭代光照只传播一个体素的距离，所以需要多次迭代才能覆盖更大空间。&lt;/li&gt;
&lt;li&gt;优点：每个体素都有完整 radiance 场，任意 BRDF 都可用。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;级联体积（Cascaded LPV）&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;为了覆盖更大空间并节省内存，使用嵌套、逐渐变大的体素层级。&lt;/li&gt;
&lt;li&gt;光照注入和传播在每个层级独立进行，查找光照时选用最细可用层级。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;遮挡信息（Occlusion）&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;初始 LPV 不考虑间接光遮挡。&lt;/li&gt;
&lt;li&gt;后续改进引入 &lt;strong&gt;RSM 深度信息&lt;/strong&gt; 或 &lt;strong&gt;相机深度缓冲&lt;/strong&gt;，为体素添加遮挡近似。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&#34;https://sdpyy1.github.io/202307031650806.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;img&#34;
	
	
&gt;&lt;/p&gt;
&lt;h2 id=&#34;体素化全局光照voxel-cone-tracing-vxgi&#34;&gt;体素化全局光照（Voxel Cone Tracing, VXGI）
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;体素化场景&lt;/strong&gt;：将场景几何体用稀疏体素八叉树（Sparse Voxel Octree, SVO）表示，每个体素存储反射的光照信息（Radiance）。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;光照注入&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;使用反射阴影贴图（RSM）或直接光照信息注入到最低层体素。&lt;/li&gt;
&lt;li&gt;再通过层次传播向上累积，形成整个体素空间的光照场。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;圆锥追踪近似射线积分&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;为了避免追踪大量射线，使用 &lt;strong&gt;圆锥（Cone）近似&lt;/strong&gt; 来取代理想射线。&lt;/li&gt;
&lt;li&gt;沿圆锥轴线在八叉树上进行层次查找，并根据体素覆盖率调节光照衰减。&lt;/li&gt;
&lt;li&gt;多个圆锥组合可以模拟漫反射间接光。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;性能优化&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;稀疏八叉树访问开销大&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;查找叶子节点需要多次内存访问，GPU 上容易导致 warp 停滞。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;级联三维纹理替代八叉树&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;类似 &lt;strong&gt;级联光照传播体积（LPV）&lt;/strong&gt;，每层覆盖更大的空间。&lt;/li&gt;
&lt;li&gt;只需一次纹理查找即可获得多层级信息。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;屏幕空间过滤&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;每像素只追踪一个圆锥，通过屏幕空间滤波得到最终漫反射响应。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;VXGI 的优点&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;可支持 &lt;strong&gt;动态全局光照&lt;/strong&gt;（直接光 + 间接光）。&lt;/li&gt;
&lt;li&gt;允许 &lt;strong&gt;动态物体和光源&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;能处理 &lt;strong&gt;复杂遮挡和半透明间接光&lt;/strong&gt;（虽然近似）。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;体素锥形追踪使用一系列体素树中的过滤查找，来对一个精确的锥形追踪进行近似。左图显示的是三维轨迹的二维模拟。右图展示了体素化几何的分层表示，从左到右每一列所展示的体素树，其层次越来越粗糙。在右图每一行中，展示了用于为给定样本提供覆盖率的层次结构节点。选择合适的级别进行使用，从而使得较粗级别节点的大小大于当前查找的大小，较细级别节点的大小小于当前查找的大小。会使用一个类似于三线性滤波的过程，来在这两个选定的级别之间进行插值。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://sdpyy1.github.io/202307031820522.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;img&#34;
	
	
&gt;&lt;/p&gt;
&lt;h1 id=&#34;镜面全局光照&#34;&gt;镜面全局光照
&lt;/h1&gt;&lt;p&gt;漫反射 VS 光泽材质的不同需求&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;特性&lt;/th&gt;
          &lt;th&gt;漫反射&lt;/th&gt;
          &lt;th&gt;光泽/镜面材质&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;光照分布&lt;/td&gt;
          &lt;td&gt;宽余弦波瓣（整个半球）&lt;/td&gt;
          &lt;td&gt;狭窄镜面波瓣（小立体角）&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;光照采样&lt;/td&gt;
          &lt;td&gt;半球内积分&lt;/td&gt;
          &lt;td&gt;只需有限方向光线&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;实时渲染要求&lt;/td&gt;
          &lt;td&gt;低频、粗略表示即可&lt;/td&gt;
          &lt;td&gt;需高频、精确方向信息&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;漫反射光照可以用二阶球谐函数、LPV 或 VXGI 等低频方法表示。&lt;/li&gt;
&lt;li&gt;光泽材质要求高频 radiance 表示，否则镜面反射高光会出现明显瑕疵。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;局部环境贴图反射探针&#34;&gt;局部环境贴图（反射探针）
&lt;/h2&gt;&lt;p&gt;最早将环境贴图与空间中特定点相绑定的游戏之一是《半条命2》，在他们的系统中，会由艺术家首先在整个场景中放置采样位置。在预处理阶段中，会在每个位置上渲染一个立方体贴图。在进行高光计算的时候，物体会使用最近位置上的结果来作为入射radiance的表示。相邻的物体可能会使用不同的环境贴图，这将会导致视觉效果的不匹配，但是艺术家可以手动调整立方体贴图所覆盖的范围。&lt;/p&gt;
&lt;p&gt;常规环境贴图（EM）假设环境在“无限远”，即每个表面点采样反射方向时，环境似乎以这个点为中心。&lt;/p&gt;
&lt;p&gt;对于&lt;strong&gt;小物体或者贴图正好从物体中心生成&lt;/strong&gt;，结果几乎精确；但大多数物体：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;EM 是在某个中心点生成的（reflection probe）&lt;/li&gt;
&lt;li&gt;高光表面离中心点越远 → 反射方向采样的结果就偏离真实情况 → 高光不真实&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;视差矫正：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;假设入射光来自一个有限大小的球体或盒子&lt;/strong&gt;（reflection proxy），而不是无限远。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;用户可以定义半径/大小。&lt;/li&gt;
&lt;li&gt;代理物体可以是球、盒子等形状，包围渲染到 EM 中的几何。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;计算校正方向&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;对于某个表面点 $\mathbf{p}$：
&lt;ol&gt;
&lt;li&gt;计算反射方向 $\mathbf{r}$（传统方式）&lt;/li&gt;
&lt;li&gt;视作从表面点沿 $\mathbf{r}$ 发射一条射线，与&lt;strong&gt;反射代理&lt;/strong&gt;相交&lt;/li&gt;
&lt;li&gt;计算交点 $\mathbf{x}$&lt;/li&gt;
&lt;li&gt;新方向 $\mathbf{r}&amp;rsquo; = \mathbf{x} - \mathbf{c}$，其中 $\mathbf{c}$ 是环境贴图的中心&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;使用 $\mathbf{r}&amp;rsquo;$ 去 EM 采样，而不是直接使用 $\mathbf{r}$&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;左边是常规的环境映射，它使用蓝色圆圈进行表示（它也可以是任何表示形式，例如立方体贴图）。左图中的效果是通过使用反射观察方向$\mathbf{r}$访问环境贴图来确定的。仅仅使用这个方向作为参数，蓝色圆圈EM会被视为半径无限大且遥远的。对于黑色圆表面上的任何点，EM好像都以该点为中心。右图中，我们希望EM能够把周围的黑色房间表示为本地的，而不是无限远的。蓝色圆圈EM是在房间的中心处生成的。要像访问房间一样访问这个EM，会从位置$\mathbf{p}$处，沿着反射观察方向发射一根反射光线，这个光线会在着色器中与一个简单的代理物体（房间周围的红色框）相交。这个交点与EM的中心形成一个新的方向$\mathbf{r}^{\prime}$，然后会像常规的环境映射一样，使用这个方向$\mathbf{r}^{\prime}$来访问EM。通过求解$\mathbf{r}^{\prime}$，这个过程会将EM视为具有一个实际的物理形状，即图中的红框。这个红色代理框的假设会在房间的左下角和右下角失效，因为代理形状与实际房间的几何形状并不匹配。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://sdpyy1.github.io/202307041728600.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;img&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;视差矫正从上图就很好理解，我反射采样点是R方向，但是物体并不在立方体贴图中间，如果按左图采样的方向是错的（他是假设着色点在立方体中心来采样的），按右图来看，他重新获取采样方向R&amp;rsquo;，才是正确的采样结果&lt;/p&gt;
&lt;p&gt;多探针组合&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;当一个区域被多个探针覆盖时，需要一种规则来组合它们：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;优先级法&lt;/strong&gt;：用户可以为探针设置优先级，高优先级探针覆盖低优先级探针&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;平滑插值法&lt;/strong&gt;：在相邻探针之间做线性/权重插值，保证过渡自然&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;问题&lt;/strong&gt;：简单的组合规则无法完全消除瑕疵，尤其是在高光或抛光材质上，容易出现反射拉伸或不自然。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;反射代理形状问题&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;反射代理（reflection proxy）通常是简化的几何形状（球、盒子、平面），很少能完全匹配真实场景几何。&lt;/li&gt;
&lt;li&gt;结果：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;反射拉伸&lt;/strong&gt;：高光表面上，反射看起来被拉伸或不真实&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;BRDF不完全正确&lt;/strong&gt;：渲染到环境贴图的物体可能在不同位置看起来不一样&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;漏光（light leaking）&lt;/strong&gt;：光线可能穿过代理，导致一些遮挡丢失&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;缓解方法：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;定向遮蔽（directional occlusion）&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;预计算漫反射光照&lt;/strong&gt;：将环境贴图反射值除以平均漫反射光照，只保留高频成分，再在着色时乘回漫反射&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;深度辅助方法&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Szirmay-Kalos&lt;/strong&gt;：每个探针存储深度贴图，查找时做光线追踪 → 精度更高，但成本大&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;McGuire&lt;/strong&gt;：用探针深度缓冲追踪光线，如果主探针信息不足，选择备用探针继续追踪 → 提升可靠性和精度&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;预过滤环境贴图问题&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;对光泽材质（glossy BRDF）：
&lt;ul&gt;
&lt;li&gt;EM通常是预过滤的，每个 mipmap 层表示不同卷积半径的入射辐射&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;问题&lt;/strong&gt;：视差校正会让反射方向在代理形状上的分布变化，使得卷积略不准确&lt;/li&gt;
&lt;li&gt;Pesce 和 Iwanicki 分析了这些问题并提出了潜在解决方案&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;反射代理形状的灵活性&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;代理不必是闭合或凸形，可以是：
&lt;ul&gt;
&lt;li&gt;平面矩形&lt;/li&gt;
&lt;li&gt;简单盒子&lt;/li&gt;
&lt;li&gt;球形代理&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;复杂代理能更精确表示周围几何，但会增加计算开销&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;反射探针的实时更新&#34;&gt;反射探针的实时更新
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;传统方法&lt;/strong&gt;：局部反射探针一般在离线阶段渲染和预过滤，生成高质量立方体贴图。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;问题&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;开放世界游戏中，时间变化、动态几何体和大量环境探针使得离线渲染不现实&lt;/li&gt;
&lt;li&gt;存储大量环境贴图会消耗磁盘空间&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;解决方案&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;一部分探针在加载阶段预渲染&lt;/li&gt;
&lt;li&gt;其他探针在进入相机视野时动态渲染&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;低帧率更新&lt;/strong&gt;：动态物体的反射不需要每帧都更新&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;可以定义每帧更新的探针数量&lt;/li&gt;
&lt;li&gt;使用启发式方法决定更新顺序，例如：探针到相机的距离、上次更新时间等&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;拆分立方体贴图渲染&lt;/strong&gt;：一个立方体贴图的6个面可以分布到6帧渲染，降低每帧开销&lt;/p&gt;
&lt;p&gt;高质量卷积通常需要多次采样，不适合高帧率实时更新&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;解决方法&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;重要性采样&lt;/strong&gt;（Colbert &amp;amp; Krivanek）：用少量样本（约64）进行近似滤波&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;mipmap层级采样&lt;/strong&gt;：根据启发式选择每个样本的 mipmap 层&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;基函数滤波&lt;/strong&gt;（Manson &amp;amp; Sloan）：先简单下采样+滤波，再组合 mipmap 构建最终贴图&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;纹理压缩&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;HDR 探针可压缩为 BC6H 半精度浮点格式&lt;/li&gt;
&lt;li&gt;减少显存占用和带宽消耗&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;G-buffer辅助渲染&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;离线生成场景的 G-buffer&lt;/li&gt;
&lt;li&gt;运行时只需计算光照和卷积&lt;/li&gt;
&lt;li&gt;可以在预生成 G-buffer 上渲染动态几何体，降低 CPU 开销&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;基于体素的方法&#34;&gt;基于体素的方法
&lt;/h2&gt;&lt;p&gt;体素锥形追踪，无论是使用稀疏八叉树进行存储[307]，还是其级联版本（章节11.5.7）[1190]，同样可以用于渲染高光效果&lt;/p&gt;
&lt;p&gt;对于光泽材质而言，使用锥形追踪的效率要高得多。在镜面光照的情况下，BRDF的波瓣会很狭窄，只需要考虑一个来自较小立体角的radiance，因此我们不再需要同时追踪多个圆锥区域，在大多数情况下，一个着色点只需要追踪一个圆锥就足够了。只有较为粗糙材质上的高光效果，才可能需要追踪多个圆锥，但是又因为这样的反射效果十分模糊，在这种情况下，我们只需要使用局部反射探针即可，根本不需要执行锥形追踪。&lt;/p&gt;
&lt;p&gt;就是Voxel Cone Tracing来进行着色，因为glossy表面的lobe很狭窄，相比于漫反射效率要高得多&lt;/p&gt;
&lt;h2 id=&#34;平面反射&#34;&gt;平面反射
&lt;/h2&gt;&lt;p&gt;&lt;img src=&#34;https://sdpyy1.github.io/202307051111816.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;img&#34;
	
	
&gt;&lt;/p&gt;
&lt;h4 id=&#34;方法-a反射场景副本&#34;&gt;方法 A：反射场景副本
&lt;/h4&gt;&lt;ol&gt;
&lt;li&gt;对每个反射的物体创建一个&lt;strong&gt;副本&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;将副本沿平面镜像变换到反射位置&lt;/li&gt;
&lt;li&gt;渲染副本物体生成反射图像&lt;/li&gt;
&lt;li&gt;光源也需进行镜像处理：
&lt;ul&gt;
&lt;li&gt;光源位置和方向也要镜像&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;将生成的图像用作反射贴图或者直接绘制到反射表面&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&#34;方法-b反射观察者&#34;&gt;方法 B：反射观察者
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;不改变场景中的物体，而是&lt;strong&gt;反射观察者（摄像机）位置和观察方向&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;通过修改投影矩阵，实现从镜面后的视角渲染场景&lt;/li&gt;
&lt;li&gt;优点：不需要复制场景物体&lt;/li&gt;
&lt;li&gt;关键点：仍需镜像光源位置/方向&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;屏幕空间方法&#34;&gt;屏幕空间方法
&lt;/h2&gt;&lt;blockquote&gt;
&lt;p&gt;这里讲的就是SSR，以及SSR的优化策略&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;统一方法&#34;&gt;统一方法
&lt;/h2&gt;&lt;p&gt;到目前为止我们所介绍的方法，它们可以组合成一个能够渲染漂亮图像的完整系统。然而，这些系统交错在一起，缺乏路径追踪的优雅性和概念简洁性。渲染方程的不同方面都会以不同的方式进行处理，在每个方面都做出了不同程度的妥协。尽管最终的生成图像看起来很逼真，但是在很多情况下，这些方法依然会失败，导致视错觉的中断。由于上述的这些原因，实时路径追踪一直是研究工作的重点。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;混合渲染管线（Hybrid Rendering Pipeline）&lt;/strong&gt;：更加合理、但不那么纯粹的方法是，使用路径跟踪方法来处理光栅化渲染框架内难以实现的效果。我们对相机可见的三角形进行光栅化，但是在计算反射效果的时候，我们不再依赖近似的反射代理或者不完整的屏幕空间信息，而是通过路径追踪来计算。我们不再尝试模拟具有模糊效果的面光源阴影，而是直接通过向光源追踪光线并计算正确的遮挡信息。&lt;/p&gt;
&lt;p&gt;为了生成高质量的图像，可能需要对每个像素追踪成百上千条光线。即使是使用最优的BVH、最高效的树遍历算法和最快速的GPU，目前也只能在最简单的场景中实时做到这一点，而在稍微复杂一点的场景中则根本无法实现。在可用的性能限制下，我们所生成的图像会具有非常多的噪点，根本无法用于显示。然而幸运的是，这些充满噪声的图像可以使用降噪算法来进行处理，从而产生基本无噪声的图像，如图11.42和图24.2所示。最近在实时光追降噪领域取得了令人印象深刻的进展，并且开发出了一些算法，可以在每像素仅追踪一根光线的情况下（1spp），创建视觉上接近高质量的、路径追踪生成的图像 [95, 200, 247, 1124, 1563]。&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Local Illumination 局部光照</title>
        <link>https://sdpyy1.github.io/p/local-illumination-%E5%B1%80%E9%83%A8%E5%85%89%E7%85%A7/</link>
        <pubDate>Wed, 22 Oct 2025 14:19:43 +0800</pubDate>
        
        <guid>https://sdpyy1.github.io/p/local-illumination-%E5%B1%80%E9%83%A8%E5%85%89%E7%85%A7/</guid>
        <description>&lt;img src="https://sdpyy1.github.io/202306151248940.png" alt="Featured image of post Local Illumination 局部光照" /&gt;&lt;blockquote&gt;
&lt;p&gt;内容包括：1. 将点光源拓展到面光源，并且介绍了一些在Lambertian表面或Glossy表面的实现方案 2.环境光照针对高光和漫反射的模拟的各种实现方案 3. 引入SH预计算的概念&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id=&#34;局部光照-local-illumination&#34;&gt;局部光照 (Local Illumination)
&lt;/h1&gt;&lt;p&gt;&lt;strong&gt;局部光照模型只考虑光源直接照射到表面点的光照贡献&lt;/strong&gt;，忽略：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;来自其他物体表面反射的间接光（Global Illumination 的一部分）&lt;/li&gt;
&lt;li&gt;场景中可能存在的全局光能量传播效应（如颜色反弹、光子映射、环境光照等）&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;也就是说，它计算的 $L_o$ 只来自：
&lt;/p&gt;
$$
L_o(\mathbf{p}, \mathbf{v}) = \sum_{\text{光源 } i} \int_{\omega_{L_i}} f_r(\mathbf{p}, \mathbf{l}, \mathbf{v}) L_i(\mathbf{p}, \mathbf{l}) (\mathbf{n}\cdot\mathbf{l})^+ d\mathbf{l}
$$&lt;ul&gt;
&lt;li&gt;积分域 $\omega_{L_i}$ = 光源 i 在半球上所占立体角&lt;/li&gt;
&lt;li&gt;如果光源面积很小 → 可以近似为点光源&lt;/li&gt;
&lt;li&gt;只计算直接光照 → 计算量低，适合实时渲染&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&#34;面光源&#34;&gt;面光源
&lt;/h1&gt;&lt;p&gt;这一节主要是对一些面光源的积分运算在diffuse和glossy表面的实时渲染近似方案&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://sdpyy1.github.io/202306151248940.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;img&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;球体使用了GGX BRDF来进行渲染，从左到右，球体材质的表面粗糙度递增。最右侧图像和最左侧图像是一样的，只是将其垂直翻转了过来。请注意，在低粗糙度的材质上，由大圆盘灯引起的高光和着色效果，与较小光源在高粗糙度材质上所引起的高光效果，在视觉上面十分相似。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://sdpyy1.github.io/202306151702326.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;img&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;这张图意思是使用点光源，并且调整粗糙度后，可以用来近似面光源的镜面效果。&lt;/p&gt;
&lt;h2 id=&#34;lambertian表面&#34;&gt;Lambertian表面
&lt;/h2&gt;&lt;p&gt;对于Lambertian表面这种特殊情况，直接使用点光源来表示面光源是很精确的。对于这样的表面，其出射的radiance与irradiance成正比：&lt;/p&gt;
$$
L_{o}(\mathbf{v})=\frac{\rho_{\mathrm{ss}}}{\pi} E
\tag{10.2}
$$&lt;p&gt;
也就是说对于Lambertian表面只要接受到的irrandance一致，那最终的radiance就是一样的。所以可以直接用点光源代替面光源（只是在Lambertian表面）&lt;/p&gt;
&lt;h3 id=&#34;向量irradiance&#34;&gt;向量irradiance
&lt;/h3&gt;&lt;blockquote&gt;
&lt;p&gt;这里说的一堆东西是一种用点光源代替面光源近似计算的实现方案，使用它的方法求出来的净辐照度来代替对整个面光源的积分运算&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;向量irradiance（vector irradiance）的概念对于当面光源存在时，理解irradiance的行为十分有用。向量irradiance的概念由Gershun [526]提出，他将其称之为光源向量（light vector），Arvo [73]将这个概念进一步推广。利用向量irradiance，可以将任意大小和任意形状的面光源，精确地转换为点光源或者方向光。&lt;/p&gt;
&lt;p&gt;这里的向量irradiance计算过程&lt;/p&gt;
$$
\mathbf{e}(\mathbf{p})=\int_{\mathbf{l} \in \Theta} L_{i}(\mathbf{p}, \mathbf{l}) \mathbf{l} d \mathbf{l}
\tag{10.4}
$$&lt;p&gt;
左图：点$\mathbf{p}$被各种具有形状、大小、radiance分布的光源所包围，其中黄色的明亮程度代表了光源发射出的radiance数量。以点$\mathbf{p}$为起点的橙色箭头代表了向量，它指向任何存在入射radiance的方向，每个向量的长度，等于来自该方向上的radiance乘以箭头所覆盖的无限小的立体角。原则上应当存在无穷多个箭头。右图：向量irradiance（橙色大箭头）是左图中所有橙色向量的总和。向量irradiance可以用来计算任意平面在点$\mathbf{p}$处的净irradiance。&lt;img src=&#34;https://sdpyy1.github.io/202306151804328.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;img&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;其中$\mathbf{n}$是平面的表面法线。通过平面的净irradiance，是指流经平面“正面”（表面法线$\mathbf{n}$所指向的方向）和流经平面“背面”的irradiance之差。虽然说净irradiance本身对于着色计算来说没有什么用处，但是如果说没有任何radiance被发射通过平面的“背面”的话（换句话说，对于所分析的光线分布，光线方向$\mathbf{l}$和表面法线$\mathbf{n}$之间的夹角都不会超过$90^{\circ}$，所有的入射光线都来自于着色点的正半球方向），即$E(\mathbf{p},-\mathbf{n})=0$，那么此时有：&lt;/p&gt;
$$
E(\mathbf{p}, \mathbf{n})=\mathbf{n} \cdot \mathbf{e}(\mathbf{p})
\tag{10.6}
$$&lt;p&gt;
&lt;img src=&#34;https://sdpyy1.github.io/202306151837959.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;img&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://sdpyy1.github.io/202306151837959-20251022161914154.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;图10.6：单个面光源的向量irradiance。左图中的箭头代表用于计算向量irradiance的单个向量。右图中的橙色大箭头代表的就是向量irradiance $\mathbf{e}$；红色虚线代表了光源的范围；红色向量（每个红色向量都垂直于一条红色虚线）定义了表面法线的极限范围，位于这个范围外的表面法线，将会与面光源的部分区域呈大于$90^{\circ}$的夹角，这样的法线无法使用$\mathbf{e}$来正确计算它们的irradiance。&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;如果入射radiance $L_i$与波长无关的假设不成立的话，那么在一般情况下，我们就不能再定义单个向量irradiance $\mathbf{e}$了。然而，彩色光通常在所有点上都具有相同的相对光谱分布，这意味着我们可以将$L_i$分解为颜色$\mathbf{c}^{\prime}$，以及与波长无关的radiance分布$L_i^{\prime}$。在这种情况下，我们可以计算$L_i^{\prime}$的向量irradiance $\mathbf{e}$，并对方程10.6进行一些扩展，将$\mathbf{n} \cdot \mathbf{e}$乘上颜色$\mathbf{c}^{\prime}$。这样做的结果与计算方向光irradiance的方程相同，只是做了以下替换：&lt;/p&gt;
$$
\begin{aligned} \mathbf{l}_{c} &amp; =\frac{\mathbf{e}(\mathbf{p})}{\|\mathbf{e}(\mathbf{p})\|}, \\ \mathbf{c}_{\text {light }} &amp; =\mathbf{c}^{\prime} \frac{\|\mathbf{e}(\mathbf{p})\|}{\pi} .\end{aligned}
\tag{10.7}  
$$&lt;p&gt;到此为止，我们已经可以将任意形状和任意大小的面光源转换为方向光，同时不会引入任何误差。&lt;/p&gt;
&lt;p&gt;对于一些简单情况，用于求取向量irradiance的方程10.4可以求出解析解。例如：想象现在有一个以$\mathbf{p}_l$为中心、半径为$r_l$的球形光源。球面上的每一点都会向各个方向发出具有恒定radiance $L_l$的光线。对于这种光源，将方程10.4和方程10.7联立，可以获得如下结果：&lt;/p&gt;
$$
\begin{aligned} \mathbf{l}_{c} &amp; =\frac{\mathbf{p}_{l}-\mathbf{p}}{\left\|\mathbf{p}_{l}-\mathbf{p}\right\|}, \\ \mathbf{c}_{\text {light }} &amp; =\frac{r_{l}^{2}}{\left\|\mathbf{p}_{l}-\mathbf{p}\right\|^{2}} L_{l} .\end{aligned}
\tag{10.8} 
$$&lt;p&gt;上述方程，与具有$\mathbf{c}&lt;em&gt;{\text {light }&lt;/em&gt;{0}}=L_{l}, r_{0}=r_{l}$和标准距离平方反比衰减函数的泛光灯（章节5.2.2）完全相同。可以对这个衰减函数进行一些修正，使得光线从球体表面才开始发生衰减，并在光源的最大影响距离处衰减到0，有关这些调整的更多细节，详见章节5.2.2。&lt;/p&gt;
&lt;h2 id=&#34;glossy表面&#34;&gt;Glossy表面
&lt;/h2&gt;&lt;p&gt;与 Lambertian 表面（仅依赖入射辐照度总量）不同，非 Lambertian 表面（如光泽、高光表面）的出射亮度，不仅依赖入射光总量，还依赖&lt;strong&gt;入射光的方向分布&lt;/strong&gt;—— 面光源在这类表面的核心视觉效果是 “与光源形状相似、边缘随粗糙度模糊的高光”&lt;/p&gt;
&lt;p&gt;在实时渲染中，大多数对面光源光照效果的实用近似，都是基于了这样的一个想法：为每个着色点都寻找一个等效的精确光源，从而模拟非无穷小光源的效果。这种方法经常被用于实时渲染中，以解决各种各样的问题&lt;/p&gt;
&lt;h3 id=&#34;粗糙度修正&#34;&gt;粗糙度修正
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;核心逻辑：找到面光源入射辐照度的 “有效圆锥体” 和 BRDF 镜面波瓣的 “有效圆锥体”，用两个圆锥体的立体角之和，修正材质的粗糙度参数，让镜面波瓣 “变宽”，模拟面光源的柔和高光。&lt;/li&gt;
&lt;li&gt;典型实现：Karis 将该思路应用于 GGX BRDF，修改粗糙度参数$(\alpha_g&amp;rsquo; = \left(\alpha_{g}+\frac{r_{l}}{2\left|\mathbf{p}_{l}-\mathbf{p}\right|}\right)^{\mp})$（限制在 0-1 之间）。&lt;/li&gt;
&lt;li&gt;优缺点：计算成本低，对中等光泽表面效果好；但对镜面级光滑表面失效（无法模拟锐利高光），且微表面 BRDF 的宽衰减特性会导致效果失真。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;代表性点技术&#34;&gt;代表性点技术
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;核心逻辑：基于 “积分中值定理”，用面光源上对表面能量贡献最大的一个 “代表性点”，替代整个面光源（将面光源简化为一个点光源），类似蒙特卡洛积分的重要性采样思想。&lt;/li&gt;
&lt;li&gt;关键操作：
&lt;ul&gt;
&lt;li&gt;选择代表性点：优先选 “与反射光线夹角最小” 或 “距离反射光线最近” 的点（Karis 改进后更高效）；&lt;/li&gt;
&lt;li&gt;能量修正：通过简单公式缩放光线强度，保证能量守恒。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;优缺点：推导简单、适用于多种光源形状；但会导致粗糙表面的高光偏 “尖锐”（与真实值有偏差），需额外优化。&lt;/li&gt;
&lt;li&gt;扩展优化：Iwanicki 和 Pesce 通过拟合数值积分结果，引入软阈值、缩放因子等参数；de Carpentier 针对微表面 BRDF，改用 “最大化$(\mathbf{n} \cdot \mathbf{h})$（法线与半向量点积）” 选择代表性点，优化掠射角下的高光形状。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;线性变换余弦ltc法高精度通用解决方案&#34;&gt;线性变换余弦（LTC）法：高精度通用解决方案
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;核心逻辑：用 “3×3 矩阵变换的余弦波瓣”（LTC）近似任意 BRDF 的镜面波瓣，通过矩阵对余弦波瓣进行缩放、拉伸、旋转，适配不同 BRDF 和光源形状；再利用逆矩阵变换积分定义域，将复杂积分转化为简单余弦波瓣的积分（可复用成熟算法）。&lt;/li&gt;
&lt;li&gt;关键优势：
&lt;ul&gt;
&lt;li&gt;通用性强：适用于任意纹理多边形面光源（卡片、圆盘、管状等）和一般 BRDF；&lt;/li&gt;
&lt;li&gt;准确性高：离线构建 BRDF 参数（粗糙度、入射角）的查找表，实时通过查找表快速求解。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;缺点：计算成本高于前两种方法，但准确性更优。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;一般光源形状的适配的处理&#34;&gt;一般光源形状的适配的处理
&lt;/h3&gt;&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;光源形状&lt;/th&gt;
          &lt;th&gt;适用场景&lt;/th&gt;
          &lt;th&gt;关键处理方式&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;球形光源&lt;/td&gt;
          &lt;td&gt;基础简化光源&lt;/td&gt;
          &lt;td&gt;粗糙度修正、代表性点技术（核心适配对象）&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;管状（胶囊）光源&lt;/td&gt;
          &lt;td&gt;模拟荧光灯管&lt;/td&gt;
          &lt;td&gt;Lambertian 表面可用 Picott 的封闭积分解；非 Lambertian 表面用代表性点技术叠加点光源&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;平面光源（卡片 / 圆盘 / 多边形）&lt;/td&gt;
          &lt;td&gt;柔光箱、反光板、发光面板等&lt;/td&gt;
          &lt;td&gt;- 简单近似：Drobot 的代表性点方法（找积分最大值附近的点）；- 精确解析：Arvo 的辐照度张量 + 轮廓积分（实时成本高）；- 实用优化：Lecocq 的 O (1) 轮廓积分近似&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h1 id=&#34;环境光照&#34;&gt;环境光照
&lt;/h1&gt;&lt;p&gt;在实践中，通常我们会认为直接光具有较高的radiance和相对较小的立体角，而间接光往往会以中等或者较低的radiance，来覆盖半球方向上的其余部分。基于这种划分方式和理由，我们可以将二者&lt;strong&gt;分开进行处理&lt;/strong&gt;。&lt;/p&gt;
&lt;h2 id=&#34;恒定环境光&#34;&gt;恒定环境光
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;核心假设&lt;/strong&gt;：入射辐射度 $L_A$ 不随方向变化（全方向恒定），是最基础的环境光照模型。&lt;/p&gt;
&lt;p&gt;对不同表面的贡献&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Lambertian（漫反射）表面&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;特点&lt;/strong&gt;：出射辐射度贡献恒定，与表面法线 $\mathbf{n}$ 和观察方向 $\mathbf{v}$ 无关。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;公式&lt;/strong&gt;：&lt;/li&gt;
&lt;/ul&gt;
$$
  L_o(\mathbf{v}) = \rho_{\mathrm{ss}} L_A
  $$&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;简化逻辑&lt;/strong&gt;：
漫反射的 BRDF 为 $\frac{\rho_{\mathrm{ss}}}{\pi}$，半球积分为 $\int_{\Omega} (\mathbf{n} \cdot \mathbf{l}) d\mathbf{l} = \pi$，因此最终 $\frac{\rho_{\mathrm{ss}}}{\pi} \cdot L_A \cdot \pi = \rho_{\mathrm{ss}} L_A$。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;任意 BRDF 表面&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;特点&lt;/strong&gt;：贡献依赖定向反照率 $R(\mathbf{v})$。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;定向反照率定义&lt;/strong&gt;：&lt;/li&gt;
&lt;/ul&gt;
$$
  R(\mathbf{v}) = \int_{\Omega} f(\mathbf{l}, \mathbf{v}) (\mathbf{n} \cdot \mathbf{l}) \, d\mathbf{l}
  $$&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;出射辐射度公式&lt;/strong&gt;：&lt;/li&gt;
&lt;/ul&gt;
$$
  L_o(\mathbf{v}) = L_A \cdot R(\mathbf{v})
  $$&lt;hr&gt;
&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;老版本简化（近似方案）&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;假设&lt;/strong&gt;：定向反照率 $R(\mathbf{v})$ 为恒定值（称为环境颜色 $\mathbf{c}_{\mathrm{amb}}$）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;公式&lt;/strong&gt;：&lt;/li&gt;
&lt;/ul&gt;
$$
  L_o(\mathbf{v}) = \mathbf{c}_{\mathrm{amb}} \cdot L_A
  $$&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;球面函数和半球函数&#34;&gt;球面函数和半球函数
&lt;/h2&gt;&lt;p&gt;把环境光照 $L_A$ 视为一个常数，这意味着：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;每个方向来的光强都是相同的。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;但真实世界中并非如此。一个点从不同方向接收到的光强往往不同，例如：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;左边可能是红墙 → 红色光；&lt;/li&gt;
&lt;li&gt;右边可能是绿树 → 绿色光；&lt;/li&gt;
&lt;li&gt;上方可能被遮挡 → 几乎没有光。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;因此，要描述这种“&lt;strong&gt;方向依赖的入射辐射度（radiance）&lt;/strong&gt;”，我们需要一个定义在**方向空间（sphere）**上的函数。&lt;/p&gt;
&lt;p&gt;我们把所有方向的集合记为：
&lt;/p&gt;
$$
S = \{\omega \in \mathbb{R}^3 : ||\omega|| = 1\}
$$&lt;p&gt;
于是，一个方向依赖的入射辐射度可以写为：
&lt;/p&gt;
$$
L_i(\omega) : S \rightarrow \mathbb{R}^+
$$&lt;p&gt;
它表示从方向 $\omega$ 入射的 radiance。&lt;/p&gt;
&lt;p&gt;这个函数定义在球面上（而非位置上），因此叫&lt;strong&gt;球面函数（spherical function）&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;对于一个 Lambertian 表面，其出射辐射度与入射辐射度的关系是：
&lt;/p&gt;
$$
L_o = \frac{\rho}{\pi} \int_{H(\mathbf{n})} L_i(\omega_i) (\mathbf{n} \cdot \omega_i) d\omega_i
$$&lt;p&gt;
其中：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;$H(\mathbf{n})$：法线方向上的半球；&lt;/li&gt;
&lt;li&gt;$(\mathbf{n} \cdot \omega_i)$：余弦项；&lt;/li&gt;
&lt;li&gt;这个积分就是&lt;strong&gt;radiance 与余弦波瓣的卷积&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;因此，为了实时渲染，我们往往预计算：
&lt;/p&gt;
$$
E(\mathbf{n}) = \int_{H(\mathbf{n})} L_i(\omega_i) (\mathbf{n} \cdot \omega_i) d\omega_i
$$&lt;p&gt;
并把它称为 &lt;strong&gt;irradiance function&lt;/strong&gt;，它是球面函数的卷积结果。预计算每个法线半球的irradiance。&lt;/p&gt;
&lt;p&gt;球面函数是定义在球面上的连续函数，不可能直接存储。所以我们要找一种“基底”，用有限个系数表示它。这就类似于在平面上用傅立叶级数展开周期函数。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;例如：
$f(\omega) = \sum_{l,m} c_{lm} Y_{lm}(\omega)$，
其中 $Y_{lm}$ 是&lt;strong&gt;球谐函数（Spherical Harmonics）&lt;/strong&gt;。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;这类基底称为：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;球面基底（Spherical Base）&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;包括球谐函数、Haar 小波基、径向基、环境高光基底（AHD）等。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;投影（Projection）&lt;/strong&gt;：
把函数 $L_i(\omega)$ 投影到基底空间，求出系数：
&lt;/p&gt;
$$
c_{lm} = \int_S L_i(\omega) Y_{lm}(\omega) d\omega
$$&lt;p&gt;
&lt;strong&gt;重建（Reconstruction）&lt;/strong&gt;：
通过这些系数恢复函数：
&lt;/p&gt;
$$
\tilde{L_i}(\omega) = \sum_{l,m} c_{lm} Y_{lm}(\omega)
$$&lt;blockquote&gt;
&lt;p&gt;总结一下：一个定义在球面上的函数 $f(\omega)$，可以用一组球面基函数 $Y_l^m(\omega)$ 的线性组合来近似表示。
你只需要计算保存这些线性组合的&lt;strong&gt;系数&lt;/strong&gt;，在任何方向上（角度）都可以通过这些系数 + 基函数重建出近似值。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;球面基底的简单表示形式&#34;&gt;球面基底的简单表示形式
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;表格（采样点）表示球面函数&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;方法&lt;/strong&gt;：直接在球面上选若干方向 $\omega_i$，存储每个方向上的函数值 $f(\omega_i)$。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;重建&lt;/strong&gt;：当需要某个方向 $\omega$ 的值时，找到附近的样本点，用插值（如双线性或三线性）求出近似值。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;优点&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;非常直观，易于理解和实现；&lt;/li&gt;
&lt;li&gt;表征能力强，只要采样足够密集，几乎可以精确还原原函数；&lt;/li&gt;
&lt;li&gt;函数相加/相乘简单：直接对对应采样点的值相加或相乘。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;缺点&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;样本少时重建误差大；&lt;/li&gt;
&lt;li&gt;旋转不变性差（函数旋转后，插值结果可能不准确，导致闪烁或脉动瑕疵）；&lt;/li&gt;
&lt;li&gt;高频函数需要大量样本，存储和计算量大；&lt;/li&gt;
&lt;li&gt;卷积等操作复杂，计算成本和样本数量成正比。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;
&lt;p&gt;环境立方体（Ambient Cube, AC）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;思想&lt;/strong&gt;：用 6 个值（立方体六个面）表示球面函数。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;公式&lt;/strong&gt;：&lt;/li&gt;
&lt;/ul&gt;
$$
   F_{AC}(\mathbf{d}) = \mathbf{d} \cdot \operatorname{sel}_+(\mathbf{c}_+, \mathbf{c}_-, \mathbf{d})
   $$&lt;ul&gt;
&lt;li&gt;$\mathbf{d}$ 是方向向量；&lt;/li&gt;
&lt;li&gt;$\mathbf{c}&lt;em&gt;+$ 和 $\mathbf{c}&lt;/em&gt;-$ 是立方体六个面的值；&lt;/li&gt;
&lt;li&gt;$\operatorname{sel}_+$ 根据方向的正负性选择对应面。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;特点&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;只需三个波瓣参与计算（x、y、z方向）；&lt;/li&gt;
&lt;li&gt;在软件重建上可能比 GPU 双线性过滤更快；&lt;/li&gt;
&lt;li&gt;精度低，但实现简单；&lt;/li&gt;
&lt;li&gt;可以和球谐 SH 互相转换（Sloan 提供方法）。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;环境骰子（Ambient Dice, AD）：&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;基底由二十面体顶点方向上的平方和四次余弦波瓣组成；&lt;/li&gt;
&lt;li&gt;需要存储 12 个值中的 6 个来重建；&lt;/li&gt;
&lt;li&gt;重建质量比环境立方体高，但逻辑稍复杂。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;球面基底&#34;&gt;球面基底
&lt;/h3&gt;&lt;p&gt;基函数的一个例子。在这个例子中，输入值为0-5之间的一个数，函数会返回0-1之间一个值，左侧的图展示了这样一个函数。中间的图展示了一组基函数（每种颜色都代表了一个不同的基函数）。右图则展示了使用基函数来对目标函数的近似，通过将每个基函数乘以一个权重并将它们相加来完成这个近似。右图中的每个基函数都按照各自的权重进行了缩放，图中的黑色线条代表了基函数求和之后的结果，这是对原始函数的近似结果；图中灰色线条代表了原始函数，用于和近似函数进行比较。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://sdpyy1.github.io/202306191318043.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;img&#34;
	
	
&gt;&lt;/p&gt;
&lt;h4 id=&#34;球面径向基函数srbf&#34;&gt;球面径向基函数（SRBF）
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;定义&lt;/strong&gt;：一类沿轴旋转对称的函数，只依赖于 &lt;strong&gt;方向之间的夹角&lt;/strong&gt;。
&lt;ul&gt;
&lt;li&gt;输入参数 = 方向 $\mathbf{v}$ 与波瓣方向 $\mathbf{d}$ 的夹角。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;构建方法&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;将球面覆盖上若干固定方向的“波瓣”（lobe）；&lt;/li&gt;
&lt;li&gt;每个波瓣有大小/尖锐度参数；&lt;/li&gt;
&lt;li&gt;函数值 = 所有波瓣在该方向上的值加权求和。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;优点&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;可以获得比双线性插值更高质量的重建；&lt;/li&gt;
&lt;li&gt;可通过固定波瓣方向，简化投影（只需拟合权重）。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;球面高斯sg-spherical-gaussian&#34;&gt;球面高斯（SG, Spherical Gaussian）
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;定义&lt;/strong&gt;：一种常用的 SRBF，类似 von Mises-Fisher 分布：&lt;/li&gt;
&lt;/ul&gt;
$$
G(\mathbf{v}, \mathbf{d}, \lambda) = e^{\lambda(\mathbf{v} \cdot \mathbf{d}-1)}
$$&lt;ul&gt;
&lt;li&gt;$\mathbf{v}$：计算方向&lt;/li&gt;
&lt;li&gt;$\mathbf{d}$：波瓣主方向&lt;/li&gt;
&lt;li&gt;$\lambda$：尖锐度/扩散参数&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;球面函数表示&lt;/strong&gt;：&lt;/li&gt;
&lt;/ul&gt;
$$
F_G(\mathbf{v}) = \sum_k w_k G(\mathbf{v}, \mathbf{d}_k, \lambda_k)
$$&lt;ul&gt;
&lt;li&gt;通过拟合 $w_k$ 来最小化重建误差。&lt;/li&gt;
&lt;li&gt;如果波瓣方向和扩散参数固定，投影成基就简单 → 线性最小二乘法。&lt;/li&gt;
&lt;li&gt;如果方向/扩散参数可变 → 非线性优化，难度大。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;球谐函数spherical-harmonicsh&#34;&gt;球谐函数（spherical harmonic，SH）
&lt;/h4&gt;&lt;p&gt;球谐函数（spherical harmonic，SH）是球面上的一组正交的基函数。一组基函数的正交集（orthogonal set）具有如下特点：任意两个&lt;strong&gt;不同基函数之间的内积（inner product）为零&lt;/strong&gt;。内积是一个类似于点积的概念。两个向量之间的内积就是它们的点积，即各个分量对应相乘再相加的结果。我们可以类似地推导出&lt;strong&gt;两个函数的内积的定义&lt;/strong&gt;，即将这两个函数相乘再进行积分，其数学表达如下：&lt;/p&gt;
$$
\left\langle f_{i}(\mathbf{n}), f_{j}(\mathbf{n})\right\rangle \equiv \int_{\mathbf{n} \in \Theta} f_{i}(\mathbf{n}) f_{j}(\mathbf{n}) d \mathbf{n}
$$&lt;blockquote&gt;
&lt;p&gt;下面说的是为了说明什么是标准正交基，以及他的优势对比普通基底&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;标准正交集（orthonormal set）也是一个正交集，其附加条件是该集合中的任意一个函数与自身的内积都为1。更加正式的表述方式为，一组函数${f_j()}$是标准正交的条件是：&lt;/p&gt;
$$
\left\langle f_{i}(), f_{j}()\right\rangle=\left\{\begin{array}{ll}0, &amp; \text { where } i \neq j, \\ 1, &amp; \text { where } i=j .\end{array}\right.
$$&lt;p&gt;
展示了一个类似于图10.18的例子，不同之处在于，其中的基函数都是标准正交的。请注意，图10.20中的所展示的标准正交基函数都是互不重叠的，这个条件对于非负函数的标准正交集合是十分必要的，因为任何的重叠都意味着内积非零。而对于那些在部分范围内为负的基函数，则可以发生重叠，它们仍然可以形成标准正交集。这种重叠通常会得到更好的近似结果，因为它允许使用更加平滑的基底。而那些互不重叠的基函数，往往会导致近似结果的不连续性。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://sdpyy1.github.io/202306191454474.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;img&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;标准正交基的优点在于，想要找到最接近目标函数的近似值十分简单。为了完成投影操作，每个基函数的权重系数都是目标函数$f_{\text {target }}() $与相应基函数的内积：&lt;/p&gt;
$$
\begin{array}{c}k_{j}=\left\langle f_{\text {target }}(), f_{j}()\right\rangle, \\[2mm]
 f_{\text {target }}() \approx \sum_{j=1}^{n} k_{j} f_{j}() .\end{array}
 \tag{10.23}
$$&lt;p&gt;
SH的基&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://sdpyy1.github.io/202306191809330.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;img&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;SH 的特点&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;旋转不变性&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;基函数在旋转下有解析变换公式，旋转投影函数方便。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;计算成本低&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;基函数是 $x, y, z$ 坐标的多项式。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;全局支持&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;类似球面高斯，每个基函数影响球面上所有方向。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;频带排列&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;第 0 频带：常数函数&lt;/li&gt;
&lt;li&gt;第 1 频带：线性函数&lt;/li&gt;
&lt;li&gt;第 2 频带：二次函数&lt;/li&gt;
&lt;li&gt;… → 低频分量变化慢，高频分量变化快&lt;/li&gt;
&lt;li&gt;光照积分等低频函数可以用少量系数表示（比如 irradiance）。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;积分和乘积解析&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;两个函数在球面上的积分可以转化为它们系数的点积 → 高效计算光照积分。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&#34;其他球面表示方法&#34;&gt;其他球面表示方法
&lt;/h4&gt;&lt;p&gt;除了 SH，还有：&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;方法&lt;/th&gt;
          &lt;th&gt;特点&lt;/th&gt;
          &lt;th&gt;用途&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;线性变换余弦（LTC）&lt;/td&gt;
          &lt;td&gt;近似 BRDF&lt;/td&gt;
          &lt;td&gt;高效积分&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;球面小波（spherical wavelet）&lt;/td&gt;
          &lt;td&gt;空间局部性 + 频率局部性&lt;/td&gt;
          &lt;td&gt;高频函数压缩&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;球面分段常数基函数&lt;/td&gt;
          &lt;td&gt;球面划分为常数区域&lt;/td&gt;
          &lt;td&gt;环境光照表示&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;双聚类近似（biclustering）&lt;/td&gt;
          &lt;td&gt;矩阵分解方法&lt;/td&gt;
          &lt;td&gt;环境光照压缩&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;半球基底&#34;&gt;半球基底
&lt;/h3&gt;&lt;p&gt;为什么要用半球基底&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;上节讲的 SH、球面高斯等基底都是定义在 &lt;strong&gt;整个球面&lt;/strong&gt; 上。&lt;/li&gt;
&lt;li&gt;但是很多光照相关函数 &lt;strong&gt;天然只定义在半球&lt;/strong&gt;（例如 BRDF、入射辐照度、到达表面的光照），另一半球（向下）是零。&lt;/li&gt;
&lt;li&gt;如果用全球基底来表示半球函数，会 &lt;strong&gt;浪费一半的表示能力&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;因此研究者提出了 &lt;strong&gt;直接在半球域上构造的基底&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;ahd基底&#34;&gt;AHD基底
&lt;/h4&gt;&lt;p&gt;最简单的半球表示方法：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A：恒定环境光&lt;/li&gt;
&lt;li&gt;H：高光方向光&lt;/li&gt;
&lt;li&gt;D：入射光集中的方向&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;存储：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;8 个参数（2 个角度 + 6 个 RGB 颜色）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;投影：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;非线性 → 通常先投影到 SH，再用最优方向确定余弦波瓣方向 → 最小二乘求权重&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;用途：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;表面 irrandiance 存储&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;游戏应用：《雷神之锤3》《使命召唤》&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;半条命2基底radiosity-normal-mapping&#34;&gt;半条命2基底（Radiosity Normal Mapping）
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;用 3 个 &lt;strong&gt;互相垂直的基向量&lt;/strong&gt;表示半球函数&lt;/li&gt;
&lt;li&gt;基向量在切线空间中：&lt;/li&gt;
&lt;/ul&gt;
$$
\mathbf{m}_0, \mathbf{m}_1, \mathbf{m}_2
$$&lt;ul&gt;
&lt;li&gt;重建公式：&lt;/li&gt;
&lt;/ul&gt;
$$
E(\mathbf{n}) = \frac{\sum_{k=0}^{2} \max(\mathbf{m}_k \cdot \mathbf{n}, 0)^2 E_k}{\sum_{k=0}^{2} \max(\mathbf{m}_k \cdot \mathbf{n}, 0)^2} \quad \text{(10.25)}
$$&lt;ul&gt;
&lt;li&gt;优化后可简化为线性加权形式：&lt;/li&gt;
&lt;/ul&gt;
$$
E(\mathbf{n}) = \sum_{k=0}^{2} d_k E_k \quad \text{(10.27)}
$$&lt;ul&gt;
&lt;li&gt;特点：
&lt;ul&gt;
&lt;li&gt;存储少、计算快&lt;/li&gt;
&lt;li&gt;可与法线贴图结合&lt;/li&gt;
&lt;li&gt;实际效果优于低阶 SH&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;半球谐波--h-basis&#34;&gt;半球谐波 / H-Basis
&lt;/h4&gt;&lt;p&gt;将 SH 特化到半球域：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;半球谐波（HSH）：类似 SH，但只定义在半球&lt;/li&gt;
&lt;li&gt;可以使用 Zernike 多项式（单位圆盘上的正交函数）来表示半球函数&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;H-Basis（Habel）：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;混合部分球谐函数 + HSH&lt;/li&gt;
&lt;li&gt;正交&lt;/li&gt;
&lt;li&gt;计算效率较高&lt;/li&gt;
&lt;li&gt;可以对系数向量进行矩阵运算完成旋转&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&#34;环境映射&#34;&gt;环境映射
&lt;/h1&gt;&lt;p&gt;将一个球面函数记录在一个或者多个图像中的做法，被称为环境映射（environment mapping）&lt;/p&gt;
&lt;h2 id=&#34;经纬度映射&#34;&gt;经纬度映射
&lt;/h2&gt;&lt;blockquote&gt;
&lt;p&gt;就是把环境光贴图表达为经纬度采样，计算要采样方向的经纬度，去对应位置读取&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;起源&lt;/strong&gt;：1976年，Blinn 和 Newell 实现了第一个环境映射算法。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;原理&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;把球面上的环境信息“展开”到二维纹理。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;类似地球上的经纬度系统：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;$\phi$（经度） → $[-π, π]$&lt;/li&gt;
&lt;li&gt;$\rho$（纬度） → $[0, π]$&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;将反射向量 $\mathbf{r} = (r_x, r_y, r_z)$ 转换为球坐标：
&lt;/p&gt;
$$
  \rho = \arccos(r_z), \quad 
  \phi = \text{atan2}(r_y, r_x) \quad \text{(10.30)}
  $$&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;用 $(\rho, \phi)$ 来访问纹理，获取环境颜色。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;注意&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;纬度-经度映射 ≠ Mercator 投影：
&lt;ul&gt;
&lt;li&gt;纬度-经度映射保持纬度线之间的距离恒定。&lt;/li&gt;
&lt;li&gt;Mercator 投影在两极会极度拉伸。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;球面映射&#34;&gt;球面映射
&lt;/h2&gt;&lt;p&gt;球面映射把环境光照记录在一个&lt;strong&gt;圆形纹理图像&lt;/strong&gt;中，就像在一个完全反射的球体上看到环境一样。这个纹理也称为&lt;strong&gt;光照探针（light probe）&lt;/strong&gt;，因为它捕捉了球体位置处的光照。&lt;/p&gt;
&lt;p&gt;计算流程&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;固定观察向量&lt;/strong&gt; $\mathbf{v} = (0,0,1)$：
球面贴图是在一个固定视角下拍摄或者生成的，反映了这个方向的环境信息。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;求半角向量&lt;/strong&gt; $\mathbf{n}$：
反射观察向量 $\mathbf{r}$ 和原始观察向量 $\mathbf{v}$ 的和：
&lt;/p&gt;
$$
   \mathbf{n} = \frac{(r_x, r_y, r_z + 1)}{\sqrt{r_x^2 + r_y^2 + (r_z + 1)^2}}
   $$&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;映射到纹理坐标&lt;/strong&gt; $(u,v)$：
&lt;/p&gt;
$$
   u = \frac{r_x}{2 m} + 0.5, \quad v = \frac{r_y}{2 m} + 0.5
   $$&lt;ul&gt;
&lt;li&gt;这里 $m = \sqrt{r_x^2 + r_y^2 + (r_z + 1)^2}$&lt;/li&gt;
&lt;li&gt;将 $[-1,1]$ 范围映射到 $[0,1]$&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;纹理查找&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;使用 $(u,v)$ 在球面贴图中查找对应的入射辐射 $L_i(\mathbf{r})$&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;立方体映射&#34;&gt;立方体映射
&lt;/h2&gt;&lt;p&gt;将环境投影到以相机位置为中心的立方体六个面上，每个面90° FOV。&lt;/p&gt;
&lt;p&gt;六张正方形纹理分别对应立方体的 +X、-X、+Y、-Y、+Z、-Z。&lt;/p&gt;
&lt;p&gt;访问纹理时，直接用方向向量 $\mathbf{r}$ 指向哪个面，再根据面内坐标取值即可。 &lt;strong&gt;这个在LearnOpenGL中实现过&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://sdpyy1.github.io/202306201605223.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;img&#34;
	
	
&gt;&lt;/p&gt;
&lt;h1 id=&#34;基于图像的高光照明&#34;&gt;基于图像的高光照明
&lt;/h1&gt;&lt;blockquote&gt;
&lt;p&gt;这里讲的就是LearnOpenGL的IBL实现，高光就是反射的一个范围内都能接收到&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;环境映射最初是作为一种镜面渲染技术发展起来的，但是也可以将它扩展到光泽（glossy）反射中。当用于模拟无限远处光源的镜面效果时，这样的环境贴图也被称为高光探针（specular light probe）。（这里的镜面反射就是只有反射方向的颜色，光泽反射就是反射的一个范围内都能接收到）&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;先解释一下lobe是什么，lobe说的都是BRDF的lobe&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;对于一个 &lt;strong&gt;给定的入射方向&lt;/strong&gt; $\mathbf{l}$，BRDF $f_r(\mathbf{l}, \mathbf{v})$ 会定义出 &lt;strong&gt;所有出射方向&lt;/strong&gt; $\mathbf{v}$ 上的反射强度。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;**波瓣（lobe）**就是指这个方向空间中 &lt;strong&gt;反射值显著非零的区域&lt;/strong&gt;。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;理想镜面 → 波瓣无限尖锐，只在反射方向上非零。&lt;/li&gt;
&lt;li&gt;光泽表面 → 波瓣稍宽，附近方向也有非零反射。&lt;/li&gt;
&lt;li&gt;漫反射 → 波瓣非常宽，几乎整个半球都有非零反射。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;下图展示镜面和高光的区别&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;https://sdpyy1.github.io/202306201747328.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;img&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;径向对称的镜面波瓣：反射方向在lobe中心&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://sdpyy1.github.io/%e6%88%aa%e5%b1%8f2025-10-24-14.46.40.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;截屏2025-10-24 14.46.40&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;径向对称的镜面波瓣是一种渲染的假设，但会存在地平线裁剪问题&lt;/p&gt;
&lt;p&gt;对于上边这种情况，观察球的表面时lobe会被地平线裁剪，这时候经径向对称的镜面波瓣假设是错的，会让表面高光过亮&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://sdpyy1.github.io/202306201853156.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;img&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;环境贴图 + mipmap 模拟粗糙度&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Heidrich 和 Seidel 方法&lt;/strong&gt;：用一个环境贴图来模拟表面模糊反射。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;粗糙度的处理&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;环境立方体贴图生成多级 mipmap。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;低级别 mipmap&lt;/strong&gt;：高分辨率，对应光滑表面（高光尖锐）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;高级别 mipmap&lt;/strong&gt;：低分辨率，对应粗糙表面（高光模糊）。&lt;/li&gt;
&lt;li&gt;渲染时，通过 &lt;strong&gt;反射向量索引贴图&lt;/strong&gt; 并选择对应 mipmap 层，实现不同粗糙度的反射。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;图10.36显示了不同粗糙度波瓣对应的 mipmap 层级及渲染结果。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;卷积环境贴图&#34;&gt;卷积环境贴图
&lt;/h2&gt;&lt;p&gt;想要生成预过滤的环境贴图意味着，要对与方向$\mathbf{v}$相关的每个纹素上，计算环境radiance与镜面波瓣$D$的积分：&lt;/p&gt;
$$
\int_{\Omega} D(\mathbf{l}, \mathbf{v}) L_{i}(\mathbf{l}) d \mathbf{l}.
$$&lt;p&gt;这个积分是一个球面卷积（spherical convolution），由于其中的$L_i$只能通过环境贴图的表格形式获得，因此这个积分通常无法解析求解，只能通过数值方法进行求解。一种流行的数值方法是采用蒙特卡罗方法：&lt;/p&gt;
$$
\int_{\Omega} D(\mathbf{l}, \mathbf{v}) L_{i}(\mathbf{l}) d \mathbf{l} \approx \lim _{N \rightarrow \infty} \frac{1}{N} \sum_{k=1}^{N} \frac{D\left(\mathbf{l}_{k}, \mathbf{v}\right) L_{i}\left(\mathbf{l}_{k}\right)}{p\left(\mathbf{l}_{k}, \mathbf{v}\right)}
\tag{10.36}
$$&lt;p&gt;
蒙特卡罗积分&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;通过随机采样球面方向近似积分：
&lt;/p&gt;
$$
  \int_\Omega D(\mathbf{l}, \mathbf{v}) L_i(\mathbf{l}) \, d\mathbf{l} \approx \frac{1}{N} \sum_{k=1}^{N} \frac{D(\mathbf{l}_k, \mathbf{v}) L_i(\mathbf{l}_k)}{p(\mathbf{l}_k, \mathbf{v})}
  $$&lt;ul&gt;
&lt;li&gt;$\mathbf{l}_k$ 是球面样本方向&lt;/li&gt;
&lt;li&gt;$p(\mathbf{l}_k, \mathbf{v})$ 是采样概率密度&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;问题&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;高光波瓣很尖，很多样本 $D(\mathbf{l}_k, \mathbf{v})\approx 0$ → 浪费计算&lt;/li&gt;
&lt;li&gt;第一级 mipmap（高分辨率，低粗糙度）尤其慢&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;重要性采样（Importance Sampling）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;通过选择采样概率 $p(\mathbf{l}_k, \mathbf{v})$ 更贴近波瓣形状&lt;/li&gt;
&lt;li&gt;减少无效样本，降低方差&lt;/li&gt;
&lt;li&gt;可以结合 &lt;strong&gt;环境贴图的 radiance 分布&lt;/strong&gt; 和镜面波瓣进一步优化&lt;/li&gt;
&lt;li&gt;适合 &lt;strong&gt;离线渲染&lt;/strong&gt; 或生成 ground-truth 数据&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;用锥形 / 区域采样降低方差&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;不用单点采样，而是用 &lt;strong&gt;锥形区域&lt;/strong&gt; 样本代替一个方向&lt;/li&gt;
&lt;li&gt;可以对应 mipmap 层级进行近似&lt;/li&gt;
&lt;li&gt;会引入偏差，但显著降低样本数，甚至可以 &lt;strong&gt;GPU 实时计算&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;示例技术&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;McGuire 等人：实时近似卷积，通过混合不同 mipmap 层级来重建波瓣&lt;/li&gt;
&lt;li&gt;Hensley 等人：使用 SAT（前缀和）加速积分&lt;/li&gt;
&lt;li&gt;Kautz / Manson &amp;amp; Sloan：B 样条滤波生成 mipmap，提高精度与速度&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;缺点&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;忽略了 shadowing-masking 和半向量菲涅尔。&lt;/li&gt;
&lt;li&gt;仅适合粗略镜面近似或 Phong 模型。&lt;/li&gt;
&lt;li&gt;会产生误差，如地平线裁剪或掠射角下波瓣尖锐变化&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;split-sum&#34;&gt;split-sum
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;改进&lt;/strong&gt;：将镜面环境光积分拆分为两个部分：
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;环境光卷积&lt;/strong&gt;：波瓣 $D$ 与环境光 $L_i$ 的积分，依赖于反射方向和粗糙度，可预计算到立方体贴图 mipmap。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;半球定向反射率 $R_\text{spec}$&lt;/strong&gt;：包含 BRDF 权重（菲涅尔、shadowing-masking），依赖于视角、粗糙度，可预计算到二维或三维查找表。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;优势：
&lt;ul&gt;
&lt;li&gt;对任意微表面 BRDF 都适用，不只是 Phong。&lt;/li&gt;
&lt;li&gt;运行时快速查表即可获得高光结果。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;注意：
&lt;ul&gt;
&lt;li&gt;假设波瓣径向对称（仍会有误差）。&lt;/li&gt;
&lt;li&gt;可以通过轻微调整查询方向来补偿半球裁剪误差。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;不对称和各向异性波瓣&#34;&gt;不对称和各向异性波瓣
&lt;/h3&gt;&lt;p&gt;传统预过滤环境贴图的假设&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;早期方法（如 10.5.1）假设&lt;strong&gt;镜面波瓣是径向对称&lt;/strong&gt;，仅依赖于反射向量。&lt;/li&gt;
&lt;li&gt;这种方法在 Phong 或简单各向同性 BRDF 下有效。&lt;/li&gt;
&lt;li&gt;波瓣的径向对称意味着：
&lt;ul&gt;
&lt;li&gt;波瓣围绕反射向量旋转时，形状不变。&lt;/li&gt;
&lt;li&gt;高光大小只由粗糙度决定，与光线方向旋转无关。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;微表面 BRDF 的复杂性&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;微表面 BRDF（如 GGX）是围绕&lt;strong&gt;半向量 $\mathbf{h}=(\mathbf{l}+\mathbf{v})/|\mathbf{l}+\mathbf{v}|$&lt;/strong&gt; 定义的。&lt;/li&gt;
&lt;li&gt;半向量依赖入射方向 $\mathbf{l}$，环境光下 $\mathbf{l}$ 并不唯一。&lt;/li&gt;
&lt;li&gt;因此即便各向同性，也&lt;strong&gt;无法满足反射向量径向对称&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;直接将微表面 BRDF 转换为径向对称波瓣会引入较大误差（高光形状偏离真实情况，尤其在掠射视角）。
&lt;ul&gt;
&lt;li&gt;图10.38 显示 GGX 原生波瓣（红） vs. 径向对称近似波瓣（绿），差异明显。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;改进方法&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Kautz &amp;amp; McCool&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;使用单个最佳样本拟合 BRDF，而不是恒定修正因子。&lt;/li&gt;
&lt;li&gt;对多个样本平均，近似半向量模型的拉伸高光。&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;引入能量修正因子，补偿径向对称近似的能量损失。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Iwanicki &amp;amp; Pesce&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;对 GGX BRDF 做环境立方体贴图近似，利用 Nelder-Mead 最小化优化样本位置。&lt;/li&gt;
&lt;li&gt;可以结合 GPU 各向异性过滤加速采样。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Revie / McAuley&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;在延迟渲染和毛皮渲染中，调整单个样本位置以匹配复杂 BRDF 峰值。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;McAllister / Lafortune BRDF&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;利用 Lafortune BRDF（多个广义 Phong 波瓣叠加）表达复杂材质。&lt;/li&gt;
&lt;li&gt;依然可以用传统预过滤环境贴图和 mipmap 编码不同 Phong 指数。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&#34;irradiance环境映射&#34;&gt;irradiance环境映射
&lt;/h1&gt;&lt;p&gt;上一小节中我们讨论了如何使用预过滤环境贴图来实现光泽反射，这些贴图同样也可以用于实现漫反射&lt;/p&gt;
&lt;p&gt;计算irradiance环境贴图的过程。在原始环境纹理（本例中是一个立方体贴图）中对表面法线周围的余弦加权半球进行采样，并对采样结果进行求和，从而获得与视图无关的irradiance。图中绿色的方块代表了立方体贴图的横截面，红色的虚线代表了纹素之间的边界。这里使用的是一个立方体贴图，但实际上任何环境表示都是可以使用的。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://sdpyy1.github.io/202306211248385.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;img&#34;
	
	
&gt;&lt;/p&gt;
&lt;h2 id=&#34;球谐irradiance&#34;&gt;球谐irradiance
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;漫反射光照低频&lt;/strong&gt;：irradiance 随表面法线变化平滑，适合用低阶 SH 表示。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;低阶 SH 足够&lt;/strong&gt;：前 9 个系数（每个 RGB 通道）就能表示环境光，误差约 1%；间接光照甚至只需 4 个系数（12 个浮点数）。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;卷积方法高效&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;从 radiance 贴图计算 irradiance 实际上是与 clamped 余弦函数卷积。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;卷积在 SH 空间中可通过系数相乘快速完成：
&lt;/p&gt;
$$
  k_{E j} = k_{\cos^+ j}&#39; \, k_{L j}
  $$&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;$k_{L j}$ 是 radiance 的 SH 系数，$k_{\cos^+ j}&amp;rsquo;$ 是 clamped 余弦函数系数的缩放&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;紧凑&lt;/strong&gt;：比立方体贴图或抛物线贴图节省存储。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;高效&lt;/strong&gt;：渲染时可通过多项式计算重建 irradiance，而无需纹理采样。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;动态光源支持&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;新光源的 SH 系数可以累加到已有 SH 系数中，无需重算整个贴图。&lt;/li&gt;
&lt;li&gt;点光源、圆盘光源、球光源等均有解析 SH 表达式，可快速叠加。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;其他方法&#34;&gt;其他方法
&lt;/h2&gt;&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;方法&lt;/th&gt;
          &lt;th&gt;特点&lt;/th&gt;
          &lt;th&gt;优缺点&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;半球光照（hemisphere lighting）&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;使用天空颜色 $L_{sky}$ 和地面颜色 $L_{ground}$ 两种均匀radiance表示上半球和下半球&lt;/td&gt;
          &lt;td&gt;简单、存储少、计算快；精度低&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;环境立方体（ambient cube）&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;将半球光照扩展为6个方向的立方体&lt;/td&gt;
          &lt;td&gt;较SH更直观，可用于快速计算；存储略大&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;球面高斯函数&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;对irradiance使用旋转对称的高斯函数表示&lt;/td&gt;
          &lt;td&gt;平滑，适合低频光照&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;H-basis&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;只能表示一个半球方向&lt;/td&gt;
          &lt;td&gt;有局限，法线向下时不可用&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;SH（球谐函数）&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;低频光照的紧凑表示，可做卷积、动态光源累加&lt;/td&gt;
          &lt;td&gt;高频光照不足，振铃现象存在&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
</description>
        </item>
        <item>
        <title>Physically Based Shading(2) 基于物理的着色</title>
        <link>https://sdpyy1.github.io/p/physically-based-shading2-%E5%9F%BA%E4%BA%8E%E7%89%A9%E7%90%86%E7%9A%84%E7%9D%80%E8%89%B2/</link>
        <pubDate>Mon, 20 Oct 2025 13:29:19 +0800</pubDate>
        
        <guid>https://sdpyy1.github.io/p/physically-based-shading2-%E5%9F%BA%E4%BA%8E%E7%89%A9%E7%90%86%E7%9A%84%E7%9D%80%E8%89%B2/</guid>
        <description>&lt;img src="https://sdpyy1.github.io/20230611105147.png" alt="Featured image of post Physically Based Shading(2) 基于物理的着色" /&gt;&lt;h1 id=&#34;概括&#34;&gt;概括
&lt;/h1&gt;&lt;ul&gt;
&lt;li&gt;理解了渲染方程设计理由&lt;/li&gt;
&lt;li&gt;分清楚了表面反射（镜面反射）和局部次表面反射（漫反射）&lt;/li&gt;
&lt;li&gt;知道了常用的BRDF，以及漫反射BRDF项还有很多更好的模型&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&#34;光的物理学&#34;&gt;光的物理学
&lt;/h1&gt;&lt;h2 id=&#34;光的本质&#34;&gt;光的本质
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;在&lt;strong&gt;物理光学&lt;/strong&gt;中，光被视为一种&lt;strong&gt;电磁横波&lt;/strong&gt;，即由&lt;strong&gt;电场&lt;/strong&gt;和&lt;strong&gt;磁场&lt;/strong&gt;的振荡组成；&lt;/li&gt;
&lt;li&gt;电场与磁场：
&lt;ul&gt;
&lt;li&gt;相互垂直；&lt;/li&gt;
&lt;li&gt;都垂直于光的传播方向；&lt;/li&gt;
&lt;li&gt;振幅比值恒定；&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;这种波的传播速度称为&lt;strong&gt;相位速度（phase velocity）&lt;/strong&gt;，在真空中就是&lt;strong&gt;光速 c ≈ 3×10⁵ km/s&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;ul&gt;
&lt;li&gt;光的波长决定颜色：
可见光波长范围约为 &lt;strong&gt;400–700 nm&lt;/strong&gt;；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;单色光（monochromatic light）&lt;/strong&gt;：只有一个波长（如理想化的正弦波）；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;多色光（polychromatic light）&lt;/strong&gt;：包含多个波长，是现实中的常见情况；&lt;/li&gt;
&lt;li&gt;例如蜘蛛丝约为 1 µm，约等于 2–3 个波长大小。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;光的能量与电场强度&#34;&gt;光的能量与电场强度
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;光波携带能量；&lt;/li&gt;
&lt;li&gt;能量流强度（irradiance, $E$）与&lt;strong&gt;电场振幅的平方成正比&lt;/strong&gt;；&lt;/li&gt;
&lt;li&gt;渲染中关注的是&lt;strong&gt;时间平均能量流&lt;/strong&gt;，即平均 irradiance；&lt;/li&gt;
&lt;li&gt;因为电场比磁场对物质的影响更大，渲染只关注电场部分。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;波的叠加与干涉&#34;&gt;波的叠加与干涉
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;光波可以&lt;strong&gt;线性叠加&lt;/strong&gt;；&lt;/li&gt;
&lt;li&gt;不同相位的叠加导致不同结果：
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;相长干涉&lt;/strong&gt;（constructive interference）：
&lt;ul&gt;
&lt;li&gt;相位一致 → 叠加强；&lt;/li&gt;
&lt;li&gt;irradiance 增为 $n^2$ 倍；&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;相消干涉&lt;/strong&gt;（destructive interference）：
&lt;ul&gt;
&lt;li&gt;相位相反 → 互相抵消；&lt;/li&gt;
&lt;li&gt;irradiance 变为 0；&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;不相干叠加&lt;/strong&gt;（incoherent addition）：
&lt;ul&gt;
&lt;li&gt;相位随机；&lt;/li&gt;
&lt;li&gt;irradiance 线性叠加为 $nE_1$，即“1+1=2”。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;这些现象并不违反能量守恒，因为：
&lt;ul&gt;
&lt;li&gt;在空间不同位置上会交替出现相长与相消；&lt;/li&gt;
&lt;li&gt;总能量守恒。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;n个具有相同频率、相同偏振和相同振幅的单色光，它们以三种不同的方式进行叠加。从左到右分别是：相长干涉，相消干涉和不相干叠加。每种情况的下面都展示了对应组合波的振幅和irradiance&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://sdpyy1.github.io/20230611103901.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;img&#34;
	
	
&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;光与物质的相互作用&#34;&gt;光与物质的相互作用
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;当物体中的&lt;strong&gt;电荷振荡&lt;/strong&gt;时会发出电磁波（即发光）；
&lt;ul&gt;
&lt;li&gt;能量形式如热能、电能被转化为光能；&lt;/li&gt;
&lt;li&gt;渲染中将其视为&lt;strong&gt;光源&lt;/strong&gt;；&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;当光照射到物质上：
&lt;ul&gt;
&lt;li&gt;电场驱动物质内电荷振荡；&lt;/li&gt;
&lt;li&gt;振荡电荷再次发出光 → &lt;strong&gt;散射（scattering）&lt;/strong&gt;；&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;散射出的光与原光&lt;strong&gt;频率相同&lt;/strong&gt;（除荧光、磷光等少数情况）；&lt;/li&gt;
&lt;li&gt;一个分子会向各方向散射，但多数光保持接近原传播方向；&lt;/li&gt;
&lt;li&gt;散射效率依赖于&lt;strong&gt;波长&lt;/strong&gt;；&lt;/li&gt;
&lt;li&gt;实际中光与&lt;strong&gt;分子群体&lt;/strong&gt;相互作用，可能产生&lt;strong&gt;相干干涉效应&lt;/strong&gt;；&lt;/li&gt;
&lt;li&gt;这些多分子散射的情况是之后章节的重点。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;粒子&#34;&gt;粒子
&lt;/h2&gt;&lt;p&gt;这里讲的是瑞丽散射和米氏散射，不同的散射情况与粒子大小与光的波长的比较有关，我在OpenGL渲染器的大气渲染原理部分已经记录过了&lt;/p&gt;
&lt;h2 id=&#34;介质&#34;&gt;介质
&lt;/h2&gt;&lt;p&gt;光在均匀介质（homogeneous medium）中进行传播是另一种重要的情况，均匀介质是指一个充满均匀分布的相同分子的空间。这里所说的均匀分布，并不是指分子间距要像晶体一样完全规则，如果液体和非晶体是纯净物（所有的分子都是相同的），并且没有间隙或者气泡的话，也可以认为它们在光学上是均匀的。&lt;/p&gt;
&lt;p&gt;在均匀介质中，光的传播核心特点是&lt;strong&gt;散射波的相消干涉&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;分子散射产生的次级波会整齐排列，除原始传播方向外，所有其他方向的散射波会因相位相反相互抵消（相消干涉）；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;原始波与所有单分子散射波叠加后，最终波形与原始波基本一致，仅&lt;strong&gt;相位速度&lt;/strong&gt;和（部分情况下的）&lt;strong&gt;振幅&lt;/strong&gt;发生改变；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;相消干涉完全抑制了散射现象，因此均匀介质不会表现出明显的散射效果。&lt;/p&gt;
&lt;p&gt;四个装有不同吸收性质液体的小容器。从左到右分别是：纯净水，石榴汁，茶，咖啡&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&#34;https://sdpyy1.github.io/20230611103936.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;img&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;非均匀介质可简化为 “&lt;strong&gt;嵌有散射粒子的均匀介质&lt;/strong&gt;”，其光学行为的核心是 “相消干涉的破坏”：&lt;/p&gt;
&lt;p&gt;从左到右分别是：水，加了几滴牛奶的水，加了大约10%牛奶的水，全脂牛奶，乳白色玻璃。大多数牛奶的散射粒子都要比可见光的波长大，因此它的散射主要是无色的，在中间的图像上有明显的淡蓝色。在最右侧图像中，乳白色玻璃中的散射粒子要比可见光的波长小，因此蓝光的散射强度要比红光强；同时由于明暗背景的分割，透射光在左边更加明显，而散射光则在右边更加明显。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://sdpyy1.github.io/20230611103950.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;img&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;介质对光的影响本质是&lt;strong&gt;散射与吸收的组合效应&lt;/strong&gt;：均匀介质通过相消干涉抑制散射，其光学性质由复折射率（&lt;em&gt;n&lt;/em&gt;+&lt;em&gt;iκ&lt;/em&gt;）描述；非均匀介质因结构无序破坏相消干涉，散射成为主要特征，且散射 / 吸收的效果均与尺度、粒子尺寸、波长密切相关。这一规律是理解自然现象（如天空蓝、水的蓝色、牛奶的白色）和渲染技术中介质模拟的基础。&lt;/p&gt;
&lt;p&gt;散射和吸收现象都与尺度有关。在小场景中不产生任何明显散射的介质，在较大的尺度上也可能会有相当明显的散射现象。例如：当在房间内观察一杯水时，光在空气中的散射与在水中的吸收是几乎不可见的；然而在一个较大尺度的环境中，这两种效果可能都会十分显著，如图9.7所示。&lt;/p&gt;
&lt;p&gt;左图中：在超过几米的范围内，水会对光产生强烈的吸收作用，尤其是红光，因此整体看起来会很蓝。右图中：光在没有严重空气污染或者雾的情况下，也会在数英里尺度的空气中发生散射。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://sdpyy1.github.io/20230611104004.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;img&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;具有不同吸收作用和散射作用组合的液体容器。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://sdpyy1.github.io/20230611104018.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;img&#34;
	
	
&gt;&lt;/p&gt;
&lt;h2 id=&#34;表面&#34;&gt;表面
&lt;/h2&gt;&lt;p&gt;从光学角度来看，物体的表面（surface）是一个二维界面，它分隔了具有不同折射率的空间体积。在一般的渲染情况下，由空气组成的外部空间，其折射率约为1.003，为简单起见，通常假设空气的折射率为1；而内部空间的折射率则取决于构成物体的物质。&lt;/p&gt;
&lt;p&gt;一个光波撞击一个平面，平面两侧物质的折射率分别为n_1 和n_2。左侧图展示了入射波的侧视图，这个入射波从左上角进入，红色的强度代表了波的相位。表面下方的波间距与(n_1/n_2)成正比，本例中为0.5。相位沿着表面排列，因此间距的变化会弯曲（折射）透射波的方向。图中三角形的构造展示了Snell定律的推导过程。为了清晰起见，右上方的图显示了反射波的情况，它与入射波具有相同的波间距，因此其方向与表面法线具有相同的夹角。右下方展示了入射波、透射波和反射波方向的矢量图。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://sdpyy1.github.io/20230611104043.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;img&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;最终结果如图9.9所示。反射波和入射波的方向，与表面法线之间具有相同的夹角$\theta_i$；透射波的方向会以$\theta_t$的角度进行弯曲（折射），它与$\theta_{i}$的关系如下：&lt;/p&gt;
$$
\sin \left(\theta_{t}\right)=\frac{n_{1}}{n_{2}} \sin \left(\theta_{i}\right).
\tag{9.1}
$$&lt;p&gt;
上边主要描述了在光在表面发生的反射与折射，下面描述的是微表面模型&lt;/p&gt;
&lt;p&gt;左侧展示了两个表面的照片，右侧使用示意图的形式，展示了它们所对应的微观几何结构。上方的表面拥有略微粗糙的微观几何形状，入射光线击中了表面上不同的点，每个点的法线方向略有差异，并在一个狭窄的锥形方向上被反射，其宏观效果是具有轻微模糊的反射。下方表面具有更加粗糙的微观几何形状，入射光线照射到的表面点，具有明显不同的法线方向，反射光线会以一个较宽的锥体进行扩散，从而导致宏观的反射效果变得更加模糊。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://sdpyy1.github.io/20230611104132.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;img&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;在渲染中，我们并不会对微观几何形状进行明确的建模，而是会以一种统计的方式对其进行处理，将该表面视为一个具有微观结构法线的随机分布。因此，我们将表面建模为，会在一个连续方向上（译者注：一定的立体角范围内），对光线进行反射和折射。其中这个连续方向的宽度（锥形范围的大小，或者是立体角的大小），以及反射细节和折射细节的模糊程度，取决于微观几何法线的统计方差，即表面微尺度的粗糙度（roughness），如图9.13所示。&lt;img src=&#34;https://sdpyy1.github.io/20230611104146.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;img&#34;
	
	
&gt;&lt;/p&gt;
&lt;h2 id=&#34;次表面散射&#34;&gt;次表面散射
&lt;/h2&gt;&lt;p&gt;进入物体内部的折射光线，会继续与内部物质发生相互作用。前面我们提到，金属具有较高的吸收率和较高的反射率，即金属表面会反射大部分的入射光线，进入金属内部的折射光线也会被迅速吸收；相比之下，非金属物体则会表现出广泛的散射行为和吸收行为&lt;img src=&#34;https://sdpyy1.github.io/20230611104159-20251020141135227.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;img&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;这种次表面散射（subsurface scatter）的光线，会以相对于入射点的不同距离从表面射出，这个进出距离（entry-exit distances）的分布取决于材料中散射粒子的密度和性质，这些距离与着色尺度（像素的大小，以及着色样本之间的距离）之间的关系是很重要的。如果这个进出距离比着色尺度要小，那么可以假定它们为零，这样我们就可以将次表面散射与表面反射整合到同一个局部着色模型中，即某个着色点上的出射光线，只依赖于该点的入射光线。由于次表面散射与表面反射具有明显不同的外观表现，因此可以很容易地将它们划分为单独的着色选项，使用镜面项（specular term）控制表面反射现象，使用漫反射项（diffuse term）控制局部次表面散射（local subsurface scattering）现象。&lt;/p&gt;
&lt;p&gt;就是说镜面项是表面反射结果，漫反射项是次表面反射的结果（前提是光进入表面的距离很小）。光线进出的距离很长（＞着色尺度）—— 比如牛奶、蜡烛、玉石、厚玻璃这些材料，光在内部跑了毫米级甚至厘米级距离才出来（比如用手电筒照牛奶杯，对面会透出光，还会有颜色渐变）；这种 “远距离的次表面散射”，就不能再用简单的漫反射项模拟了，需要专门的次表面散射模型（比如 SSS 材质、BSSRDF 模型），因为它的出射光不仅和入射点有关，还和周围区域的入射光有关（比如玉石的 “通透感”“温润感”，就是这种长距离 SSS 的效果）。&lt;/p&gt;
&lt;p&gt;值得注意的是，局部次表面散射技术和全局次表面散射技术模拟的是完全相同的物理现象。每种情况下的最佳选择（即到底使用哪种模型和技术），不仅取决于材质的属性，还取决于观察的尺度。例如：当渲染一个孩子在玩塑料玩具的场景时，我们很可能需要使用全局次表面散射技术来准确地渲染孩子的皮肤，而对于塑料玩具而言，可能一个局部的漫反射着色模型就足够了。这是因为皮肤中的散射距离，要比在塑料中的散射距离大得多，但是如果相机足够远的话，皮肤的散射距离也可能会小于一个像素，此时局部的着色模型对于儿童和玩具而言都是十分准确的。相反，在一个极端的特写镜头中，塑料也可能会表现出明显的非局部次表面散射现象，这时候就需要全局次表面散射技术来对玩具进行准确地渲染。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;在观察尺度大于次表面散射尺度时，用漫反射来控制局部sss即可，但是观察尺度很小时，局部sss就不够了，需要全局sss（也就是漫反射不能只考虑当前像素，光进入物体距离大于一个像素）&lt;/strong&gt;&lt;/p&gt;
&lt;h1 id=&#34;相机&#34;&gt;相机
&lt;/h1&gt;&lt;p&gt;在渲染的时候，我们会&lt;strong&gt;计算从表面着色点到相机位置的radiance&lt;/strong&gt;。这模拟了一个简化了的成像系统，例如胶片相机、数码相机或者人眼。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;成像设备中都有一个&lt;strong&gt;传感器表面&lt;/strong&gt;，由许多小单元组成（像素级别）：
&lt;ul&gt;
&lt;li&gt;人眼 → 视杆细胞、视锥细胞；&lt;/li&gt;
&lt;li&gt;数码相机 → 光电二极管（photodiode）；&lt;/li&gt;
&lt;li&gt;胶片 → 感光颗粒；&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;这些传感器测量的是打到它们表面的&lt;strong&gt;irradiance（照度）&lt;/strong&gt;；
&lt;ul&gt;
&lt;li&gt;即单位面积上接收到的能量流强度。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;问题irradiance-本身不能直接形成图像&#34;&gt;问题：irradiance 本身不能直接形成图像
&lt;/h2&gt;&lt;p&gt;单个传感器只能测到“有多少光打在它上面”，
但&lt;strong&gt;它不区分光来自哪个方向&lt;/strong&gt;。
如果不加控制（例如完全裸露的感光平面），
所有方向的光都会混在一起，导致图像失焦或模糊。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;光圈与透镜的作用&#34;&gt;光圈与透镜的作用
&lt;/h2&gt;&lt;p&gt;为了让传感器只响应&lt;strong&gt;特定方向的光&lt;/strong&gt;，
成像系统会加上以下结构：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;不透光外壳&lt;/strong&gt;：阻挡多余方向的光；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;小孔（aperture, 光圈）&lt;/strong&gt;：只允许部分方向的光进入；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;透镜（lens）&lt;/strong&gt;：将来自场景某点的光聚焦到传感器的对应像素。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这样，每个传感器只接收来自：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;一小块场景区域&lt;/strong&gt;；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;一小组入射方向&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;换句话说，每个传感器对光具有了&lt;strong&gt;方向性响应（directionally specific）&lt;/strong&gt;。&lt;/p&gt;
&lt;h3 id=&#34;irradiance--radiance-的关系&#34;&gt;irradiance → radiance 的关系
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;传感器测量的irradiance，其实是：
&lt;/p&gt;
$$
  E = \int L(x, \omega_i) \cos\theta_i\, d\omega_i
  $$&lt;p&gt;
——即所有入射方向上radiance的加权平均；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;但由于相机光圈和镜头只允许一小范围的方向入射，
实际上每个像素感受到的就是该方向上的平均radiance。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&#34;the-brdf&#34;&gt;The BRDF
&lt;/h1&gt;&lt;p&gt;最终，基于物理的渲染可以归结为沿着一组观察射线，计算进入相机的radiance。对于一个给定的观察射线，我们需要计算的是$L_{i}(\mathbf{c},-\mathbf{v})$，其中$\mathbf{c}$是相机的位置，$-\mathbf{v}$是沿着观察射线的方向。&lt;/p&gt;
&lt;p&gt;不考虑介质的影响，认为进入相机的radiance，与其观察方向上离开最近物体表面的radiance是相等的&lt;img src=&#34;https://sdpyy1.github.io/%e6%88%aa%e5%b1%8f2025-10-21-12.15.28.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;截屏2025-10-21 12.15.28&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;所以着色计算就转到了计算物体表面p向方向v的radiance。&lt;/p&gt;
&lt;p&gt;不考虑透明物体和全局次表面散射的情况；我们所关注的是局部反射现象，&lt;strong&gt;它将照射到当前着色点的光线，重新发射回外部&lt;/strong&gt;，这些现象包括&lt;strong&gt;表面反射&lt;/strong&gt;以及&lt;strong&gt;局部次表面散射&lt;/strong&gt;，它们只依赖于入射光方向$\mathbf{l}$和指向外部的观察方向$\mathbf{v}$。&lt;/p&gt;
&lt;p&gt;双向反射分布函数（bidirectional reflectance distribution function，BRDF）描述了着色点表面的局部反射系数，记为$f(\mathbf{l}, \mathbf{v})$。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;光线的入射方向和出射方向各有两个自由度。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;一种常用的参数化表示包括两个角度：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;仰角&lt;/strong&gt; $$\theta$$：相对于表面法线 \(\mathbf{n}\)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;方位角&lt;/strong&gt; $$\phi$$：相对于表面法线 \(\mathbf{n}\) 的水平旋转&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在一般情况下，BRDF 是一个包含 &lt;strong&gt;四个标量变量&lt;/strong&gt; 的函数：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;两个描述入射方向 ($$\theta_i, \phi_i$$)&lt;/li&gt;
&lt;li&gt;两个描述出射方向 ($$\theta_o, \phi_o$$)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;各向同性 (Isotropic) BRDF&lt;/strong&gt; 是一个重要特例：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;当光线入射方向和出射方向围绕表面法线 $$\mathbf{n}$$ 旋转时，BRDF 保持不变，只依赖于入射和出射方向之间的相对角度。&lt;/li&gt;
&lt;li&gt;对各向同性 BRDF，只需要 &lt;strong&gt;三个标量变量&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;入射方向仰角 $$\theta_i$$&lt;/li&gt;
&lt;li&gt;出射方向仰角 $$\theta_o$$&lt;/li&gt;
&lt;li&gt;入射与出射方向的相对方位角 $$\phi = \phi_o - \phi_i$$&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;换句话说，如果将一个具有均匀各向同性材质的物体放在转盘上旋转，在给定光线和相机条件下，物体表面在所有旋转角度上看起来都是相同的。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&#34;https://sdpyy1.github.io/20230611105126.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;img&#34;
	
	
&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;由于忽略了荧光（fluorescence）和磷光（phosphorescence）等现象，我们可以假设，给定波长的入射光会以相同波长被反射出来。&lt;/li&gt;
&lt;li&gt;反射光的光量会根据波长变化，可以用两种方式模拟：
&lt;ol&gt;
&lt;li&gt;将波长视为 BRDF 的额外输入变量；&lt;/li&gt;
&lt;li&gt;将 BRDF 视为返回光谱分布的值。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;在实时渲染中，通常使用第二种方法，实时渲染器一般将光谱分布表示为一个RGB三元组，这意味着BRDF会返回一个RGB值&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;为了计算着色点的出射光线 $$L_{o}(\mathbf{p}, \mathbf{v})$$，我们将 BRDF 项合并到反射方程（reflectance equation）中：&lt;/li&gt;
&lt;/ul&gt;
$$
L_{o}(\mathbf{p}, \mathbf{v}) = \int_{\mathbf{l} \in \Omega} f(\mathbf{l}, \mathbf{v})\, L_{i}(\mathbf{p}, \mathbf{l})\, (\mathbf{n} \cdot \mathbf{l})\, d \mathbf{l}
\tag{9.3}
$$&lt;ul&gt;
&lt;li&gt;公式说明：
&lt;ul&gt;
&lt;li&gt;积分下标 $$\mathbf{l} \in \Omega$$ 表示对以着色点 $$\mathbf{p}$$ 为球心、表面法线 $$\mathbf{n}$$ 为方向的单位半球上所有入射光方向 $$\mathbf{l}$$ 积分；&lt;/li&gt;
&lt;li&gt;入射光方向 $$\mathbf{l}$$ 在半球范围内连续扫描，并非单一光线；&lt;/li&gt;
&lt;li&gt;$$d\mathbf{l}$$ 表示入射方向 $$\mathbf{l}$$ 周围的单位立体角微分；&lt;/li&gt;
&lt;li&gt;出射 radiance 等于入射 radiance 乘以 BRDF 再乘以 $$\mathbf{n} \cdot \mathbf{l}$$ 点积的积分。&lt;/li&gt;
&lt;li&gt;$Li(\mathbf{p}, \mathbf{l})$是 &lt;strong&gt;入射 radiance&lt;/strong&gt;，表示从方向 $\mathbf{l}$ 到达点 $\mathbf{p}$ 的光强度&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;在第一行中，左侧展示了一个Lambertian BRDF（一个简单半球）；中间展示了在Lambertian项中添加了Blinn-Phong高光的结果；右侧展示了Cook-Torrance BRDF [285, 1779]，值得注意的是，镜面高光并不是最强的反射方向。在第二行中，左侧是Ward各向异性模型的特写，在这种情况下，反射方向是一个倾斜的镜面波瓣；中间展示了Hapke/Lommel-Seeliger“月面（lunar surface）”BRDF [664]，它具有强烈的后反射；右侧展示了 Lommel-Seeliger散射，尘埃表面会将光线散射到掠射角上（grazing angle）。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://sdpyy1.github.io/20230611105147.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;img&#34;
	
	
&gt;&lt;/p&gt;
&lt;h1 id=&#34;表面反射的brdf模型&#34;&gt;表面反射的BRDF模型
&lt;/h1&gt;&lt;p&gt;这部分LearnOpenGL的PBR模型部分已经记录，就是NDF项如何建模使用&lt;/p&gt;
&lt;h1 id=&#34;次表面散射的brdf模型&#34;&gt;次表面散射的BRDF模型
&lt;/h1&gt;&lt;p&gt;这里知道了BRDF的漫反射部分（也就是这本书中介绍的局部次表面散射部分）除了最简单的Lambertian漫反射模型，还有很多更复杂的模型，但是实时渲染用Lambertian足够了&lt;/p&gt;
&lt;p&gt;对于 Lambertian 漫反射，BRDF 定义为：
&lt;/p&gt;
$$
f_r(\mathbf{l}, \mathbf{v}) = \frac{\rho}{\pi}
$$&lt;p&gt;
其中：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;$\mathbf{l}$ = 入射光方向&lt;/li&gt;
&lt;li&gt;$\mathbf{v}$ = 出射方向（视线方向）&lt;/li&gt;
&lt;li&gt;$\rho$ = 漫反射反射率（albedo），范围 [0,1]&lt;/li&gt;
&lt;li&gt;$\pi$ = 正则化因子，保证能量守恒&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&#34;布料的brdf模型&#34;&gt;布料的BRDF模型
&lt;/h1&gt;&lt;h2 id=&#34;布料材质特点&#34;&gt;布料材质特点
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;微观几何结构复杂：纤维、丝线、编织结构等&lt;/li&gt;
&lt;li&gt;表面光学特性特殊：
&lt;ul&gt;
&lt;li&gt;各向异性镜面高光&lt;/li&gt;
&lt;li&gt;粗糙散射（次表面散射导致边缘亮）&lt;/li&gt;
&lt;li&gt;观察角依赖的颜色变化（多色纤维引起）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;高频空间变化显著（纹理、老化、瑕疵、皱褶等）&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;结论&lt;/strong&gt;：默认通用BRDF（Lambert + GGX）无法准确模拟这些特性。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;布料brdf的三大类&#34;&gt;布料BRDF的三大类
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;经验模型（Empirical）&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;根据观察设计，非物理正确&lt;/li&gt;
&lt;li&gt;示例：
&lt;ul&gt;
&lt;li&gt;《神秘海域2》漫反射BRDF + rim/inner/lambert项&lt;/li&gt;
&lt;li&gt;《神秘海域4》使用 wrap lighting 近似次表面散射&lt;/li&gt;
&lt;li&gt;迪士尼的 sheen 项模拟粗糙散射&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;微表面模型（Microfacet / Micro-surface）&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;使用 NDF 描述纤维表面微结构&lt;/li&gt;
&lt;li&gt;示例：
&lt;ul&gt;
&lt;li&gt;Ashikhmin 逆高斯 NDF 模拟天鹅绒&lt;/li&gt;
&lt;li&gt;《教团：1886》使用改进微表面BRDF + 天鹅绒 NDF&lt;/li&gt;
&lt;li&gt;Imageworks 提供可附加光泽项的逆NDF&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;微圆柱体模型（Micro-cylinder / Fiber-based）&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;假设表面由大量一维纤维/线段组成&lt;/li&gt;
&lt;li&gt;示例：
&lt;ul&gt;
&lt;li&gt;Kajiya-Kay / Banks 模型&lt;/li&gt;
&lt;li&gt;《神秘海域4》用于丝绸、高光纤维&lt;/li&gt;
&lt;li&gt;Dreamworks 和 Sadeghi 的模型增加了可控参数和masking-shadowing&lt;/li&gt;
&lt;li&gt;可借鉴头发BSDF（PxrSurface、Marschner模型）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;布料材质光学特性特殊，通用BRDF适用性有限&lt;/p&gt;
&lt;p&gt;不同布料类型（天鹅绒、丝绸、棉花、羊毛等）需要不同BRDF或BSDF来模拟&lt;/p&gt;
&lt;p&gt;模型选择依据材质：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;经验模型&lt;/strong&gt; → 视觉效果优先、易控制&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;微表面模型&lt;/strong&gt; → 模拟高光、粗糙散射&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;微圆柱体模型&lt;/strong&gt; → 精确描述纤维方向性、masking-shadowing&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&#34;波动光学的brdf模型&#34;&gt;波动光学的BRDF模型
&lt;/h1&gt;&lt;p&gt;这。。了解即可&lt;/p&gt;
&lt;h2 id=&#34;几何光学的假设与局限&#34;&gt;几何光学的假设与局限
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;几何光学把光当作射线，适用于表面特征要么&lt;strong&gt;非常小&lt;/strong&gt;（&amp;lt; 波长），要么&lt;strong&gt;非常大&lt;/strong&gt;（&amp;gt; 100 倍波长）的情况。&lt;/li&gt;
&lt;li&gt;现实世界表面在&lt;strong&gt;1~100倍波长的尺度&lt;/strong&gt;上具有不规则性，这部分被称为&lt;strong&gt;纳米几何（nanogeometry）&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;纳米几何对反射率的影响无法用几何光学模拟，需要使用&lt;strong&gt;波动光学&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;衍射diffraction&#34;&gt;衍射（Diffraction）
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;纳米几何会导致光发生&lt;strong&gt;衍射&lt;/strong&gt;，Huygens-Fresnel原理解释了光如何在表面点作为新球面波源传播并相干干涉。&lt;/li&gt;
&lt;li&gt;表面高度的不规则性决定了&lt;strong&gt;镜面反射与衍射光的分布&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;较大尺度的不规则性 → 小扩散角度&lt;/li&gt;
&lt;li&gt;较小尺度的不规则性 → 大扩散角度&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;周期性纳米结构（如CD、DVD、昆虫翅膀）可产生显著的彩虹色衍射。&lt;/li&gt;
&lt;li&gt;最近的研究表明，衍射在许多普通材质中也存在，只是传统渲染模型未考虑。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;薄膜干涉thin-film-interference&#34;&gt;薄膜干涉（Thin-film interference）
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;发生在&lt;strong&gt;厚度接近光波长的薄膜&lt;/strong&gt;上，例如油渍、肥皂泡。&lt;/li&gt;
&lt;li&gt;原理：薄膜顶部反射光与底部反射光的光路差导致相长/相消干涉。&lt;/li&gt;
&lt;li&gt;产生的效果：
&lt;ul&gt;
&lt;li&gt;高光随观察角度变化，出现彩虹色或微妙色偏。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;相干长度决定了干涉是否可见：
&lt;ul&gt;
&lt;li&gt;可见光的相干长度约 1 微米，因此厚度超过 1 微米的薄膜通常不会产生可见干涉。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;实时渲染中：
&lt;ul&gt;
&lt;li&gt;可以用查表或近似方法高效实现一阶、二阶光路干涉。&lt;/li&gt;
&lt;li&gt;已经被许多现代渲染器（RenderMan、Imageworks）采用，增强材质真实感。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;总结&#34;&gt;总结
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;几何光学&lt;/strong&gt;适用于宏观微表面，但无法处理纳米尺度的光学效应。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;波动光学&lt;/strong&gt;补充了几何光学的不足：
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;衍射&lt;/strong&gt;：纳米几何导致光在各方向散射和干涉。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;薄膜干涉&lt;/strong&gt;：薄层材质产生随角度变化的彩虹高光或微妙色偏。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;在渲染中，这些效应虽然属于“细节”，但对真实感有显著提升，现代材质模型和渲染器已开始支持这些效果。&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&#34;分层材质&#34;&gt;分层材质
&lt;/h1&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;概念&lt;/strong&gt;：现实中的材质通常由多层组成，例如灰尘、水、冰、雪、涂层或生物材料。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;透明涂层（Clear Coat）&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;最常见且视觉重要的分层案例。&lt;/li&gt;
&lt;li&gt;透明光滑层覆盖在基底材质上，如木材上涂清漆。&lt;/li&gt;
&lt;li&gt;二次反射效果显著，尤其在金属基底上。&lt;/li&gt;
&lt;li&gt;可以有颜色（通过Beer-Lambert定律模拟光吸收）。&lt;/li&gt;
&lt;li&gt;支持逐层法线，但实时渲染中较少用。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;分层材质模型实例&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;迪士尼Principled Shader、虚幻引擎、PxrSurface材质、Dreamworks/Imageworks。&lt;/li&gt;
&lt;li&gt;Weidlich &amp;amp; Wilkie模型：多层叠加，追踪单次反射/折射，计算成本低，适合实时。&lt;/li&gt;
&lt;li&gt;Jakob等框架：支持层间多次反射，精确但不适合实时渲染。&lt;/li&gt;
&lt;li&gt;游戏《使命召唤：无限战争》：可叠加任意层，支持折射、散射、层间吸收及逐层法线，实时渲染复杂材质。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&#34;材质混合material-blending&#34;&gt;材质混合（Material Blending）
&lt;/h1&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;概念&lt;/strong&gt;：将多种材质的BRDF参数结合在一起。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;方法&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;使用蒙版纹理控制不同材质混合区域。&lt;/li&gt;
&lt;li&gt;可在运行时或预烘焙完成。&lt;/li&gt;
&lt;li&gt;可混合法线贴图，通过高度贴图或细节法线叠加实现。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;应用&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;展示动态伤害效果&lt;/li&gt;
&lt;li&gt;用户自定义装备/服装&lt;/li&gt;
&lt;li&gt;增加角色与环境视觉多样性&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;性能优化&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;对蒙版边界材质，优先混合BRDF参数而非计算两次着色。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&#34;材质过滤material-filtering&#34;&gt;材质过滤（Material Filtering）
&lt;/h1&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;概念&lt;/strong&gt;：纹理在GPU上通过mipmap和滤波进行采样，但假设参数与最终颜色线性，非线性参数可能产生瑕疵。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;主要问题&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;法线贴图和粗糙度贴图的线性mipmap可能导致高光闪烁或亮度异常。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;解决方法&lt;/strong&gt;：
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;法线分布过滤&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;理想方法：对NDF进行平均，而非对法线或粗糙度单独平均。&lt;/li&gt;
&lt;li&gt;Toksvig方法：通过平均法线长度修正粗糙度（公式9.76），适合Blinn-Phong/Beckmann NDF。&lt;/li&gt;
&lt;li&gt;LEAN/CLEAN/LEADR映射：基于法线协方差矩阵，处理各向同性或各向异性。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;方差映射&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;预计算法线方差存储到纹理中，用于修正粗糙度，兼顾GPU滤波。&lt;/li&gt;
&lt;li&gt;可用于多法线叠加（如细节法线）。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;高频表面和闪闪发光材质&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;闪烁现象由每像素覆盖少量凸起引起。&lt;/li&gt;
&lt;li&gt;实时渲染方法：
&lt;ul&gt;
&lt;li&gt;Wang &amp;amp; Bowles：产生视觉闪光效果（雪花等）。&lt;/li&gt;
&lt;li&gt;Zirr &amp;amp; Kaplanyan：模拟多尺度法线分布，空间和时间上稳定。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>Physically Based Shading (1) 光与颜色</title>
        <link>https://sdpyy1.github.io/p/physically-based-shading-1-%E5%85%89%E4%B8%8E%E9%A2%9C%E8%89%B2/</link>
        <pubDate>Mon, 20 Oct 2025 11:41:15 +0800</pubDate>
        
        <guid>https://sdpyy1.github.io/p/physically-based-shading-1-%E5%85%89%E4%B8%8E%E9%A2%9C%E8%89%B2/</guid>
        <description>&lt;img src="https://sdpyy1.github.io/202306132029525.png" alt="Featured image of post Physically Based Shading (1) 光与颜色" /&gt;&lt;h1 id=&#34;light-and-color-光与颜色&#34;&gt;Light and Color 光与颜色
&lt;/h1&gt;&lt;blockquote&gt;
&lt;p&gt;这一章节除了辐射度量学，toneMapping、颜色分级我感觉会用到，其他更多是科普内容，比如为什么用RGB就能代替可见光&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;光量&#34;&gt;光量
&lt;/h2&gt;&lt;p&gt;任何基于物理的渲染方法，其第一步都是以一种精确的方式，来对光进行量化（quantify）。&lt;/p&gt;
&lt;h3 id=&#34;辐射度量学&#34;&gt;辐射度量学
&lt;/h3&gt;&lt;p&gt;在不同的课程中接触了这个东西几次，每次都有不一样的理解😝，下图展示了光的波长范围与人可见光的范围&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://sdpyy1.github.io/202306131529641.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;img&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;各个辐射量（radiometric quantity）的存在是为了对电磁辐射的各个方面进行测量和度量，例如：总能量、功率（随时间变化的能量）以及相对于面积、方向或者二者的功率密度等&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://sdpyy1.github.io/202306131534243.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;img&#34;
	
	
&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;在辐射度量学中，最基本的单位是辐射通量（radiant flux）Φ，辐射通量是指辐射能量随时间的流动变化，又叫做功率（power），其单位为瓦特(watts，W)。==理解为做功的功率即可==&lt;/li&gt;
&lt;li&gt;辐照度（irradiance）是辐射通量相对于面积的密度，即$ d \Phi / d A$。irradiance是相对于一个面积来进行定义的，这个面积可能是空间中的一个假想区域，但是在渲染中一般都是物体的表面。irradiance的单位是瓦特每平方米（$W/m^2$）。==理解为功率在单位面积上的大小==，&lt;/li&gt;
&lt;li&gt;辐射强度（radiant intensity），即辐射通量相对于方向的密度，更准确地说，是相对于立体角的密度$（d \Phi / d \omega）$。它的单位是瓦特每立体弧度$（W/sr）$&lt;/li&gt;
&lt;li&gt;最后，辐射度（radiance）L是对单条光线中电磁辐射的度量。更精确地说，它是辐射通量相对于面积和立体角的密度$（d^{2} \Phi / d A d \omega）$。这里的面积位于垂直于光线的平面上，如果想要在其他方向上对表面施加辐射，则必须使用余弦因子进行校正。==进一步把irradiance划分到单位立体角==&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;立体角可以理解为立体空间的一个立体方向截取一个单位球体的面片面积&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://sdpyy1.github.io/202306131601539.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;img&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;radiance是传感器（例如眼睛或者相机）所直接测量的对象，因此它对渲染而言至关重要。计算着色方程的目的就是沿着给定的光线，计算从着色点到相机的radiance；沿着这条光线计算出来的结果L。radiance的公制单位是瓦特每平方米每立体弧度$（W/m^2sr）$&lt;/p&gt;
&lt;p&gt;环境中的radiance可以被认为是五个变量（或者六个变量，将波长考虑在内）的函数，它被称为辐射分布（radiance distribution）；其中有三个变量指定了位置，另外两个变量指定了方向，这个分布函数描述了在空间中任何地方传播的任何光线。根据上面的描述，我们可以这样来理解渲染过程：将眼睛和屏幕定义为一个点和一组方向（例如从眼睛出发，穿过每个像素的光线），然后使用这个函数，在这组方向上对眼睛所在的位置进行评估。&lt;/p&gt;
&lt;p&gt;在着色方程中，radiance通常会以$L_{o}(\mathbf{x}, \mathbf{d})$或者&lt;/p&gt;
$$L_{i}(\mathbf{x}, \mathbf{d})$$&lt;p&gt;的形式出现，它代表了从点x发出，或者进入点x的radiance具体是多少。方向向量$\mathbf{d}$表示了光线的方向。radiance的一个重要特性是，在忽略了雾等大气效应影响的前提下，radiance不会受到传播距离的影响。换句话说，无论一个表面与相机的距离有多远，它们都将具有相同的radiance。当距离相机越远时，这个表面所覆盖的像素就越少，但是来自表面上每个像素的radiance是恒定的。&lt;/p&gt;
&lt;p&gt;多数光波中都包含了许多不同波长的单色光，这通常可以被可视化为一个光谱功率分布（spectral power distribution，SPD），它是一个展示了光线能量如何在不同波长之间分布的图片。（三种不同光波的光谱功率分布（SPD）。第一行是一个绿色激光的SPD，它有一个非常狭窄的光谱分布，其波形类似于图9.1中的简单正弦波。第二行的SPD是由相同的绿色激光，外加两个额外的激光所组成的，分别是红色激光和蓝色激光。将这些激光的波长和相对强度转换到RGB激光投影显示器上，会显示出中性白色。第三行的SPD是标准的D65光源，这是一个典型的中性白色参考值，旨在代表室外的自然光照，类似第三行的SPD，其能量连续地分布在可见光谱上，是典型的自然光。）&lt;/p&gt;
&lt;p&gt;==在下图中人眼对于第二行和第三行的感知是一样的，这就是为什么只用三个数字就可以精确地表示任何颜色的原因==&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://sdpyy1.github.io/202306131700629.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;img&#34;
	
	
&gt;&lt;/p&gt;
&lt;h3 id=&#34;光度学&#34;&gt;光度学
&lt;/h3&gt;&lt;p&gt;辐射度量学仅仅对物理量进行了研究，它完全没有考虑人眼的感知。与此相关的一个领域被称为光度学（photometry），它与辐射度量学类似，不同之处在于，它会根据人眼的敏感度，对辐射度量学中的一切事物进行加权处理。通过乘以CIE光度曲线（CIE photometric curve），辐射度量学中的计算结果可以被转换为相应的光度单位。CIE光度曲线是一条以555纳米为中心的钟形曲线，它代表了人眼对各种波长光线的响应程度。&lt;img src=&#34;https://sdpyy1.github.io/202306131744639-20251020121404396.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;img&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;这个转换曲线与测量单位，是光度学理论和辐射度量学理论之间的唯一区别。每个辐射物理量都有一个对应的光度学物理量&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://sdpyy1.github.io/202306131801150.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;img&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;Luminance通常用来描述平面的亮度。例如：高动态范围（high dynamic range，HDR）电视屏幕的峰值亮度通常在500到1000尼特（nit）之间。相比之下，晴朗天空的亮度大约为8000尼特，60瓦的电灯泡约为12万尼特，地平线上的太阳约为60万尼特。==所以尼特相当于Radiance==&lt;/p&gt;
&lt;h3 id=&#34;色度学&#34;&gt;色度学
&lt;/h3&gt;&lt;p&gt;人眼对于颜色的感知与光线的SPD（光谱功率分布，上上一节提到）密切相关。同时我们还知道了，二者之间并不是简单的一一对应关系。第二行和第三行所展示的SPD完全不同，但给人的感知却是完全相同的。色度学（colorimetry）研究的就是SPD和颜色感知之间的关系。&lt;/p&gt;
&lt;p&gt;人眼可以分辨大约1000万种不同的颜色。对于颜色感知，人眼的视网膜上有着三种不同类型的视锥感受器（细胞），每种感受器对于不同波长的光线都有不同的反应。其他动物的眼睛则有着不同数量的颜色感受器，有些动物的眼睛甚至多达15个。因此，对于一个给定的SPD，我们的大脑只会从这些感受器中接收到三种不同的信号，这就是为什么只用三个数字就可以精确地表示任何颜色的原因&lt;/p&gt;
&lt;p&gt;书中描述了一组实验来说明人类如何用科学方法量化 “颜色感知”。从人眼的生理特性出发，通过实验建立标准，最终用简单的数值（比如 XYZ、xy）精准描述任何颜色，解决了 “不同光线（SPD）可能看起来一样” 的问题。 用 XYZ 表达任何颜色的核心原理，&lt;strong&gt;不管光线的光谱多复杂，只要编码（XYZ）相同，人眼感知到的颜色就完全一致。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;CIE 1931 色度图（图 8.8）是一张「人类可见颜色的 “地图”」—— 把所有我们肉眼能分辨的颜色，都精准定位在一张二维图上，核心作用是直观展示 “颜色的位置、范围和关系”，方便标准化对比和应用（比如屏幕、打印机的颜色匹配）。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://sdpyy1.github.io/202306132029525.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;img&#34;
	
	
&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;图上的黑色轮廓线，就是 “人类可见颜色的全部范围“。&lt;/li&gt;
&lt;li&gt;白色三角形：代表某类设备的「色域范围」。三角形的三个顶点，对应设备能发出的 “三种基础色”（比如屏幕的红、绿、蓝像素，打印机的青、品红、黄墨水）；&lt;/li&gt;
&lt;li&gt;三角形内部的所有颜色，都是这台设备能精准还原的颜色；&lt;/li&gt;
&lt;li&gt;三角形外部、但在黑色轮廓内的颜色，这台设备 “显示 / 打印不出来”（会被近似替代）；&lt;/li&gt;
&lt;li&gt;黑点：代表「标准白光」&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;色度图仅仅描述了一个平面，它仅包含了颜色的色调信息，想要完整地描述一个颜色，还需要第三个维度Y，即亮度luminance。这三个坐标在一起，定义了所谓的xyY坐标系。色度图对于理解颜色在渲染中的使用，以及理解渲染系统中的限制而言非常重要。电视或者计算机显示器会通过使用R、G、B颜色值来呈现颜色，每个颜色通道都会控制一个显示原色（display primary），这个原色会发出具有特定SPD的光线。三种原色都会按其各自的颜色值进行缩放，这些颜色值被叠加在一起，从而生成一个被观众所感知的单一SPD。&lt;/p&gt;
&lt;p&gt;在图形渲染中有几个值得关注的RGB色域空间，每个空间都由R、G、B三原色和一个白点进行定义。为了对它们进行比较，我们将使用一种不同类型的色度图，它被称为CIE 1976 UCS （uniform chromaticity scale）色度图。它是CIELUV颜色空间的一部分，CIE将CIELUV颜色空间（以及另一个颜色空间CIELAB）作为XYZ颜色空间的替代方案&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://sdpyy1.github.io/202306132146760.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;img&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;上边这些东西总结起来用于解释为什么RGB的vec3就可以用来渲染颜色，因为&lt;strong&gt;不管光线的波长组合多复杂（也就是 SPD 多不一样），只要它们给人眼的颜色感知相同，就都能用同一组 RGB 数值代替&lt;/strong&gt;。&lt;/p&gt;
&lt;h3 id=&#34;使用rgb颜色进行渲染&#34;&gt;使用RGB颜色进行渲染
&lt;/h3&gt;&lt;p&gt;严格来说，RGB颜色值代表的是感知量，而不是真实的物理量，使用RGB颜色值来进行基于物理的渲染，在技术上来说是一个分类错误。正确的方法应当是在光谱物理量上执行所有的渲染计算，然后通过密集采样或者是投影到适当的基底上，并在最后将其转换为用于屏幕输出的RGB颜色值。&lt;/p&gt;
&lt;p&gt;展示了一种用于激光投影仪屏幕的材料，它在激光投影仪光线波长的窄带处，具有较高的反射率，而在其他大多数波长上的反射率都较低。这使得这个屏幕表面会反射投影仪所发出的大部分光线，同时会吸收来自其他光源的大部分光线。在这种情况下，RGB渲染器将会产生严重的渲染错误。==一个极端例子展示RGB会错误渲染的场景==&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://sdpyy1.github.io/202306141013368.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;img&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;然而，对于大多数渲染系统而言，尤其是那些并不是用于预测模拟的交互式应用程序而言，RGB渲染的效果得出奇的好。即使是动画电影的离线渲染中，也只是在最近才开始使用光谱渲染，而且只是少数情况，大部分离线渲染仍然使用的是RGB渲染。&lt;/p&gt;
&lt;h2 id=&#34;从场景到屏幕&#34;&gt;从场景到屏幕
&lt;/h2&gt;&lt;p&gt;对于一个给定的虚拟场景，基于物理的渲染有着这样一个目标，即计算场景中可能存在的真实radiance。然而计算完成之后，渲染的工作还远未完成，我们仍然需要确定最终的结果，即显示器帧缓冲中的像素值。在本小节中，我们将讨论与此有关的一些因素。&lt;/p&gt;
&lt;p&gt;HDR显示器通常会使用Rec. 2020和Rec. 2100标准。其中Rec. 2020定义了一个具有更宽色域的颜色空间，如图8.12所示，并且它与Rec. 709和sRGB色彩空间具有相同的白点（D65）。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://sdpyy1.github.io/202306141121256.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;img&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;虽然峰值亮度（peak luminance）和色域规格（gamut specification）对于编码而言十分重要，但是对于实际的显示设备而言，它们多少有些不切实际（aspirational）。因此，HDR显示器会在内部执行从标准规格到实际显示功能的色调映射（tone mapping）与色域映射（gamut mapping）。这个映射过程也可能会受到应用程序所传递过来的原始数据的影响，这些原始数据可能会指明实际的动态范围和色域范围&lt;/p&gt;
&lt;h3 id=&#34;色调映射-tonemapping&#34;&gt;色调映射 toneMapping
&lt;/h3&gt;&lt;p&gt;在伽马矫正时，即将线性的radiance值，转换为用于显示设备的非线性编码值的过程。显示编码所使用的函数是显示器光电转换函数（electrical optical transfer function，EOTF）的逆函数，它确保了输入的线性值与显示器发出的线性radiance相匹配。在我们前面的讨论中，忽略了发生在渲染和显示编码之间的一个重要步骤，下面我们将对这个步骤进行介绍和讨论。&lt;/p&gt;
&lt;p&gt;这个步骤叫做色调映射（tone mapping）或者色调再现（tone reproduction），它是指将场景的radiance转换为显示器radiance的过程。在这个步骤中所应用的转换函数称为端到端转换函数（end-to-end transfer function）或者场景到屏幕转换函数（scene-to-screen transform）。图像状态（image state）的概念是理解色调映射的关键[1602]，有两种基本的图像状态：场景参考（scene-referred）图像是根据场景中的radiance进行定义的，显示参考（display-referred）图像是根据显示器的radiance进行定义的。图像状态与编码无关，在这两种状态下的图像，都可以进行线性编码或者非线性编码。图8.13展示了图像状态、色调映射和显示编码是如何在成像管线中进行组合的，这个成像管线用于将最初渲染生成的颜色值，转换为最终用于显示的颜色值。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://sdpyy1.github.io/202306141238411.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;img&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;同一个场景使用了四种不同的色调变换。这些结果的差异主要体现在图中的绿色圆圈区域，因为那里的场景像素值特别高。左上角：直接裁剪（同时使用了sRGB OETF）；右上角：Reinhard方法[1478]；左下角：Duiker方法[392]；右下角：寒霜方法（保持色相的版本）[497]。Reinhard，Duiker和寒霜的变换，都可以保留因裁剪而丢失的高光信息。然而，Reinhard曲线倾向于降低图像中较暗部分的饱和度[628, 629]，而Duiker变换则增加了较暗区域的饱和度，后者有时会被认为是更好的特性[630]。通过一些特殊设计，寒霜变换保持了饱和度和色相，避免了强烈的色相偏移，请仔细观察其他三张图片左下角的圆圈区域。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://sdpyy1.github.io/202306141749023.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;img&#34;
	
	
&gt;&lt;/p&gt;
&lt;h3 id=&#34;曝光&#34;&gt;曝光
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;动态曝光：用上述方法（对数平均 / 直方图 / 光照强度）实时计算每帧曝光，适配场景光照变化（比如从室内到室外，曝光自动降低，避免过曝）；&lt;/li&gt;
&lt;li&gt;静态曝光：多数游戏的选择 —— 美术人员根据场景固定光照（比如室内、室外、夜景）手动设置曝光值，避免动态曝光的意外波动（比如突然出现极亮像素导致画面骤暗）；&lt;/li&gt;
&lt;li&gt;核心原则：无论哪种策略，曝光都是 “线性缩放”—— 只改变亮度的整体范围，不破坏线性空间的计算规则（后续色调映射才做非线性变换）。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;曝光的本质是「场景亮度到显示亮度的 “预处理缩放”」，核心是找到一个稳定、合理的缩放因子。核心目标让场景的关键细节（中间调、灰卡对应的亮度）落在显示器的敏感区间，同时尽可能保留高光和阴影细节，符合人眼感知。&lt;/p&gt;
&lt;h3 id=&#34;颜色分级&#34;&gt;颜色分级
&lt;/h3&gt;&lt;p&gt;这个内容动手实践一下应该就好懂了&lt;/p&gt;
&lt;p&gt;在章节8.2.2中，我们提到了择优图像再现（preferred image reproduction）的概念，即生成在某种意义上看起来比原始场景更好的图像。它通常会涉及到对图像颜色的创造性处理，这个过程被称为颜色分级（color grading），或者调色、校色等，它们的含义实际上都是一样的。&lt;/p&gt;
&lt;p&gt;数字颜色分级已经在电影工业中使用了一段时间，早期的例子包括电影《逃狱三王（O Brother, Where Art Thou？）》（2000）和《天使爱美丽（Amelie）》（2001）。颜色分级通常是通过交互式的操作，来对场景图像的颜色进行调整，直到实现想要的创意“外观”，然后再将相同的操作序列，重新应用到一个镜头或者一个序列中的所有图像上。颜色分级技术从电影传播到游戏领域中，现在在游戏中被广泛应用[392, 424, 756, 856, 1222]。&lt;/p&gt;
&lt;p&gt;Selan [1601]展示了如何将来自一个颜色分级，或者图像编辑应用的任意颜色转换，“烘焙”到一个三维颜色查找表（LUT）中。通过将RGB颜色值作为xyz坐标输入，来从这个表中快速查找对应的新颜色；这种方式可以用于从颜色到颜色的任何映射，不过这个过程会受到LUT分辨率的限制。Selan的烘焙过程从一个相同LUT开始，这个LUT会将每个输入的颜色，映射到相同的输出颜色，然后再将其“切片”从而创建一个二维图像。然后将这个切片的LUT图像加载到一个颜色分级应用程序中，并对其应用定义目标创意外观所需要的操作。需要注意的是，只能对LUT应用颜色操作，需要避免模糊等空间操作。然后将编辑好的LUT保存下来，“打包”到一个三维GPU纹理中，并在渲染的过程中进行使用，从而动态地对渲染像素应用相同的颜色转换。Iwanicki [806]提出了一种聪明的方法，当在LUT中存储颜色变换的时候，可以使用最小化的最小二乘法，来减少采样误差。&lt;/p&gt;
&lt;p&gt;在后来的出版物中，Selan [806]对两种执行颜色分级的方法进行了区分。第一种方法是对显示参考的图像数据进行颜色分级操作。第二种方法通过显示变换，对结果进行预览，然后再对场景参考的数据进行颜色分级操作。虽然显示参考的颜色分级方法更加容易操作和实现，但是对场景参考的数据进行颜色分级操作，可以生成更高保真度（fidelity）的结果。&lt;/p&gt;
&lt;p&gt;当实时应用程序首次使用颜色分级技术时，显示参考方法占据了主导地位[756, 856]。然而，场景参考方法由于其更高的视觉质量，而获得了更多的关注[198, 497, 672]，如图8.16所示。对场景参考的图像数据应用颜色分级操作，还可以将色调映射曲线烘焙到颜色分级LUT中[672]，从而节省一些计算量，就像在游戏《神秘海域4》中所做的那样[198]。&lt;/p&gt;
&lt;p&gt;游戏《神秘海域4》中的场景画面。最上面的截图没有使用颜色分级，下面两个截图各自应用了一个颜色分级操作。为了便于说明，我们选择了一个极端的颜色分级操作（将原始图像乘以一个高饱和度的青色）。在左下角的截图中，将颜色分级应用在了显示参考图像上（即色调映射之后）；而在右下角的截图中，将颜色分级应用在了场景参考图像上（即色调映射之前）&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://sdpyy1.github.io/202306142012055.png&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;img&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;在进行LUT查找之前，还必须将场景参考的数据重新映射到$[0,1]$范围中[1601]。在寒霜引擎[497]中，使用了感知量化曲线OETF来实现这个目的，尽管可以使用一些更加简单的曲线。Duiker [392]使用了一个对数曲线，而Hable [635]则建议使用一次或者两次的平方根运算来实现。&lt;/p&gt;
</description>
        </item>
        
    </channel>
</rss>
