GAMES101笔记-光线追踪(渲染方程)
Radiance vs Irradiance 辐射/亮度 vs 辐照度
Irradiance 辐照度: 单位面积上接收到的辐射功率
Radiance 辐射/亮度: 在dωd\omegadω立体角方向上,单位面积上接收到的辐射功率
沿着某个方向ω\omegaω入射到点ppp上的辐射亮度为Li(p,ω)L_i(p, \omega)Li(p,ω),则该点在该方向ω\omegaω上单位面积上接收到的辐照度为dE(p)d E(p)dE(p)。
dE(p,ω)=Li(p,ω)⋅cosθ⋅dωd E(p, \omega) = L_i(p, \omega) \cdot \cos \theta \cdot d\omega \\
dE(p,ω)=Li(p,ω)⋅cosθ⋅dω
则在所有方向上入射到点ppp上的辐照度为:
E(p)=∫H2Li(p,ω)⋅cosθ⋅dωE(p) = \int_{H^2} L_i(p, \omega) \cdot \cos \theta \cdot d\omega
E(p)=∫H2Li(p,ω)⋅cosθ⋅dω
BRDF 双向反射分布函数(Bidirect ...
GAMES101笔记-动画(物理模拟)
单质点模拟
首先,提出先聚焦于单个粒子的运动,之后再将研究推广到大量粒子的情况。
为开展研究,假设粒子的运动由速度矢量场决定。该速度矢量场是位置xxx和时间ttt的函数,记为v(x,t)v(x,t)v(x,t)。
右侧的图示直观呈现了速度矢量场(由箭头表示)以及粒子在该速度场中运动的轨迹。
常微分方程 Ordinary Differential Equation (ODE)
计算速度场内粒子的位置需要计算一阶常微分方程
dxdt=x˙=v(x,t)\frac{dx}{dt} = \dot{x} = v(x, t)
dtdx=x˙=v(x,t)
欧拉方法 Euler’s Method
欧拉方法,又称为前向欧拉,显式欧拉,是数值积分中最简单的方法之一。
使用很简单的迭代的方式
很常见
很不准
结果通常不稳定
始终使用前一段的量估计下一帧的量。
xt+Δt=xt+Δt⋅x˙tx˙t+Δt=x˙t+Δt⋅x¨tx^{t+\Delta t} = x^t + \Delta t \cdot \dot{x}^t \\
\dot{x}^{t+\Delta t} = \dot{x}^t + ...
GAMES101笔记-动画(Animation)
动画是一种信息传递的工具
美学经常比技术重要
是模型的延伸 → 连续性
将场景模型表示为时间的函数
输出一系列图像,当顺序查看时提供运动的感觉
帧率
电影:24FPS
视频:30FPS、29.994FPS
VR:90FPS (不晕的基础要求)
关键帧动画
动画师创建关键帧
助手(人工或程序)创建中间帧
其中的关键技术即为插值技术
线性插值: 通常可能不太满足动画需求
样条插值: 更平滑的插值方式
Catmull-Rom 样条
B 样条
Bezier 曲线
物理仿真动画
模拟、仿真:推导、实现公式,模拟出物体应该怎么变化
例子:布料模拟、流体模拟
质点弹簧系统 Mass-Spring System
一个弹簧左右连接两个质点,位置是a,b\mathbf a, \mathbf ba,b,弹簧劲度系数为kSk_SkS。
当弹簧拉伸时候,弹簧会对两个质点施加一个拉力:
质点a\mathbf aa受到的往b\mathbf bb方向的拉力为:
fa→b=kS(b−a)\mathbf f_{a \rightarrow b} = k_S ( \mathbf ...
GAMES101笔记-光线追踪(辐射度量学)
背景
Radiometry(辐射度量学)是研究光的物理量的学科,主要关注光的能量和强度等方面。它与光线追踪密切相关,因为光线追踪需要模拟光的传播和交互。
它定义了光在空间中的各种物理量,根据这些物理量用正确的物理方式来计算光照。
Radiant energy 辐射能
Radiant energy 是电磁辐射的能力,单位是焦耳(J)。通常使用符号 $ Q [J = Joule]$ 来表示。
Radiant flux/power 辐射通量
Radiant flux 是单位时间内能量发射,反射,传播,接收的能量量。单位是瓦特(W)。通常使用符号 $ \Phi = \frac{dQ}{dt}[W = Watt = J/s]$ 来表示。对于光而言,通常使用 lumen(流明)来表示。
Angle & Solid Angles 角与立体角
Angle 角
角度:弧长和半径的比值。
θ=lr\theta = \frac{l}{r}θ=rl
整个圆的角度是2π2\pi2π。
Solid Angle 立体角
立体角:是角度在三维空间中的推广。它是一个球面上某个区域的面积与球半 ...
GAMES101笔记-几何(Geometry)
表达几何的方式有很多种,基本可以分为两大类:
隐式表示
Algebraic Surface 代数曲面
Level Set 水平集
Distance Function 距离函数
Signed Distance Function(SDF): 有符号距离函数
Unsigned Distance Function(UDF): 无符号距离函数
…
显式表示
Point Cloud 点云
Polygon Mesh 多边形网格
subdivision, NURBS
…
几何的表示方式
几何的隐式表示
隐式不会告诉具体的点在哪,只描述点满足什么约束关系,如对于一个球的隐式表示如下:
x2+y2+z2=r2x^2 + y^2 + z^2 = r^2
x2+y2+z2=r2
更通用的表述方式为满足f(x,y,z)=0f(x, y, z) = 0f(x,y,z)=0的点集,就可以描述一个隐式的几何表示。
隐式表示的缺点是不直观并不知道有哪些点,优点是很轻易可以判断一个点是否在几何上,几何内还是几何外。
基于代数方法的隐式表示
使用代数方程来描述几何体
CSG(Const ...
GAMES101笔记-着色(Shading)
图形学中 Sharding 的概念值对一个物体应用不同的材质的过程。
光照 Lighting
Blinn-Phong 反射模型(BPR)
Blinn-Phong 反射模型是对光线与物体表面交互的一个经验模型。
它将光线与物体表面的交互分为三个部分:
环境光:物体表面在没有直接光照的情况下的颜色
漫反射:物体表面在直接光照下的颜色,取决于光源的颜色和物体表面的颜色
高光反射:物体表面在直接光照下的高光部分,取决于光源的颜色、物体表面的颜色和观察者的视角
计算光线从一个着色点反射到相机中中的颜色:
输入变量定义如下:
vvv: 观察者的视角的单位向量
lll: 表示光源的方向的单位向量
nnn: 物体表面着色点的单位法向量
表面材质(颜色,反光程度,…)
漫反射
一根光线从光源发出,照射到着色点后,会沿四周反射,即为漫反射。
Lambert’s Cosine Law 描述了漫反射的强度与光线入射角的关系。
当光线垂直入射时,物体表面几乎可以接收到全部的光线能量。
当光线倾斜入射时,物体表面接收到的光线能量会减少。
当光线平行于物体表面时,物体表面几乎无法接收到光线能 ...
GAMES101笔记-光栅化
光栅化是把标准化立方体渲染到屏幕上的过程
屏幕的定义:
一段像素数组
像素的数组长度就是分辨率的尺寸
屏幕是一个典型的光栅成像设备
像素的定义:
Pixel 是 Picture Element 的缩写
一个简单的假设是每个像素认为是一个拥有单一颜色的小正方形(当然还有更复杂的假设放在后面讨论)
每个像素的颜色可以用 RGB 三个分量来表示
屏幕空间的定义(这里和虎书中的定义有所差别):
屏幕空间是一个二维坐标系,原点在左下角,x 轴向右,y 轴向上
每个像素的索引由(x, y)唯一表示,x, y 均为整数
像素索引的范围是 [0,width−1]×[0,height−1][0, width-1] \times [0, height-1][0,width−1]×[0,height−1]
像素的中心点坐标为 (x+0.5,y+0.5)(x + 0.5, y + 0.5)(x+0.5,y+0.5)
屏幕空间的坐标范围是 [0,width]×[0,height][0, width] \times [0, height][0,width]×[0,height]
Viewport ...
基于 rust-vmm 玩转虚拟化
前言
在云原生、Serverless 与机密计算快速发展的今天,传统 C 语言实现的虚拟化栈(如 QEMU)面临内存安全漏洞频发、代码体积庞大、攻击面过宽等问题。2019 年由 Intel、Google、AWS、阿里云等多家厂商联合发起的 rust-vmm 项目应运而生 —— 它不是一款完整的虚拟机监视器(VMM),而是一套高度解耦、可按需组装的 Rust 虚拟化基础组件库,为整个行业提供了构建轻量、安全、高性能 VMM 的标准化「积木」。
rust-vmm 遵循「一个组件一个 crate」的设计原则,所有 crate 独立发布、按需依赖,从最底层的系统调用封装到上层的设备模拟,覆盖了虚拟化技术栈的全部核心环节。本文将按功能分层,系统梳理 rust-vmm 生态下的全部核心 crate 及其定位、能力、核心 API 与最小调用示例。
核实声明:本文所有事实(仓库归属、架构支持、trait 名称、crate 是否存在、API 签名)均经过对 rust-vmm 组织 GitHub 仓库与 crates.io 的实际比对,更新于 2026-06;示例 API 以 docs.rs late ...
椭圆周长公式推导
参考资料
本文是针对视频
https://www.bilibili.com/video/BV1ZF411f7Xv
整理的笔记
推导
椭圆的参数方程:
{x=acosθy=bsinθ\begin{cases}
x = a \cos \theta \\
y = b \sin \theta
\end{cases}
{x=acosθy=bsinθ
对参数方程求微分:
{dx=−asinθdθdy=bcosθdθ\begin{cases}
dx = -a \sin \theta d\theta \\
dy = b \cos \theta d\theta
\end{cases}
{dx=−asinθdθdy=bcosθdθ
则周长可以表示为:
C=∫02πdx2+dy2=∫02π(−asinθ)2+(bcosθ)2dθ=∫02πa2(1−cos2θ)+b2cos2θdθ=∫02πa2−(a2−b2)cos2θdθ=a∫02π1−a2−b2a2cos2θdθ=4a∫0π21−a2−b2a2cos2θdθ\begin{aligned}
C &= \int_0^{2\pi} ...
Leetcode-2145-统计隐藏数组数目
题目
给你一个下标从 0 开始且长度为 n 的整数数组 differences ,它表示一个长度为 n + 1 的 隐藏 数组 相邻 元素之间的 差值 。更正式的表述为:我们将隐藏数组记作 hidden ,那么 differences[i] = hidden[i + 1] - hidden[i] 。
同时给你两个整数 lower 和 upper ,它们表示隐藏数组中所有数字的值都在 闭 区间 [lower, upper] 之间。
比方说,differences = [1, -3, 4] ,lower = 1 ,upper = 6 ,那么隐藏数组是一个长度为 4 且所有值都在 1 和 6 (包含两者)之间的数组。
[3, 4, 1, 5] 和 [4, 5, 2, 6] 都是符合要求的隐藏数组。
[5, 6, 3, 7] 不符合要求,因为它包含大于 6 的元素。
[1, 2, 3, 4] 不符合要求,因为相邻元素的差值不符合给定数据。
请你返回 符合 要求的隐藏数组的数目。如果没有符合要求的隐藏数组,请返回 0 。
分析
由于满足要求的数组长度为n+1,故可以设满足要求的数组为 a ...
