中EN
概念页

着色模型与光源

Shading Models & Light Sources

更新于 2026-10-15 约 18 分钟着色光照光源GoochPBRT聚光灯配光曲线

着色模型描述物体颜色如何随表面朝向、观察方向和光照变化。光源通过两个参数与着色模型交互:指向光源的方向 l\mathbf{l} 和光的颜色 clight\mathbf{c}_{\text{light}}。方向光、点光源、聚光灯的区别就在于这两个量如何随场景变化;距离衰减和方向衰减函数的选择同时影响画面与性能。

示例:Gooch 着色

RTR4 用 Gooch 模型的变体举例:法线朝向光源用暖色、背向用冷色,中间插值,再加一个风格化高光。 cshaded=s chighlight+(1−s)(t cwarm+(1−t) ccool)\mathbf{c}_{\text{shaded}}=s\,\mathbf{c}_{\text{highlight}}+(1-s)\left(t\,\mathbf{c}_{\text{warm}}+(1-t)\,\mathbf{c}_{\text{cool}}\right) 其中 ccool=(0,0,0.55)+0.25 csurface\mathbf{c}_{\text{cool}}=(0,0,0.55)+0.25\,\mathbf{c}_{\text{surface}},cwarm=(0.3,0.3,0)+0.25 csurface\mathbf{c}_{\text{warm}}=(0.3,0.3,0)+0.25\,\mathbf{c}_{\text{surface}},t=(n⋅l)+12t=\frac{(\mathbf{n}\cdot\mathbf{l})+1}{2},r=2(n⋅l)n−l\mathbf{r}=2(\mathbf{n}\cdot\mathbf{l})\mathbf{n}-\mathbf{l},s=(100(r⋅v)−97)∓s=(100(\mathbf{r}\cdot\mathbf{v})-97)^{\mp}(夹到 [0,1])。

它展示了着色中最常见的操作:

  • 单位向量点积(即夹角余弦)衡量两个方向的对齐程度;
  • 夹取 (clamp),尤其是到 [0,1];
  • 线性插值 lerp/mix;
  • 反射 reflect。

带光源的一般结构

cshaded=funlit(n,v)+∑i=1n(li⋅n)+ clighti flit(li,n,v)\mathbf{c}_{\text{shaded}}=f_{\text{unlit}}(\mathbf{n},\mathbf{v})+\sum_{i=1}^{n}(\mathbf{l}_i\cdot\mathbf{n})^+\,\mathbf{c}_{\text{light}_i}\,f_{\text{lit}}(\mathbf{l}_i,\mathbf{n},\mathbf{v})

  • (l⋅n)+(\mathbf{l}\cdot\mathbf{n})^+ 的来源:光线打到表面的密度与入射角余弦成正比;从背面来的光没有作用,所以夹到 0。这也是把 l\mathbf{l} 定义为指向光源(与光传播方向相反)的原因。
  • 这个结构是物理着色模型所必需的,对风格化模型也有助于光照一致性;不适合它的模型使用不带余弦项的形式。
  • funlitf_{\text{unlit}} 描述不受光源照射时的外观:可以是纯黑,可以是风格化的颜色,通常表示不是来自显式光源的光(天光、反弹光,见第 10、11 章)。
  • 最简单的 flit=csurfacef_{\text{lit}}=\mathbf{c}_{\text{surface}} 就是 Lambert 着色模型,适用于理想漫反射的哑光表面。

光源类型

类型l\mathbf{l}clight\mathbf{c}_{\text{light}}
方向光全场景恒定恒定(可被阴影衰减);可用两个嵌套盒子限定作用区域并平滑过渡
点光源 (omni)plight−p0∥plight−p0∥\frac{\mathbf{p}_{\text{light}}-\mathbf{p}_0}{\|\mathbf{p}_{\text{light}}-\mathbf{p}_0\|}随距离衰减
聚光灯同上距离衰减 × 方向衰减
  • 方向光适合光源距离远大于场景尺寸的情况,例如太阳。
  • 点光源和聚光灯统称精确光源 (punctual light):有位置、无尺寸。
  • 计算 l\mathbf{l} 时显式算出距离 r=d⋅dr=\sqrt{\mathbf{d}\cdot\mathbf{d}},后面衰减要用。

距离衰减

