<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>《计算机图形学》卷二《着色、光照与纹理》· 全书目录与章节索引（50 篇） on PlumePHP</title><link>https://plumephp.com/posts/books/%E7%9D%80%E8%89%B2%E5%85%89%E7%85%A7%E4%B8%8E%E7%BA%B9%E7%90%86/</link><description>Recent content in 《计算机图形学》卷二《着色、光照与纹理》· 全书目录与章节索引（50 篇） on PlumePHP</description><generator>Hugo</generator><language>zh-CN</language><lastBuildDate>Thu, 15 Oct 2026 21:50:00 +0800</lastBuildDate><atom:link href="https://plumephp.com/posts/books/%E7%9D%80%E8%89%B2%E5%85%89%E7%85%A7%E4%B8%8E%E7%BA%B9%E7%90%86/index.xml" rel="self" type="application/rss+xml"/><item><title>16.3 交付卷三</title><link>https://plumephp.com/cg-shade-16-3-deliverable-handoff-volume3/</link><pubDate>Thu, 15 Oct 2026 21:50:00 +0800</pubDate><guid>https://plumephp.com/cg-shade-16-3-deliverable-handoff-volume3/</guid><description>卷二的收尾交付：接口契约写清卷一封了装配/深度/覆盖、卷二封了着色链（片元颜色的来源），卷三只替换「直接光照求值」为渲染方程的积分估计；另给出三条轴的参数扰动扫描——强度偏移 1 个 Q16.16 单位即产生首次可见差异（128 像素），超采样 N=4 才收敛，10 条软告警不硬失败、exit 0。</description></item><item><title>16.2 三种消费的联调</title><link>https://plumephp.com/cg-shade-16-2-three-host-integration/</link><pubDate>Thu, 15 Oct 2026 21:35:00 +0800</pubDate><guid>https://plumephp.com/cg-shade-16-2-three-host-integration/</guid><description>同一份 scene_spec.json 在 Python 定点、TypeScript 定点、浏览器 WebGL2 三处消费：S 与 P 成片 sha256 逐字节相同（0d997343…，43731 覆盖像素），S 与 W 按声明容差比对为 MAE 0.5067、PSNR 47.03 dB、覆盖归属差 0.0781‰；负例（片元颜色 ×0.5）MAE 21.3528 被同一判据拒绝。</description></item><item><title>16.1 着色管线的装配</title><link>https://plumephp.com/cg-shade-16-1-shading-pipeline-assembly/</link><pubDate>Thu, 15 Oct 2026 21:20:00 +0800</pubDate><guid>https://plumephp.com/cg-shade-16-1-shading-pipeline-assembly/</guid><description>把卷二前面十五节的环节首尾相接成一条从规格到成像的链：S 层在 320x240 场景上逐级核对十二个缓冲契约，w 不变量 487/487 成立、重心权重和违反 0 次、覆盖 43731 像素，成片 sha256 与卷二基线逐字节一致；P 层用 BigInt 重算同一链路复现同一摘要，负例（顶点顺序交换）必须让摘要分叉。</description></item><item><title>12.3 CPU 与 GPU 的比对</title><link>https://plumephp.com/cg-shade-12-3-cpu-gpu-comparison/</link><pubDate>Thu, 15 Oct 2026 21:00:00 +0800</pubDate><guid>https://plumephp.com/cg-shade-12-3-cpu-gpu-comparison/</guid><description>把同一份场景交给 WebGL2 渲染，再与 S 层定点基线逐像素比对：MAE 0.5073、PSNR 46.95 dB、覆盖归属差异 0.08‰，与 12.1 的 CPU 浮点镜像 0.4963 落在同一噪声地板上。不一致像素按「共享边归属 0.0% / 插值精度 11.3% / 舍入 88.6%」三类归因，并如实交代本机后端是 ANGLE/SwiftShader 软件实现，不是真实 GPU。</description></item><item><title>12.2 图像 digest 与误差度量</title><link>https://plumephp.com/cg-shade-12-2-image-digest-error/</link><pubDate>Thu, 15 Oct 2026 20:30:00 +0800</pubDate><guid>https://plumephp.com/cg-shade-12-2-image-digest-error/</guid><description>sha256 是「全等判据」，只在「全等是合理期望」时成立——浮点实现的 sha256 与基线不同，而它的 MAE 只有 0.4963。本节给出 MAE / RMSE / PSNR / 最大通道差四个标量的定义与各自盲区：整幅 +1 与 4 像素 +64 的 MAE 完全相同，只有 RMSE 与最大通道差分得开；覆盖归属差异与颜色误差是两条独立判据，必须分两栏报告。</description></item><item><title>12.1 浮点的容差口径</title><link>https://plumephp.com/cg-shade-12-1-float-tolerance/</link><pubDate>Thu, 15 Oct 2026 20:00:00 +0800</pubDate><guid>https://plumephp.com/cg-shade-12-1-float-tolerance/</guid><description>逐位相等在两个宿主之间不可能，容差必须可声明、可复算。本节把容差写成三条同时成立的判据——覆盖归属差异 ≤ 20‰、MAE ≤ 1.0、PSNR ≥ 30 dB，逐条给出阈值出处，并用同一份整数基线量出噪声地板与三条穿越点：太松会漏掉 2% 的全局偏置，太紧会把噪声本身判成错。</description></item><item><title>10.3 色调与调色</title><link>https://plumephp.com/cg-shade-10-3-grading/</link><pubDate>Thu, 15 Oct 2026 19:00:00 +0800</pubDate><guid>https://plumephp.com/cg-shade-10-3-grading/</guid><description>调色的整数形态是查表：对比度绕 128 旋转、色温用逐通道偏置，合成三张 256 项的一维 LUT；饱和度写成 luma + (s·(in-luma) &gt;&gt; 16)。本节量化 8 位 LUT 的往返代价与三维 LUT 的节点数误差，并给出 W 层浮点着色器与 S 层整数结果的声明容差比对（含被拒绝的负例）。</description></item><item><title>10.2 Bloom 与泛光</title><link>https://plumephp.com/cg-shade-10-2-bloom/</link><pubDate>Thu, 15 Oct 2026 18:40:00 +0800</pubDate><guid>https://plumephp.com/cg-shade-10-2-bloom/</guid><description>泛光不是「把亮的地方涂糊」，而是一条四步整数链：Rec.601 亮度做整数阈值提取亮部、每级减半的 2×2 盒式降采样、整数双线性上采样、以及权重和恰好为 ONE 的合并。本节扫描级数 2/4/6、阈值 64/96/128、强度 0.25~2.0，并给出金标准泛光帧的 sha256。</description></item><item><title>10.1 卷积与模糊</title><link>https://plumephp.com/cg-shade-10-1-convolution-blur/</link><pubDate>Thu, 15 Oct 2026 18:20:00 +0800</pubDate><guid>https://plumephp.com/cg-shade-10-1-convolution-blur/</guid><description>后处理的第一步是用核卷积。本节把卷积写成全整数：Q16.16 核权重之和必须恰好等于 ONE，否则整帧会整体偏亮或偏暗；边界有 clamp/wrap/mirror 三种；半径 r 的二维核拆成两次一维可分离卷积，半径 8 时实测快 8.86 倍。Python 与 TypeScript 在四个半径下的模糊缓冲 sha256 逐字节相同。</description></item><item><title>4.3 软阴影与 PCF</title><link>https://plumephp.com/cg-shade-04-3-soft-shadow-pcf/</link><pubDate>Thu, 15 Oct 2026 16:30:00 +0800</pubDate><guid>https://plumephp.com/cg-shade-04-3-soft-shadow-pcf/</guid><description>在深度图上取 N x N 邻域逐个做整数遮蔽比较，可见度=(N^2-occ)/N^2，把硬边界摊成半影。8 顶点 / 4 三角形的极简场景里，N=1/3/5/7 的半影像素为 0/1103/2146/3059，与 N=15 参考的可见度 MAE 为 0.12926/0.11639/0.10724/0.09882，整帧 114.1 到 403.1 ms，收益按 1/N 递减。</description></item><item><title>4.2 分辨率、偏差与走样</title><link>https://plumephp.com/cg-shade-04-2-shadow-bias-aliasing/</link><pubDate>Thu, 15 Oct 2026 16:15:00 +0800</pubDate><guid>https://plumephp.com/cg-shade-04-2-shadow-bias-aliasing/</guid><description>把阴影偏差解析地推出来：深度 1 LSB 对应 80 个 Q16.16 世界单位，纹素世界尺寸 20480、tan(theta)=1.4142，故解析上界 28963，而实测每像素所需偏差中位数只有 1、p95 184。再扫出偏差权衡曲线：bias 从 0 加到 4096，自遮挡从 22360 降到 0，阴影脱离从 17 升到 459；分辨率 64² 到 512² 自遮挡降 38 倍。</description></item><item><title>4.1 阴影贴图的原理</title><link>https://plumephp.com/cg-shade-04-1-shadow-map-principle/</link><pubDate>Thu, 15 Oct 2026 16:00:00 +0800</pubDate><guid>https://plumephp.com/cg-shade-04-1-shadow-map-principle/</guid><description>把 487 顶点 / 896 三角形的烛影山谷用光源正交矩阵投到 256x256 深度图，再在主相机逐像素插值出光源空间坐标 (lu,lv,ld)，整数比对 ld-map&gt;bias 判定遮蔽：深度图覆盖 11409 纹素、光源趟剔除 192 三角形、主视图 43731 像素、硬阴影 1360 像素（31.1‰）。P 层与 S 层像素缓冲逐字节相同，W 层按声明容差收敛。</description></item><item><title>《计算机图形学》卷二《着色、光照与纹理》目录</title><link>https://plumephp.com/cg-shade-toc/</link><pubDate>Thu, 15 Oct 2026 14:00:00 +0800</pubDate><guid>https://plumephp.com/cg-shade-toc/</guid><description>《计算机图形学》卷二《着色、光照与纹理》目录：16 章 48 节，只替换卷一封版的着色环节——逐顶点 Lambert 改为插值法线后逐像素求值，把光照模型、BRDF 与能量守恒、法线贴图、阴影、环境光遮蔽、微表面 PBR、sRGB 与色调映射、程序化纹理与后处理全部写成可逐像素断言的整数。本页给出分工、六档可运行性口径、卷二新基线与全书 16 章 48 节完整清单。</description></item><item><title>《计算机图形学》卷二《着色、光照与纹理》附录 A · 着色公式、材质参数表与数据集索引</title><link>https://plumephp.com/cg-shade-appendix-a/</link><pubDate>Thu, 15 Oct 2026 14:00:00 +0800</pubDate><guid>https://plumephp.com/cg-shade-appendix-a/</guid><description>《计算机图形学》卷二《着色、光照与纹理》附录 A：全卷共用的 Q16.16 定点常数表（1/π、9/π、3/π）、逐像素层的量级上界推导、六个着色公式的整数形式速查（Lambert、Phong、Blinn-Phong、GGX、Smith、Schlick）、材质参数表、能量守恒残差汇总，以及各章产物的数据集索引与复现命令。所有数字来自本机实跑。</description></item><item><title>1.1 Lambert 与漫反射</title><link>https://plumephp.com/cg-shade-01-1-lambert-diffuse/</link><pubDate>Thu, 15 Oct 2026 14:00:00 +0800</pubDate><guid>https://plumephp.com/cg-shade-01-1-lambert-diffuse/</guid><description>卷一封版了几何到像素的骨架，卷二只换着色环节。本节从 N·L 的几何含义出发，把 Lambert 漫反射写成纯整数点积加一次算术右移：66 个方向实测受光 30、背光 36，去掉 max(0, N·L) 后出现 81 个负通道，而钳制版所有通道落在 [0, 200]。</description></item><item><title>1.2 Phong 与高光</title><link>https://plumephp.com/cg-shade-01-2-phong-specular/</link><pubDate>Thu, 15 Oct 2026 14:00:00 +0800</pubDate><guid>https://plumephp.com/cg-shade-01-2-phong-specular/</guid><description>Phong 高光要构造反射向量 R = 2(N·L)N − L 再算 R·V 的幂次，Blinn-Phong 改用半步向量 H。本节用 66 个观察方向实测两者的叶宽、最大差与运算量，把 x^32 的平方链（5 次 fmul）与 31 次逐次相乘逐位比对，并推翻「Blinn-Phong 不会照亮背面」这句流传很广的话。</description></item><item><title>1.3 着色频率与插值</title><link>https://plumephp.com/cg-shade-01-3-shading-frequency/</link><pubDate>Thu, 15 Oct 2026 14:00:00 +0800</pubDate><guid>https://plumephp.com/cg-shade-01-3-shading-frequency/</guid><description>同一份场景、同一套顶点变换、同一个 Lambert 公式，只把「插值颜色」换成「插值法线再逐像素求值」：覆盖掩码与深度缓冲逐像素相同（几何封版），颜色却有 41261 个像素不同（537.2526‰），MAE 3.5764、PSNR 37.06 dB、最大通道差 48。</description></item><item><title>11.1 时间抗锯齿</title><link>https://plumephp.com/cg-shade-11-1-temporal-antialiasing/</link><pubDate>Thu, 15 Oct 2026 14:00:00 +0800</pubDate><guid>https://plumephp.com/cg-shade-11-1-temporal-antialiasing/</guid><description>时间抗锯齿的全部机制可以压成三个整数：帧间权重 w = ONE//(k+1)、确定性的 Halton 子像素抖动、历史帧的 3×3 邻域裁剪。本节在解析圆盘上实测——静止相机下 1→16 帧的 MAE 从 1.9163 收敛到 0.3881；每帧微动 0.25 px 时，裁剪把重影误差从 9.2405 压到 4.929。</description></item><item><title>11.2 抖动与蓝噪声</title><link>https://plumephp.com/cg-shade-11-2-dithering-blue-noise/</link><pubDate>Thu, 15 Oct 2026 14:00:00 +0800</pubDate><guid>https://plumephp.com/cg-shade-11-2-dithering-blue-noise/</guid><description>抖动不减少量化误差，它把误差从低频的「带状」搬到高频的「噪声」。本节把 0..255 的斜坡量化到 8 级，比较无抖动、Bayer 有序抖动、Floyd–Steinberg 误差扩散与 16×16 蓝噪声：总误差几乎不变，低频带状分量从 6.4844 压到 1.2 上下；蓝噪声更把阈值矩阵的低频功率占比压到同尺寸白噪声的 1/243。</description></item><item><title>11.3 抗锯齿的度量</title><link>https://plumephp.com/cg-shade-11-3-antialias-metric/</link><pubDate>Thu, 15 Oct 2026 14:00:00 +0800</pubDate><guid>https://plumephp.com/cg-shade-11-3-antialias-metric/</guid><description>把「哪个抗锯齿方案更好」写成一条可复算的判据：先用参考解的梯度阈值圈出边缘像素，只在边缘上算 MAE，再配上 PSNR。64×64 圆盘的 296 个边缘像素上，无抗锯齿 → 4 spp SSAA → 8 帧 TAA → 16 spp SSAA 三级判据全部成立，而把覆盖率乘 0.5 的错实现被同一条判据拒绝。</description></item><item><title>13.1 材质的表示与继承</title><link>https://plumephp.com/cg-shade-13-1-material-representation/</link><pubDate>Thu, 15 Oct 2026 14:00:00 +0800</pubDate><guid>https://plumephp.com/cg-shade-13-1-material-representation/</guid><description>材质是六个定点参数而非浮点结构体。继承用不动点松弛解析，与输入顺序无关：叶子 gold_trim_dark 逐字段来源确定，解析 digest 074b01f1… 在打乱输入后不变，自指父指针报错；叶子材质驱动一帧，改被继承字段帧变、改旁系帧不变。</description></item><item><title>13.2 着色变体</title><link>https://plumephp.com/cg-shade-13-2-shader-variants/</link><pubDate>Thu, 15 Oct 2026 14:00:00 +0800</pubDate><guid>https://plumephp.com/cg-shade-13-2-shader-variants/</guid><description>材质的每个开关都让着色器分叉：4 开关理论 16 组合、实际只用 9；8 开关理论 256、实际 23，爆炸比 11.13×。变体键用整数位编码去重，与 frozenset、关键词串去重同数；键漏掉 shadow 位则去重数从 9 塌缩到 7。逐个渲染实际变体，不同键必给不同帧。</description></item><item><title>13.3 材质的数据驱动</title><link>https://plumephp.com/cg-shade-13-3-material-data-driven/</link><pubDate>Thu, 15 Oct 2026 14:00:00 +0800</pubDate><guid>https://plumephp.com/cg-shade-13-3-material-data-driven/</guid><description>一份材质表 JSON 驱动三种宿主：Python 建材质对象、TypeScript 建同构对象、HTML 内联同一条材质。三处解析的六个字段逐字段相同（对账表 S/W/P 三列一致），规范 digest c456c8c1… 两侧相同；改一个字段后帧 digest 与内联值同步变化，四次扰动全部同步。</description></item><item><title>14.1 光源类型与表示</title><link>https://plumephp.com/cg-shade-14-1-light-types/</link><pubDate>Thu, 15 Oct 2026 14:00:00 +0800</pubDate><guid>https://plumephp.com/cg-shade-14-1-light-types/</guid><description>三种光源共用一套光照方向构造与衰减接口：方向光无衰减、点光源 r²/(r²+d²)、聚光再乘锥软化。同一场景下受光像素 959.8‰ / 953.3‰ / 70.1‰；衰减的两种整数写法在 178/1280 个距离上分叉、最大差 1 个 Q16.16，d=range 处恰好 0.5。</description></item><item><title>14.2 光照的批处理与代价</title><link>https://plumephp.com/cg-shade-14-2-light-batching-cost/</link><pubDate>Thu, 15 Oct 2026 14:00:00 +0800</pubDate><guid>https://plumephp.com/cg-shade-14-2-light-batching-cost/</guid><description>点光源衰减改成有限支撑的 (r²−d²)/(r²+d²)，才让「哪些光源影响哪个像素」成为一条整数谓词。两级剔除：逐像素距离阈值 + 16×16 网格分桶。N=64 时循环 3031360→380842、完整求值恒为 72576、两版逐字节相同；代价模型 25702400→4498256 ops（比例 0.1750）。</description></item><item><title>14.3 光照的调试视图</title><link>https://plumephp.com/cg-shade-14-3-light-debug-view/</link><pubDate>Thu, 15 Oct 2026 14:00:00 +0800</pubDate><guid>https://plumephp.com/cg-shade-14-3-light-debug-view/</guid><description>把光照拆成环境 / 漫反射 / 镜面 / 衰减四张灰度图，再加一张合成图。故意把衰减写成 r²/(r²+d)（分母忘了平方），衰减通道 43731/43731 个像素全变、最大差 47042，而环境 / 漫反射 / 镜面三通道逐字节相同——缺陷被精确定位到衰减那一行。</description></item><item><title>15.1 跨语言着色对照</title><link>https://plumephp.com/cg-shade-15-1-cross-language-shading/</link><pubDate>Thu, 15 Oct 2026 14:00:00 +0800</pubDate><guid>https://plumephp.com/cg-shade-15-1-cross-language-shading/</guid><description>同一份场景规格在 Python 与 TypeScript 两条 CPU 路径下产出逐字节相同的像素缓冲。把着色器写成可参数化形式，五个负例各只动一处口径——降精度改用除法、插值后不归一化、逐项钳制、1/π 取 20860、albedo 四舍五入——每个都让 sha256 分叉，七个摘要两两不同，退化档复现卷二基线。</description></item><item><title>15.2 中间缓冲的着色验证</title><link>https://plumephp.com/cg-shade-15-2-intermediate-buffer-verify/</link><pubDate>Thu, 15 Oct 2026 14:00:00 +0800</pubDate><guid>https://plumephp.com/cg-shade-15-2-intermediate-buffer-verify/</guid><description>把逐像素着色器的四张中间缓冲各自单独导出并断言：法线模长落在 [65533, 65537]、albedo 通道在 [70,220]、深度沿单三角形单调、覆盖率与解析解逐像素相同（43731 像素、差异 0）。法线图与 albedo 图编码后的 sha256 由 TypeScript 侧逐字节复现。</description></item><item><title>15.3 偏差的定位方法</title><link>https://plumephp.com/cg-shade-15-3-deviation-localization/</link><pubDate>Thu, 15 Oct 2026 14:00:00 +0800</pubDate><guid>https://plumephp.com/cg-shade-15-3-deviation-localization/</guid><description>给定一张「错了的图」，按二分定位法逐级比对覆盖率、法线、albedo 与最终颜色四张缓冲，把偏差锁到管线的某一段。差异数字本身就是线索：等于覆盖像素数说明逐像素操作出问题，只有几十个说明舍入或常数出问题。五个负例各定位到对应阶段，并对「插值后漏归一化」做一次完整演练，从法线图差异 43731 一路定位到漏掉的那一行。</description></item><item><title>2.1 BRDF 与能量守恒</title><link>https://plumephp.com/cg-shade-02-1-brdf-energy-conservation/</link><pubDate>Thu, 15 Oct 2026 14:00:00 +0800</pubDate><guid>https://plumephp.com/cg-shade-02-1-brdf-energy-conservation/</guid><description>把 BRDF 的半球反射率写成固定的 512 方向整数估计：cosθ_k=(2k+1)/128 是精确有理数、方位只用 {0,±1,±√2/2}，全程无浮点三角函数。∫cosθ dω 的估计逐位等于 π（残差 0），Lambert 能量 65533（999.9542‰），残差 3。</description></item><item><title>2.2 常见 BRDF 的定点化</title><link>https://plumephp.com/cg-shade-02-2-brdf-fixed-point/</link><pubDate>Thu, 15 Oct 2026 14:00:00 +0800</pubDate><guid>https://plumephp.com/cg-shade-02-2-brdf-fixed-point/</guid><description>把 Lambert、Phong、Blinn-Phong 三种 BRDF 写成全整数：1/π=20861，Phong 归一化 9/π=187749，Blinn 归一化 3/π=62583，指数 (R·V)^16 用 4 次平方。实跑能量：Lambert 65533、归一化 Phong 65321、归一化 Blinn 69886（超过 ONE），未归一化 Phong 只 22800。</description></item><item><title>2.3 材质的组合与混合</title><link>https://plumephp.com/cg-shade-02-3-material-blend/</link><pubDate>Thu, 15 Oct 2026 14:00:00 +0800</pubDate><guid>https://plumephp.com/cg-shade-02-3-material-blend/</guid><description>材质的线性混合只要满足不变量 w_A+w_B==ONE 就仍能量守恒（五组权重实测 65533/65479/65426/65373/65321 全 ≤ ONE，权重和 =2·ONE 时涨到 130854）；清漆层朴素相加 78640 越界、按 (1-F) 缩放后 60946 守恒。并用混合材质渲染一帧，跨宿主 sha256 逐字节相同。</description></item><item><title>3.1 法线的变换</title><link>https://plumephp.com/cg-shade-03-1-normal-transform/</link><pubDate>Thu, 15 Oct 2026 14:00:00 +0800</pubDate><guid>https://plumephp.com/cg-shade-03-1-normal-transform/</guid><description>法线不能直接用模型矩阵 M 变换：非均匀缩放 diag(2,1,1) 下 (M·t)·(M·n) 实测 +3.0000 而非 0，改用逆转置 (M⁻¹)ᵀ 后恒为 +0.0000；纯旋转时两者相等，错误只在非均匀缩放下暴露。4096 个单位法线扫描给出归一化后的模长不变量 |n| ∈ [ONE−5, ONE]。</description></item><item><title>3.2 切线空间</title><link>https://plumephp.com/cg-shade-03-2-tangent-space/</link><pubDate>Thu, 15 Oct 2026 14:00:00 +0800</pubDate><guid>https://plumephp.com/cg-shade-03-2-tangent-space/</guid><description>切线空间从三角形的三个顶点位置与三个 UV 解出：标准 UV 下 denom=65536、T=(2,0,0)、B=(0,0,2)，手性 w=-1；把 u 反向令 denom=-65536 后 T 翻成 (-1,0,0)、w 变 +1。相邻面平均出的切线 T_avg=(1,0.5,0) 模长 1.1180、n·T_avg=0.5，Gram-Schmidt 后回到正交单位基。</description></item><item><title>3.3 法线贴图的解压与重建</title><link>https://plumephp.com/cg-shade-03-3-normal-map-reconstruction/</link><pubDate>Thu, 15 Oct 2026 14:00:00 +0800</pubDate><guid>https://plumephp.com/cg-shade-03-3-normal-map-reconstruction/</guid><description>把 32x32 的 8 位法线贴图还原成 128x128 世界法线：解压 n=(v&lt;&lt;17)/255-ONE 后未归一化模长落在 [0.9905,1.0024]，归一化后偏差最大 2，与连续法线夹角最大 0.7753°。W 层用 WebGL2 片元着色器做同一件事，与 S 层按声明容差比对 MAE 0.5068 / PSNR 51.08 dB / 覆盖差异 0‰，负例被同一判据拒绝。</description></item><item><title>5.1 环境光遮蔽</title><link>https://plumephp.com/cg-shade-05-1-ambient-occlusion/</link><pubDate>Thu, 15 Oct 2026 14:00:00 +0800</pubDate><guid>https://plumephp.com/cg-shade-05-1-ambient-occlusion/</guid><description>环境光遮蔽衡量一个点周围半球有多大比例能看见天空，是环境光里最便宜的一阶近似。本节先构造一个能解析求解的最小场景——平面上方悬一个球，正下方那点的遮蔽恰为 1 减去 r/h 的平方——再用一组固定的 64 条整数方向做逐像素数值估计，量出它与解析值的误差、整幅 AO 图的 MAE，最后把 AO 作为乘性项接进着色，并在 TypeScript 侧复现同一张 AO 图。</description></item><item><title>5.2 SSAO 的采样与噪声</title><link>https://plumephp.com/cg-shade-05-2-ssao-sampling-noise/</link><pubDate>Thu, 15 Oct 2026 14:00:00 +0800</pubDate><guid>https://plumephp.com/cg-shade-05-2-ssao-sampling-noise/</guid><description>SSAO 从深度缓冲重建视空间位置与法线，再在半球上撒一组固定方向做遮挡估计。方向集固定会让误差呈低频带纹，把它按一张确定性的 4×4 旋转表逐像素转开，误差被打散成高频噪声，再用 3×3 盒式模糊压回去。本节量出 4/8/16/32/64 采样的收敛曲线、旋转前后的粗糙度，以及模糊对内部像素误差的削减，并在 TypeScript 侧逐字节复现。</description></item><item><title>5.3 环境贴图与球谐</title><link>https://plumephp.com/cg-shade-05-3-envmap-spherical-harmonics/</link><pubDate>Thu, 15 Oct 2026 14:00:00 +0800</pubDate><guid>https://plumephp.com/cg-shade-05-3-envmap-spherical-harmonics/</guid><description>环境贴图把整个天空的入射光存下来，球谐用 9 个系数（L0/L1/L2）把它压成可解析重建的方向函数。本节用整数 Fibonacci 格点做投影，得到 9 个 Q16.16 系数，重建辐照度与直接积分只差 2‰；但太阳圆盘这类高频特征装不进 9 个系数，L2 带被它拉偏，反而在低频背景上引入振铃。</description></item><item><title>6.1 微表面理论</title><link>https://plumephp.com/cg-shade-06-1-microfacet-theory/</link><pubDate>Thu, 15 Oct 2026 14:00:00 +0800</pubDate><guid>https://plumephp.com/cg-shade-06-1-microfacet-theory/</guid><description>微表面理论把镜面反射拆成 D、G、F 三个因子：GGX 分布 D 决定高光形状，Smith 几何项 G 补偿微面互相遮挡，Schlick 菲涅尔 F 决定反射比例。本节在 Q16.16 里把它们写成纯整数，用投影圆盘方向集验证 ∫D(n·h)dω≈1，并量出 alpha=0.25 时镜面波瓣的半高全宽是 40.74 度。</description></item><item><title>6.2 金属度-粗糙度工作流</title><link>https://plumephp.com/cg-shade-06-2-metalness-roughness/</link><pubDate>Thu, 15 Oct 2026 14:00:00 +0800</pubDate><guid>https://plumephp.com/cg-shade-06-2-metalness-roughness/</guid><description>金属度-粗糙度工作流只用两个标量描述一个表面：基础色在绝缘体时是漫反射 albedo、在金属时是镜面 F0，粗糙度平方后映射成 GGX 的 alpha。本节扫过粗糙度 0/0.25/0.5/0.75/1，量出 NDF 峰值从 809 掉到 0.32、半高角从 0.76 度张到 90 度，并说明为什么高光宽度要用 NDF 半高角而不是 BRDF 的半高全宽。</description></item><item><title>6.3 能量守恒的验证</title><link>https://plumephp.com/cg-shade-06-3-energy-conservation-check/</link><pubDate>Thu, 15 Oct 2026 14:00:00 +0800</pubDate><guid>https://plumephp.com/cg-shade-06-3-energy-conservation-check/</guid><description>6.1 的 BRDF 和 6.2 的参数映射都默认反射能量不超过入射能量，但 BRDF 本身给不出这个保证。本节把 ∫f·cosθ·dω≤1 变成一个可跑的整数实验：GGX 各粗糙度的残差表、alpha=1 处的解析锚点 1-ln2、单次弹射丢掉 69.3% 能量、Kulla-Conty 补偿把它补回 1，以及 kD=1-F 为什么守不住掠射角。</description></item><item><title>7.1 线性空间与 sRGB</title><link>https://plumephp.com/cg-shade-07-1-linear-srgb/</link><pubDate>Thu, 15 Oct 2026 14:00:00 +0800</pubDate><guid>https://plumephp.com/cg-shade-07-1-linear-srgb/</guid><description>把 sRGB 传递函数固化成整数查找表：解码表 256 项一次生成后冻结，编码用整数二分在边界表上反查，Python 与 TypeScript 读同一份整数故逐位一致。实测 8 位往返残差 0 灰度级、线性往返最大误差 292 Q16.16，并给出线性段与幂段的分段边界。</description></item><item><title>7.2 色调映射</title><link>https://plumephp.com/cg-shade-07-2-tone-mapping/</link><pubDate>Thu, 15 Oct 2026 14:00:00 +0800</pubDate><guid>https://plumephp.com/cg-shade-07-2-tone-mapping/</guid><description>把 Reinhard、扩展 Reinhard（白点）与 ACES filmic 近似三条色调映射曲线写成全整数，喂同一份《烛影山谷》HDR 辐射度（曝光 6.0 后 max 4.33），实测输出曲线与 8 位直方图：Reinhard 均值 165.89 不裁剪、扩展 Reinhard 裁掉 156 像素、ACES 均值 213.43。</description></item><item><title>7.3 色彩管理的整数化</title><link>https://plumephp.com/cg-shade-07-3-color-management-integer/</link><pubDate>Thu, 15 Oct 2026 14:00:00 +0800</pubDate><guid>https://plumephp.com/cg-shade-07-3-color-management-integer/</guid><description>把 sRGB 接进卷二着色链路并量出代价：8 位量化误差最大 218 Q16.16、均值 40.10，往返不变量残差 0 灰度级；线性域取中点与 sRGB 域取中点最多差 61 灰度级；端到端「线性着色 + 编码」与「直接在 sRGB 域着色」MAE 15.57、PSNR 24.28 dB。</description></item><item><title>8.1 纹理坐标与寻址模式</title><link>https://plumephp.com/cg-shade-08-1-wrap-addressing/</link><pubDate>Thu, 15 Oct 2026 14:00:00 +0800</pubDate><guid>https://plumephp.com/cg-shade-08-1-wrap-addressing/</guid><description>UV 是一对 Q16.16 定点数，落格子就是一次算术右移。本节把 wrap / clamp / mirror / border 四种寻址全做成整数运算——位与、钳位、向下取整的模、越界短路——再用一张自描述纹理把采样结果反查回 texel：64 列里只有 12 列四种模式给出同一结果。</description></item><item><title>8.2 过滤与 mipmap 的构造</title><link>https://plumephp.com/cg-shade-08-2-filter-mipmap-build/</link><pubDate>Thu, 15 Oct 2026 14:00:00 +0800</pubDate><guid>https://plumephp.com/cg-shade-08-2-filter-mipmap-build/</guid><description>从最近邻到三线性：双线性用四个 Q16.16 权重累加后一次 &gt;&gt; 32 降精度；mip 链是逐级 (a+b+c+d) &gt;&gt; 2，奇数尺寸要决定最后一行列是保留还是截断；LOD 用整数位长求 floor(log2)。对 4×4 超采样参考解，最近邻 MAE 54.41、mipmap 14.15、三线性 10.56。</description></item><item><title>8.3 各向异性过滤</title><link>https://plumephp.com/cg-shade-08-3-anisotropic-filtering/</link><pubDate>Thu, 15 Oct 2026 14:00:00 +0800</pubDate><guid>https://plumephp.com/cg-shade-08-3-anisotropic-filtering/</guid><description>像素足迹是 UV 空间的平行四边形，过滤核取它的内切椭圆，半轴比就是各向异性比。本节从 UV 梯度算出椭圆、构造 ripmap，再量 N=1/2/4/8 的采样曲线：MAE 25.99 降到 19.76 且收益递减，ripmap 单次查表 11.00，代价是显存 ×3.88。</description></item><item><title>9.1 值噪声与 Perlin</title><link>https://plumephp.com/cg-shade-09-1-value-noise-perlin/</link><pubDate>Thu, 15 Oct 2026 14:00:00 +0800</pubDate><guid>https://plumephp.com/cg-shade-09-1-value-noise-perlin/</guid><description>站内那篇讲的是大地形 LOD、分块与流式加载的工程实现，本节把噪声函数本身拆成可逐值断言的整数。值噪声与 Perlin 共用同一个整数哈希，只在格点上放标量值还是梯度向量：128×128 实测两者均值 32138 与 98，相邻差分均值 4703.5 与 7464.1，功率谱峰值分别落在第 0 与第 2 个频带。</description></item><item><title>9.2 分形噪声与 fBm</title><link>https://plumephp.com/cg-shade-09-2-fractal-fbm/</link><pubDate>Thu, 15 Oct 2026 14:00:00 +0800</pubDate><guid>https://plumephp.com/cg-shade-09-2-fractal-fbm/</guid><description>单层噪声太规整，fBm 把它叠成分形。本节用整数实现 octaves / lacunarity / gain 三个旋钮，在 0.125 世界单位步长上扫描 1/2/4/8 层：归一化粗糙度 0.0405 → 0.0509 → 0.0714 → 0.0918 单调上升，方差反而从 13653 降到 8481；再做整数域扭曲，看细节被拧成条带。</description></item><item><title>9.3 程序化纹理的整数化</title><link>https://plumephp.com/cg-shade-09-3-procedural-texture-integer/</link><pubDate>Thu, 15 Oct 2026 14:00:00 +0800</pubDate><guid>https://plumephp.com/cg-shade-09-3-procedural-texture-integer/</guid><description>噪声的终点是可用的纹理。本节把 fBm 与距离场组合成云、木纹、石纹三张 64×64 贴图，全部走整数：距离用 fsqrt、环带与脉线用整数取模、颜色是 8 位通道的整数混合。判据是像素缓冲的 sha256——Python 与 TypeScript 合并缓冲同为 4ef471f3…，共 36864 字节逐字节相同。</description></item></channel></rss>