平方反比:clight(r)=clight0(r0r)2\mathbf{c}_{\text{light}}(r)=\mathbf{c}_{\text{light}_0}\left(\frac{r_0}{r}\right)^2。有两个实际问题:

近处奇点

  • 分母加 ϵ\epsilon:r02r2+ϵ\frac{r_0^2}{r^2+\epsilon},虚幻引擎用 ϵ=1\epsilon=1 cm。
  • 或夹取最小距离 max⁡(r,rmin⁡)\max(r,r_{\min})(CryEngine、Frostbite)。rmin⁡r_{\min} 有物理含义:发光体的半径。

远处永不为 0:为了高效渲染(第 20 章),光应在有限距离降到 0,且最好数值和导数同时为 0,避免硬边。虚幻与 Frostbite 使用窗口函数: fwin(r)=(1−(rrmax⁡)4)+2f_{\text{win}}(r)=\left(1-\left(\frac{r}{r_{\max}}\right)^4\right)^{+2}

  • 当衰减以较低空间频率采样(光照贴图、逐顶点光照)时,rmax⁡r_{\max} 处导数为 0 尤其重要;CryEngine 不用这两者,所以只在 0.8rmax⁡0.8r_{\max} 到 rmax⁡r_{\max} 之间改为线性衰减。
  • 也可以用非平方反比的衰减函数 fdist(r)f_{\text{dist}}(r):《Just Cause 2》为了极低开销用 (1−(r/rmax⁡)2)+2\left(1-(r/r_{\max})^2\right)^{+2};虚幻引擎另有可调的指数衰减模式;《古墓丽影》(2013) 用样条编辑衰减曲线。

聚光灯方向衰减

θs\theta_s 为聚光方向 s\mathbf{s} 与 −l-\mathbf{l} 的夹角。本影角 θu\theta_u 之外为 0(也可用于剔除),半影角 θp\theta_p 之内为满强度: t=(cos⁡θs−cos⁡θucos⁡θp−cos⁡θu)∓ (夹到 [0,1]),fdirF=t2 (Frostbite),fdirT=smoothstep⁡(t)=t2(3−2t) (three.js)t=\left(\frac{\cos\theta_s-\cos\theta_u}{\cos\theta_p-\cos\theta_u}\right)^{\mp}\ (\text{夹到 }[0,1]),\quad f_{\text{dir}_F}=t^2\ (\text{Frostbite}),\quad f_{\text{dir}_T}=\operatorname{smoothstep}(t)=t^2(3-2t)\ (\text{three.js})

其他光源

  • fdirf_{\text{dir}} 可以是任意方向分布,包括实测的 IES 配光文件(《Killzone: Shadow Fall》、虚幻、Frostbite 使用)。
  • 《古墓丽影》有沿世界 x、y、z 轴分别衰减的精确光源,以及随时间变化强度的曲线(闪烁火把),还有以线段为光源的胶囊光:取线段上最近点的方向作为 l\mathbf{l}。
  • 只要着色器拿到 l\mathbf{l} 和 clight\mathbf{c}_{\text{light}},任何计算方式都可以。
  • 真实光源有尺寸,称为面光源;其技术分为软化阴影(7.1.2 节)和模拟对表面着色的影响(10.1 节,光滑表面上最明显)。

GEA 的视角:面光源与理想化光源(卷 II 11.3.7)

  • 现实中的光源分发光表面(太阳、灯泡、发热的炉丝)和发光介质(火焰:只有足够热的区域才发光)。渲染中主要关心发光表面;烛火、爆炸这类发光介质通常可以近似为被一个假想发光表面包住的体积。表面上每一点都发光的光源叫面光源(卷 II 11.3.7,见 面光源)。

    原书问题(11.3.7):GEA 说火焰"由空气混合水蒸气(足够热时还有等离子体)组成"。烛火等扩散火焰的可见光主要来自燃烧不完全产生的炽热烟炱 (soot) 颗粒的黑体式热辐射(黄色部分),蓝色底部则来自 CH、C₂ 等自由基的化学发光;水蒸气和 CO₂ 是燃烧产物,主要辐射在红外(Wikipedia "Flame")。这不影响"把火焰当作发光介质、用假想发光表面包住近似"的结论。

  • 面光源在光线追踪引擎里很好处理,它们只是恰好向场景注入能量的普通表面;但在三角形光栅化等方法中较棘手,因此常用理想化模型:灯泡、LED 这样的小光源近似为点光源(全向光),从一点向各方向辐射;太阳这样的巨大光源近似为方向光,光子充满整个空间、沿同一方向平行传播。
  • 理想化光源的缺点是阴影不真实:现实中光源有面积,才形成有本影和半影的软阴影;理想化光源只产生硬阴影,除非另外模糊边缘(见 软阴影 PCF 与 PCSS)。光源模型的细节 GEA 留到卷 II 12.4.2。
  • 这与本页「光源类型」中 RTR4 的分类一致;本页的聚光灯和衰减函数 GEA 第 11 章没有涉及。

GEA 的视角:理想化光源模型(卷 II 12.4.2)

  • 理想化光源有两种基本类型:方向光是尺寸相对场景无限大的面光源,所有光线平行,常用来模拟太阳;点光源是尺寸为零的面光源,光线从一点向外辐射,常用来模拟小灯泡和 LED(卷 II 12.4.2)。
  • 每个理想光源由位置 yk\mathbf{y}_k、单位方向 ℓk\ell_k 和照度 Ev,kE_{v,k} 描述;方向光可以看成位置在无穷远。ℓk\ell_k 约定背离表面,与光子流方向相反:ℓk=−S/∣S∣\ell_k=-\mathbf{S}/\lvert\mathbf{S}\rvert。Ev,kE_{v,k} 是该光源在垂直于光线的白色理想漫反射面上产生的照度,渲染程序员说的"光源颜色"就是它。
  • 太阳其实是比地球大得多的面光源,表面光子向各方向飞出,但太阳太远,只有几乎平行于两天体连线的光子能到达地面,所以在地球上它的通量密度场表现得像无穷远处的无穷小点光源;换个角度说,太阳在天空中所张的立体角很小。
  • 方向光:ℓk\ell_k 与 Ev,kE_{v,k} 在空间中处处为常数(卷 II 12.4.2.1)。
  • 点光源:ℓk(x)=(yk−x)/∣yk−x∣\ell_k(\mathbf{x})=(\mathbf{y}_k-\mathbf{x})/\lvert\mathbf{y}_k-\mathbf{x}\rvert,照度按平方反比衰减。平方反比衰减很快,超过某个半径 rmax⁡r_{\max} 后几乎为零,这个范围叫影响球;多数引擎只对影响球内的表面应用该光源,这是重要的优化(卷 II 12.4.2.2)。
  • 聚光灯:限制在锥形区域内的点光源,通常有内外两个锥角:内锥内满强度,内外锥之间逐渐衰减,外锥外为零。由位置、随距离衰减的照度、中心方向、影响半径 rmax⁡r_{\max} 和内外锥角 θmin⁡\theta_{\min}、θmax⁡\theta_{\max} 描述(卷 II 12.4.2.3)。本页上文 RTR4 的聚光灯与衰减函数在这里得到对应。
  • 着色方程里统一用 Ev,kE_{v,k} 表示照度,假设点光源和聚光灯的距离衰减已经事先算好(卷 II 12.4.2.4)。GEA 第 12.5.1.3 节示例着色器中的点光源实际用 smoothstep(outerRadius, innerRadius, distance) 做距离衰减,而不是平方反比(见 着色方程与经典光照模型)。
  • 原书问题(书中前后不一致):12.2.4.5 推导点光源通量密度为 Φ/(4πr2)\Phi/(4\pi r^2),12.4.2.2 写点光源照度却是 Φv,k/rxy2\Phi_{v,k}/r_{xy}^2,少了 4π4\pi。如果把 Φv,k\Phi_{v,k} 理解为发光强度(每球面度的光通量),I/r2I/r^2 才是正确的照度;按书中"光通量"的说法应除以 4πr24\pi r^2。本页上文 RTR4 用参考距离 r0r_0 处的光源颜色写成 clight0(r0/r)2\mathbf{c}_{\text{light}_0}(r_0/r)^2,不涉及功率与 4π4\pi 的换算。各向同性点光源 E=I/r2=Φ/(4πr2)E=I/r^2=\Phi/(4\pi r^2) 见 Wikipedia "Inverse-square law"(光强与照度一节)及 RTR4 第 5.2.2 节。

PBRT 的视角:物理光源接口(PBRT 4e 12.1–12.3)

为什么没有"艺术控制"

pbrt 不提供可调衰减速率、只照亮某些物体、不投射阴影等非物理控制,因为它们与基于物理的光传输不相容。书中的反例:不投影的光源周围套一层层同心球壳,忽略遮挡时每加一层,表面接收的总能量就增加,最终超过光源发出的总能量。这与上文 RTR4 记录的游戏做法(窗口函数截断、rmin⁡r_{\min} 夹取、《Just Cause 2》的非平方反比衰减)构成分歧:游戏为了有限影响范围和性能主动放弃能量守恒,离线物理渲染器则保留严格的 1/r21/r^2。

接口与类型

  • 每个光源要能返回总功率 Φ\Phi(供按功率选光源);Type() 分四类:DeltaPosition(点)、DeltaDirection(单一方向)、Area(附着在形状上)、Infinite(无几何、给逃逸光线提供亮度)。积分器需要知道哪些是 delta 光源。
  • SampleLi(ctx, u, λ, allowIncompletePDF) 返回入射亮度、方向 ωi\omega_i、发光点和相对接收点立体角的 PDF;不包含遮挡和介质衰减。delta 光源返回 pdf = 1(亮度与 PDF 中隐含的 delta 相消),PDF_Li() 对它们返回 0。L() 给面光源、Le() 给无穷远光源。allowIncompletePDF 允许在贡献小的方向不生成样本(MIS 补偿,Karlík 等 2019)。
  • 光源不支持动画变换(练习 12.3)。LightBase 用 InternCache 对相同的 DenselySampledSpectrum(覆盖可见光约 2 KB)去重,百万光源时可省大量内存。
  • 光度学输入:场景文件可以用光通量(如 1000 lm 的灯泡)指定光源,解析时转换为辐射度量值;Phi() 返回的是辐射功率。

各类点光源

  • 点光源:强度 II,Φ=4πI\Phi=4\pi I。严格说点光源到达的是强度除以 r2r^2 而不是辐射亮度,pbrt 有意"滥用"术语,让所有光源共用一套接口。
  • 聚光灯:位于原点朝 +z+z,存两个角的余弦;方向衰减 SmoothStep(cosθ, cosFalloffEnd, cosFalloffStart)(三次 Hermite),与上文 three.js 的 smoothstep 写法一致,而 Frostbite 用 t2t^2。功率 Φ=2πI[(1−cos⁡θstart)+cos⁡θstart−cos⁡θend2]\Phi=2\pi I\big[(1-\cos\theta_{start})+\tfrac{\cos\theta_{start}-\cos\theta_{end}}{2}\big]:代换 x=cos⁡θx=\cos\theta 后衰减带积分为 (cos⁡θstart−cos⁡θend)∫01smoothstep=cos⁡θstart−cos⁡θend2(\cos\theta_{start}-\cos\theta_{end})\int_0^1\text{smoothstep}=\tfrac{\cos\theta_{start}-\cos\theta_{end}}{2},与书一致。Warn 1983 最早提出这种聚光灯模型。
  • 投影光 (ProjectionLight):像幻灯机,用透视投影把点投到 z=1z=1 平面;丢弃 z<0z<0 的点(投影变换会把背后的点翻到前面);图像用最近邻而非双线性,保证与重要性采样的分段常数分布严格一致;RGB 用 RGBIlluminantSpectrum 转光谱,使 (1,1,1)(1,1,1) 对应色彩空间的光源白而非常数光谱。功率在投影平面上积分,换元因子 dω/dA=cos⁡3θd\omega/dA=\cos^3\theta(cos⁡θ\cos\theta 乘以 1/r21/r^2,平面上 r=1/cos⁡θr=1/\cos\theta)。
  • 配光曲线光源 (GoniometricLight):照明工程常用的测角光度图(IES 文件 LM-63 即此类),用等面积八面体参数化存成图像,只用第一通道缩放强度;等面积映射使每个像素立体角相同,换元因子为常数 4π4\pi。照明工程的经验:距离超过面光源半径 5 倍时可当点光源,见 面光源 中点光源近似误差的讨论。更一般的近场光度学用 4D 光场(Ashdown 1993、Heidrich 等 1998)。
  • 方向光 (DistantLight):Li=Le δ(ω−ωl)L_i=L_e\,\delta(\omega-\omega_l);只能处于真空(在吸收介质中的无穷远光源会被全部吸收)。阴影光线终点取沿入射方向 2 倍场景包围球半径处,必在场景外。功率与受照面积成正比,用场景包围球内接圆盘近似:Φ=πr2L\Phi=\pi r^2L,这是投影面积的上界。

原书问题(12.2.3,措辞)

书中说测角光度图描述点光源出射的"luminance"(亮度)的角分布。点光源的方向分布是发光强度 (luminous intensity, cd),不是亮度 (luminance, cd/m²);pbrt 实现中图像缩放的也正是强度 I()。IES LM-63 文件存的同样是坎德拉值。

LearnOpenGL 的视角:方向光 / 点光衰减 / 聚光灯锥体(Lighting / Light casters · Multiple lights)

来源:Light casters、Multiple lights;摘录 Lighting — Light casters、Lighting — Multiple lights。

方向光

用方向向量代替位置;着色里 lightDir = normalize(-light.direction)(约定 CPU 侧存「从光源指出」的方向)。旧式定点管线用 vec4 的 w==0 表示方向光、w==1 表示点光。

点光与衰减

衰减常用 Fatt=1/(Kc+Kld+Kqd2)F_{att}=1/(K_c + K_l d + K_q d^2)。KcK_c 常为 1,避免分母小于 1 时反而放大。教程转载 Ogre3D 表,按覆盖半径给 KlK_l、KqK_q 初值(如半径 50 → 0.09 / 0.032)。环境项是否乘衰减:单灯可保留环境,多灯叠加时通常也衰减,以免环境光堆爆。

聚光灯与手电

参数:位置、方向、切角 ϕ\phi。比较的是 余弦(dot(lightDir, -spotDir))与预计算的 cos(cutOff),避免着色器里 acos。硬边用 theta > cutOff;软边引入内外角,强度 I=clamp((θ−γ)/ε,0,1)I=\mathrm{clamp}((\theta-\gamma)/\varepsilon,0,1),只乘漫反射与镜面,环境可保留。手电 = 聚光灯位置/方向每帧跟相机。

多光源结构

main 里累加:result = CalcDirLight(...) + Σ CalcPointLight(...) + CalcSpotLight(...)。GLSL 函数与 #define NR_POINT_LIGHTS 数组;CPU 用 pointLights[i].constant 这种带下标的 uniform 名赋值。重复的反射向量/贴图采样有优化空间,但是教学结构清晰。氛围主要靠调各灯 ambient/diffuse/specular,而非改模型。

  1. realtime_rendering_4ed.pdf 第 5 章 Shading Basics
  2. Game_Engine_Architecture_4th_Edtion_Volume_2_-_Jason_Gregory.pdf
  3. Jason Gregory《Game Engine Architecture》第 4 版(2026)卷 II 第 11 章 11.3.7 节
  4. Jason Gregory《Game Engine Architecture》第 4 版(2026)卷 II 第 12 章 12.4.2 节
  5. PBRT 4e source excerpt: chapter 12 (Light Sources)
  6. Pharr, Jakob, Humphreys《Physically Based Rendering: From Theory to Implementation》第 4 版(MIT Press, 2023)第 12 章 12.1–12.3 节、延伸阅读,pbr-book.org/4ed/Light_Sources
  7. Lighting — Light casters
  8. Lighting — Multiple lights
  9. learnopengl.com/Lighting/Light-casters
  10. learnopengl.com/Lighting/Multiple-lights

相关页面

图形学着色频率与材质系统Shading Frequency & Material Systems实现着色时要按"计算频率"划分工作:整个 draw call 不变的放到应用端作为 uniform,其余放在相应的可编程阶段。实践中大多数着色在像素级完成,顶点着色器负责变换和变形。材质系统把面向美术的材质与底层着色器组织起来,处理海量着色器变体的组合问题。图形学像素着色器Pixel Shader像素着色器(OpenGL 里叫片元着色器)对光栅化产生的每个片元运行,用插值后的顶点数据算出颜色,也可以输出不透明度、修改深度或直接丢弃片元。多渲染目标让它一次输出多组数据,催生了延迟着色。它通常只能写自己所在的像素,但能通过 2×2 quad 拿到相邻像素的导数。图形学基于物理的着色Physically Based Shading基于物理的着色从光与物质交互的物理出发,用 BRDF 和反射方程计算表面沿视线方向射出的辐射亮度:镜面项来自微表面理论与菲涅耳反射,漫反射项来自局部次表面散射,布料、波动光学与分层材质再作扩展。本页是 RTR4 第 9 章的总览,并收录该章第 9.13 节的材质混合与材质过滤(镜面抗锯齿)。图形学辐射度量学与光度学Radiometry & Photometry辐射度量学精确度量电磁辐射,是基于物理渲染的第一步;光度学用人眼灵敏度对它加权。渲染中最重要的量是辐射亮度 L:眼睛和相机测的就是它,着色方程要算的也是沿视线的辐射亮度。图形学双向反射分布函数BRDFBRDF f(\mathbf{l},\mathbf{v}) 量化局部反射:只依赖入射方向 \mathbf{l} 和出射(观察)方向 \mathbf{v},涵盖表面反射与局部次表面散射。它通过反射方程把入射辐射亮度转换为出射辐射亮度,物理上需满足 Helmholtz 互易性与能量守恒,用方向反照率检验。方向光和精确光源可从小面光源的极限推导,使积分变为对光源的求和。本页对应 RTR4 9.3–9.4 节。图形学菲涅耳反射Fresnel Reflectance菲涅耳方程描述光在两种物质的平坦界面上反射的比例 F,它取决于入射角和两侧折射率:垂直入射时为材质特有的 F0(特征镜面色),掠射时趋于 1。实时渲染用以 F0 为参数的 Schlick 近似。电介质 F0 低且无色,金属 F0 高且常带色,半导体介于其间;金属度参数化利用了这一点。光从物体内部射向表面时还可能发生全内反射。本页对应 RTR4 9.5 节。图形学微表面理论Microfacet Theory微表面理论把小于像素的微几何建模为大量平坦微面元,用法线分布函数 (NDF) D(\mathbf{m}) 描述其朝向统计,用遮蔽函数 G1 和遮蔽-阴影函数 G2 描述可见性,并据此推导宏观 BRDF。镜面反射时每个微面元是完美菲涅耳镜,积分退化为在半向量处求值,得到 FG2D/(4|\mathbf{n}\cdot\mathbf{l}||\mathbf{n}\cdot\mathbf{v}|)。GGX 分布配合高度相关的 Smith G2 是当今影视和游戏最常用的组合;该框架忽略微面元间的多次反射,可用补偿项弥补。本页对应 RTR4 9.6–9.8 节。图形学面光源Area Lights真实光源从来不是点。面光源要求对光源所张立体角 \omegal 积分 BRDF,实时渲染倾向于用闭式解或近似而不是多条光线取平均。主要做法有:Lambert 表面的矢量辐照度与包裹光照、光泽表面的粗糙度修正和"最具代表性的点",以及最准确的线性变换余弦 (LTC)。图形学基于图像的光照Image-Based Lighting用纹理数据(通常是相机拍摄的 360° HDR 全景)照明场景称为基于图像的光照。实时引擎常用预滤波的高光立方体贴图(配合 split-sum 近似)处理高光,用辐照度环境贴图或球谐系数处理漫反射。它们只依赖少量光照图元而不需要知道场景其他表面,因此仍属局部光照。图形学卡通着色Toon Shading非真实感渲染 (NPR,也称风格化渲染) 不追求照片般逼真,而是追求特定目的或画风。卡通 / cel 渲染是其中最受关注的一种:用实线分隔大块纯色区域。表面着色常用纯色填充、两色"硬着色"、或对最终图像做色调分离 (posterization);描边见 轮廓边与几何描边。图形学延迟着色Deferred Shading延迟着色先用一遍几何 pass 把所有可见表面的材质参数写入多张渲染目标(G-buffer),再以后处理方式对这些存储值逐光源计算光照,从而把"几何可见性"与"光照"彻底解耦,并把材质与光源分离。它避免了着色的过度绘制、简化了着色器管理、天然适合贴花,但 G-buffer 占用显存和带宽,且难以直接支持透明和 MSAA。本页也覆盖前向渲染下限制光源影响范围的基础手段与"光照预通道 (light prepass)"类混合方案。图形学分簇着色Clustered Shading分簇着色把整个视锥(而不只是屏幕平面)划分为三维单元——簇 (cluster),按簇建立光源列表。与依赖场景几何深度的分块着色不同,簇的划分与几何无关,可只由视图和光源计算,因此对相机位置的性能波动更小、对深度不连续更稳健,并为不透明、透明、体积物体提供统一的光照方案。它同样可配合前向或延迟着色,并衍生出 z-binning、光源树等更省内存的变体。本页还汇总了各类多光源方案的对比。游戏开发 · UE5光源类型与静态光照Light Types & Static LightingUE 有五种光源:定向光、天空光、点光、聚光和矩形光。每个光源有三种移动性 (Mobility):静态 (Static) 只烘焙进光照贴图;固定 (Stationary) 烘焙间接光,同时能为可移动物体投射动态阴影,但一个物体最多受 4 个固定光源影响;可移动 (Movable) 完全动态。烘焙由 Lightmass(CPU 版或基于 DXR 的 GPU 版)完成,Lightmass 重要性体积用来把光子集中到可玩区域。图形学软阴影 PCF 与 PCSSSoft Shadows with PCF & PCSS百分比渐近过滤 (PCF) 在阴影贴图上取多个样本,分别与表面深度比较后混合结果,得到伪软阴影,但半影宽度恒定。PCSS 先搜索附近遮挡体的平均深度,再据此决定过滤宽度,从而在接触处硬、远处软(接触硬化)。图形学着色方程与经典光照模型Shading Equation & Classic Lighting ModelsGEA 把渲染方程在两条简化假设下化成的求和式称为着色方程:只有理想化的点光源和方向光,间接光只用一个环境光项粗略近似。配上 Lambert、Phong、Blinn-Phong 这类简单 BRDF,它给不出照片级真实感,但能产生可信的画面,是早期游戏的全部光照,也是理解 BRDF 用法的最好入门(GEA4 卷 II 12.4、12.5.1)。图形学多光源采样与光源 BVHMany-Light Sampling & Light BVH场景有成百上千个光源时,不可能在每个着色点对所有光源做直接光照。利用求和的蒙特卡洛估计 \sumi fi\approx fj/p(j),每次只随机选一个(或几个)光源并除以其概率即可无偏。选择概率可以均匀、按功率,或随着色点变化——后者需要一棵把光源聚合起来的层次结构(光源 BVH)。本页对应 PBRT 4e 12.6 节,并对照实时渲染的分簇/分块光源剔除。图形学片元着色器与 GLSL 基础Fragment Shaders & GLSL Basics片元着色器(fragment shader)是在每个像素(片元)上并行执行的小程序:输入位置等信息,输出颜色。GLSL 是 OpenGL / OpenGL ES / WebGL 共用的着色语言;本书用全屏 billboard 上的像素着色练习,建立程序化图形的基础心智模型。图形学显示编码与 sRGBDisplay Encoding & sRGB光照、纹理等计算假设数值是线性的,但显示缓冲和纹理使用非线性编码。简短的回答是:着色器输出 [0,1] 的颜色要取 1/2.2 次幂(gamma 校正),读入的纹理和颜色做相反的变换,多数情况下可以让 GPU 自动完成。忽略它会导致画面偏暗、色相偏移、光照叠加错误和抗锯齿边缘"绳索化"。游戏美术灯光工作流与光源类型Lighting Workflow & Light Types现以第 3 版 Ch2 为准。 3D 少有「美丽意外」——要控制流程(何时开灯、反馈环、命名与版本)、选对光源类型,并用衰减、diffuse/spec 分离、light linking、cookie 等手段细化。第 3 版新增 Physically Based Lights(IES/光度学灯) 实践。游戏美术三点布光Three-Point Lighting经典 key / fill / backlight(rim) 术语页。第 1 版独立成 Ch3;第 3 版并入 Ch5 角色章,并强调变体、反公式化,以及 bounce/spill/kick/spec 等扩展。角色动画、SSS、眼发等深度内容见 生物与角色灯光。游戏美术数字灯光设计基础Digital Lighting Design Fundamentals现以第 3 版 Ch1 为准。 灯光设计是前数字时代就存在的手艺;CG 里每一盏灯都要有动机(motivation),必要时可 cheat,并服务可读性、可信度、连续性与视线引导等视觉目标。

被这些页面引用1 篇

输入关键词开始搜索

滚轮或双指缩放 · 拖动平移 · 双击放大 / 还原