<?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/%E5%87%A0%E4%BD%95%E5%8F%98%E6%8D%A2%E4%B8%8E%E5%85%89%E6%A0%85%E5%8C%96/</link><description>Recent content in 《计算机图形学》卷一《几何、变换与光栅化》· 全书目录与章节索引（50 篇） on PlumePHP</description><generator>Hugo</generator><language>zh-CN</language><lastBuildDate>Sat, 17 Oct 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://plumephp.com/posts/books/%E5%87%A0%E4%BD%95%E5%8F%98%E6%8D%A2%E4%B8%8E%E5%85%89%E6%A0%85%E5%8C%96/index.xml" rel="self" type="application/rss+xml"/><item><title>14.3 中间缓冲的可视化</title><link>https://plumephp.com/cg-raster-14-3-intermediate-buffer-visualization/</link><pubDate>Thu, 15 Oct 2026 11:30:00 +0800</pubDate><guid>https://plumephp.com/cg-raster-14-3-intermediate-buffer-visualization/</guid><description>四张调试缓冲不该各写各的导出代码。本节把它们收进一个统一导出器：每张图写出 8 位 PNG、一份 sha256、一条「回读像素 == 内存缓冲」断言，再用纯 xml.etree 拼一张内嵌 base64 的 SVG 联系表，最后用 ET.fromstring 回读校验结构与内嵌字节。</description></item><item><title>14.2 覆盖率与线框</title><link>https://plumephp.com/cg-raster-14-2-coverage-wireframe/</link><pubDate>Thu, 15 Oct 2026 11:20:00 +0800</pubDate><guid>https://plumephp.com/cg-raster-14-2-coverage-wireframe/</guid><description>二值覆盖掩码只回答「涂过没有」，调试要问「涂了几次」。本节把覆盖率存成整数计数，用双重计数与二值化基线两条不变量把它钉住；线框复用第 7 章的整数 Bresenham 只描正面三角形，并在浏览器里用加法混合让 GPU 独立算出同一份计数，再逐像素对齐。</description></item><item><title>14.1 深度图与法线图</title><link>https://plumephp.com/cg-raster-14-1-depth-normal-buffer/</link><pubDate>Thu, 15 Oct 2026 11:10:00 +0800</pubDate><guid>https://plumephp.com/cg-raster-14-1-depth-normal-buffer/</guid><description>深度缓冲不是距离，直接 gray = z*255/ONE 会把整帧压进 20 个灰度级、闲置 236 级。本节先把这个浪费量化，再用按距离等分的 8x32 分段映射把每级钉在 0.157 世界单位；法线图由插值后的顶点法线编码进 RGB，两条负例必须被模长判据拒绝。</description></item><item><title>10.3 画家算法与深度排序</title><link>https://plumephp.com/cg-raster-10-3-painter-sort/</link><pubDate>Thu, 15 Oct 2026 11:00:00 +0800</pubDate><guid>https://plumephp.com/cg-raster-10-3-painter-sort/</guid><description>画家算法不逐像素做深度测试，只把三角形按质心深度从远到近画、后画者胜。本节在可分离场景里让画家与 z-buffer 逐字节相同，在相交场景里让它们出现 63 个差异像素，并说清差异的来源是质心排序在交叉处判错了局部前后。脚本用「深度 = 绘制序号的相反数」把画家算法搭在共享光栅化器上。</description></item><item><title>8.3 屏幕空间裁剪</title><link>https://plumephp.com/cg-raster-08-3-screen-space-clipping/</link><pubDate>Thu, 15 Oct 2026 10:50:00 +0800</pubDate><guid>https://plumephp.com/cg-raster-08-3-screen-space-clipping/</guid><description>只裁近平面时投影坐标会飞出视口 64 倍，整数包围盒加剪刀矩形把扫描窗口压回视口且逐字节不改像素；保护带 G=0 就能让 80.7% 的三角形免裁，G=256 提到 93.4%。本节实测原始包围盒 4922869 单元、夹紧后 244708、扫描 223753 单元覆盖 43730 像素。</description></item><item><title>8.2 近平面裁剪与多边形重建</title><link>https://plumephp.com/cg-raster-08-2-near-plane-reconstruction/</link><pubDate>Thu, 15 Oct 2026 10:40:00 +0800</pubDate><guid>https://plumephp.com/cg-raster-08-2-near-plane-reconstruction/</guid><description>近平面裁剪会把三角形裁成四边形甚至五边形，重建它靠的是扇形三角化的整数恒等式：三个扇形三角形的面积和精确等于多边形面积，逆序则精确变号。本节实测英雄三角形 3→4→5 的逐步计数、面积比恰为 t^2 = 1/4 的解析解，以及「丢弃 vs 裁剪」两帧覆盖异或为 0 而颜色差 171。</description></item><item><title>10.2 深度冲突与逆转 z</title><link>https://plumephp.com/cg-raster-10-2-zfighting-reversed-z/</link><pubDate>Thu, 15 Oct 2026 10:30:00 +0800</pubDate><guid>https://plumephp.com/cg-raster-10-2-zfighting-reversed-z/</guid><description>两个几乎重合的面若在深度缓冲里落进同一格，深度测试就分不出前后，像素随视角抖动——这就是深度冲突。本节用两块相距 13/65536 的平行墙，把朴素线性 z、标准透视 z、逆转 z 三种映射的冲突像素数摆在一起，解释逆转 z 为何要把深度测试从 &lt; 翻成 &gt;，并如实说明定点缓冲与浮点缓冲下它的差别。</description></item><item><title>8.1 视锥裁剪</title><link>https://plumephp.com/cg-raster-08-1-frustum-clipping/</link><pubDate>Thu, 15 Oct 2026 10:30:00 +0800</pubDate><guid>https://plumephp.com/cg-raster-08-1-frustum-clipping/</guid><description>视锥六个面在视图空间解析写成四条整数系数，与投影矩阵同源；Sutherland–Hodgman 的交点用 fdiv 定标、算术右移降精度，于是面积守恒成为精确整数恒等式。本节实测六平面系数、487 个顶点的分类、英雄三角形 3 裁成 5 的逐步计数，以及裁剪前后两帧覆盖异或为 0。</description></item><item><title>7.3 线宽与直线抗锯齿</title><link>https://plumephp.com/cg-raster-07-3-line-width-antialias/</link><pubDate>Thu, 15 Oct 2026 10:20:00 +0800</pubDate><guid>https://plumephp.com/cg-raster-07-3-line-width-antialias/</guid><description>线宽不能用开方算距离：把 d &lt;= r 两边平方，得到一条纯整数的覆盖判据 cross^2 &lt;= r^2*|AB|^2，端帽用最近端点的距离平方兜底。本节实测五个线宽的覆盖数、水平与竖直的对称性，并用 N x N 子样本把覆盖率收敛到解析面积 194514 千分像素^2。</description></item><item><title>7.2 直线光栅化的误差界</title><link>https://plumephp.com/cg-raster-07-2-line-error-bound/</link><pubDate>Thu, 15 Oct 2026 10:10:00 +0800</pubDate><guid>https://plumephp.com/cg-raster-07-2-line-error-bound/</guid><description>半像素误差界可以写成一条不含除法的整数判据：2*|k*major - i*minor| &lt;= major。本节在 89439 个采样点上穷举验证：Bresenham 与半像素 DDA 的实测 max|e| 恰好是 0.5 像素，floor 取整的 DDA 有 1922 组越界；界在 651 组上被恰好达到，说明它已不能再收紧。</description></item><item><title>《计算机图形学》卷一《几何、变换与光栅化》目录</title><link>https://plumephp.com/cg-raster-toc/</link><pubDate>Thu, 15 Oct 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/cg-raster-toc/</guid><description>《计算机图形学》卷一《几何、变换与光栅化》目录：16 章 48 节，把渲染从 API 调用还原成可算的整数——Q16.16 定点顶点变换、整数边函数覆盖判定、定点重心插值、深度缓冲、裁剪、抗锯齿与纹理映射全部定点实现，让 Python 与 TypeScript 产出逐字节相同的 PNG。本页给出与站内既有内容的分工、六档可运行性口径、《烛影山谷》场景总览与全书 16 章 48 节完整清单。</description></item><item><title>1.1 从场景到像素</title><link>https://plumephp.com/cg-raster-01-1-scene-to-pixel/</link><pubDate>Thu, 15 Oct 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/cg-raster-01-1-scene-to-pixel/</guid><description>渲染一帧到底发生了什么？本节把整条链路压成顶点变换、三角形组装、光栅化、逐像素着色四步，用一份 config/scene_spec.json 跑出 487 顶点、896 三角形、43731 个覆盖像素并落盘一张 PNG；每一步都只用整数与定点，为后面三种宿主消费同一份规格打下地基。</description></item><item><title>1.2 场景规格的字段</title><link>https://plumephp.com/cg-raster-01-2-scene-spec-fields/</link><pubDate>Thu, 15 Oct 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/cg-raster-01-2-scene-spec-fields/</guid><description>config/scene_spec.json 有 31 个必填字段，分布在渲染参数、相机、两盏光源、地形与球体五组里。本节逐组讲清每个字段的量纲与取值范围，给出纯 Python 的 schema 校验脚本，断言所有数值字段都是整数、Q16.16 落在安全区间内，并用一份被污染的规格证明这套判据会拒绝它。</description></item><item><title>1.3 最小渲染器的骨架</title><link>https://plumephp.com/cg-raster-01-3-minimal-renderer-skeleton/</link><pubDate>Thu, 15 Oct 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/cg-raster-01-3-minimal-renderer-skeleton/</guid><description>1.1 的脚本能用，但四步糊在一个 main 里。本节把它重构成规格、几何、屏幕坐标、像素四段，每段一个有名字、可单独调用的函数，再串起来渲染《烛影山谷》的第一帧并逐段计时；同时说明 S 层与 P 层如何共用同一份规格，做到像素缓冲逐字节相同。</description></item><item><title>10.1 深度缓冲的精度分布</title><link>https://plumephp.com/cg-raster-10-1-depth-precision-distribution/</link><pubDate>Thu, 15 Oct 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/cg-raster-10-1-depth-precision-distribution/</guid><description>深度缓冲内部只有 65537 个刻度，一个刻度值多少世界距离却随距离按 D² 增长。本节从 5.3 的相机量程视角切回缓冲内部，量化 Q16.16 的最小可分辨深度差、塌陷距离与误差传播，再看逐像素定点插值的截断误差如何沿距离放大，并让 Python 与 TypeScript 两份实现逐字节对齐。</description></item><item><title>11.1 采样定理与走样</title><link>https://plumephp.com/cg-raster-11-1-sampling-aliasing/</link><pubDate>Thu, 15 Oct 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/cg-raster-11-1-sampling-aliasing/</guid><description>渲染的本质是把连续场景采样成离散像素。本节用 256×256 的整数波带片与周期 3 斜条纹，把「点采样把高频折回低频」的走样复现出来，再用整数方差把摩尔纹量成可断言的数字；Nyquist 边界上周期 2 的条纹会塌成一个常数，判据在 Python 与 TypeScript 间逐字节复现。</description></item><item><title>11.2 超采样与覆盖率</title><link>https://plumephp.com/cg-raster-11-2-supersampling-coverage/</link><pubDate>Thu, 15 Oct 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/cg-raster-11-2-supersampling-coverage/</guid><description>把像素切成 N×N 个小格，覆盖率就是落在三角形内的子样本数——0 到 N² 的整数计数。本节用一个斜边三角形，把 2×2 与 4×4 超采样的覆盖率、整数颜色混合与误差随 N 的下降全部写成可断言整数，并与 TypeScript 逐字节对齐。</description></item><item><title>11.3 MSAA 的 CPU 实现</title><link>https://plumephp.com/cg-raster-11-3-msaa-cpu/</link><pubDate>Thu, 15 Oct 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/cg-raster-11-3-msaa-cpu/</guid><description>MSAA 只在覆盖上多采样、着色一次。本节用 8 片带深度的叶片，把每像素 4 个子样本各自做覆盖与深度测试再按覆盖平均的 CPU 实现写出来，并让浏览器 WebGL2 用 4 遍平移渲染做同一件事，按 MAE/PSNR/覆盖归属三条容差判据对上，且负例必被拒绝。</description></item><item><title>12.1 UV 与纹理坐标</title><link>https://plumephp.com/cg-raster-12-1-uv-texture-coords/</link><pubDate>Thu, 15 Oct 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/cg-raster-12-1-uv-texture-coords/</guid><description>纹理在显存里是一张二维表，UV 就是把这张表贴到三角形上的那套坐标。本节把 uv 也做成 Q16.16 定点数，用整数移位把连续坐标落到具体 texel，并实现 repeat / clamp / mirror 三种寻址——它们分别是位与、钳位与向下取整的模。纹理不引入任何第三方素材，由整数棋盘与渐变程序化生成。</description></item><item><title>12.2 透视校正插值</title><link>https://plumephp.com/cg-raster-12-2-perspective-correct/</link><pubDate>Thu, 15 Oct 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/cg-raster-12-2-perspective-correct/</guid><description>顶点上的 UV 直接线性插值到像素是错的：透视投影下屏幕坐标是 x/w，属性在屏幕空间不再线性。正确做法是插值 u/w 与 1/w 再相除。本节在一块近远端 w 相差 2.57 倍的后仰四边形上把两条路径都跑一遍，量出 1923 个像素不同、最大通道偏差 180，再让 WebGL2 用同一份场景复现。</description></item><item><title>12.3 纹理过滤与 mipmap</title><link>https://plumephp.com/cg-raster-12-3-filtering-mipmap/</link><pubDate>Thu, 15 Oct 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/cg-raster-12-3-filtering-mipmap/</guid><description>纹理被缩小时，一个像素覆盖多个 texel，采其中一个必然走样。解法是预先造好一整串减半的 mip 链，再按屏幕足迹选级。本节用整数盒式平均构造 32→1 的六级链，用 uv 的有限差分算出每像素 LOD，量出最近邻、双线性与 mip 三种过滤的差异，并用「选错一级」的负例验证判据确实有区分力。</description></item><item><title>13.1 定点与浮点的分歧</title><link>https://plumephp.com/cg-raster-13-1-fixed-versus-float/</link><pubDate>Thu, 15 Oct 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/cg-raster-13-1-fixed-versus-float/</guid><description>把同一份《烛影山谷》规格分别喂给 Q16.16 定点管线与 float64 镜像管线：矩阵链最大元素差 5.007e-04，132/487 个顶点的屏幕坐标或深度不同；给定同一条整数坐标时两种光栅化器的像素缓冲逐字节相同，端到端则分歧 153 个像素并给出位置分布与通道差直方图。</description></item><item><title>13.2 边函数规则的整数化</title><link>https://plumephp.com/cg-raster-13-2-edge-rule-integer/</link><pubDate>Thu, 15 Oct 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/cg-raster-13-2-edge-rule-integer/</guid><description>把 GPU 的 top-left rule 写成纯整数判据：有向边 A→B 拥有其边界样本当且仅当 dy&lt;0 或 dy==0 且 dx&gt;0。用顶点落在像素角上的正方形隔离共享边变量，实测 3x3 网格下 top-left 让共享边像素恰好被一个三角形认领（认领合计=并集=144、重复 0、最大认领 1），而 naive `&gt;= 0` 重复 36 个像素。</description></item><item><title>13.3 跨语言逐位一致的验证</title><link>https://plumephp.com/cg-raster-13-3-cross-language-bit-exact/</link><pubDate>Thu, 15 Oct 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/cg-raster-13-3-cross-language-bit-exact/</guid><description>把定点管线写成可参数化形式：baseline 复现 S 层金标准 sha256，再把 `&gt;&gt;` 换成向零截断、把截断除法换成 floor 除法、把子像素位数 6 改成 5，三类扰动各给出一个不同的 sha256（覆盖 43730 / 43734 / 43731，分歧像素 153 / 173 / 646），并由 TypeScript 侧逐字节复现全部四个摘要。</description></item><item><title>15.1 程序化网格生成</title><link>https://plumephp.com/cg-raster-15-1-procedural-mesh/</link><pubDate>Thu, 15 Oct 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/cg-raster-15-1-procedural-mesh/</guid><description>从《烛影山谷》的两类几何出发，推导八面体细分球的顶点数解析式 V = 4^(d+1) + 2 与地形格点数 (gridN+1)^2，用整数哈希噪声加双线性与 smoothstep 造起伏、顶点色按高度插值，最后把整场景几何序列化成小端 int32 缓冲取 sha256 与 TypeScript 逐字节对照。</description></item><item><title>15.2 网格的表示与加载</title><link>https://plumephp.com/cg-raster-15-2-mesh-representation/</link><pubDate>Thu, 15 Oct 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/cg-raster-15-2-mesh-representation/</guid><description>索引顶点缓冲与独立三角形表示的字节账：subdiv=2 的球索引存 66*12+128*12=2328 字节、独立三角形存 384*12=4608 字节，差 2280；再用 (x,y,z) 定点三元组整数去重把 384 个顶点槽压回 66 个，并用小端 int32 缓冲回读验证逐字节相同。</description></item><item><title>15.3 场景图与遍历</title><link>https://plumephp.com/cg-raster-15-3-scene-graph-traversal/</link><pubDate>Thu, 15 Oct 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/cg-raster-15-3-scene-graph-traversal/</guid><description>场景图的层级变换合成与遍历序语义：world = 父 * 子 的顺序如何决定叶子落点（同一原点在 T·S 与 S·T 下分别落到 x = 1.5 与 x = 2.0），以及遍历序在不交叠场景逐字节相同、部分交叠场景差 72 个像素、完全重合时差异像素数等于覆盖像素数。</description></item><item><title>16.1 光栅化管线的装配</title><link>https://plumephp.com/cg-raster-16-1-raster-pipeline-assembly/</link><pubDate>Thu, 15 Oct 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/cg-raster-16-1-raster-pipeline-assembly/</guid><description>把前 15 章的环节串成一条完整管线：顶点变换、近平面剔除、屏幕映射、三角形装配、背面剔除、边函数覆盖、重心插值、深度测试、像素输出。逐级给出输入输出契约与定点不变量，断言 w 恒等式与重心权重和，并让串联后的成片 sha256 与卷一基线逐字节一致。</description></item><item><title>16.2 三种消费的联调</title><link>https://plumephp.com/cg-raster-16-2-three-host-integration/</link><pubDate>Thu, 15 Oct 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/cg-raster-16-2-three-host-integration/</guid><description>同一份 config/scene_spec.json 分别喂给 S 层 Python 定点软光栅化、P 层 TypeScript 定点内核与 W 层浏览器 WebGL2：S 与 P 逐字节相同，S 与 W 按 MAE、PSNR、覆盖归属三条声明容差比对，并让片元颜色 ×0.5 的负例被同一判据拒绝。</description></item><item><title>16.3 交付卷二</title><link>https://plumephp.com/cg-raster-16-3-deliverable-handoff-volume2/</link><pubDate>Thu, 15 Oct 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/cg-raster-16-3-deliverable-handoff-volume2/</guid><description>把规格里的分辨率、FOV、子像素位数与三角形数量四条轴分别拧出基线区间：给出走样阈值、相变阈值与每一档的代价曲线，并说明子像素位数是规格契约而非精度旋钮；四条轴的每一档摘要都由 TypeScript 侧逐字节复现，B 档越界只告警不中断，判据稳定可复跑。</description></item><item><title>2.1 向量运算的定点化</title><link>https://plumephp.com/cg-raster-02-1-vector-fixed-point/</link><pubDate>Thu, 15 Oct 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/cg-raster-02-1-vector-fixed-point/</guid><description>本节把向量的加、减、点积、叉积搬进 Q16.16 定点整数：加减是同分母整数运算故逐位精确，乘积必须右移 16 降精度。我们用同一套确定性向量在 Python 与 TypeScript 下算出逐位相同的点积与叉积并以 sha256 锁定，最后给出点积误差恒落在 [0,3) ulp 的实测上界。</description></item><item><title>2.2 点与向量的区别</title><link>https://plumephp.com/cg-raster-02-2-point-versus-vector/</link><pubDate>Thu, 15 Oct 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/cg-raster-02-2-point-versus-vector/</guid><description>齐次坐标里 w=1 是点、w=0 是向量，这一位之差决定了平移矩阵对谁生效。本节用可跑的例子演示点减点得向量、点加向量得点、向量加向量仍是向量，并逐条给出断言；最后把点当向量按 w=0 变换，展示平移项如何被乘 0 抹掉，以及模型为何飘不动。</description></item><item><title>2.3 齐次坐标与投影</title><link>https://plumephp.com/cg-raster-02-3-homogeneous-coordinates/</link><pubDate>Thu, 15 Oct 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/cg-raster-02-3-homogeneous-coordinates/</guid><description>透视投影的裁剪空间坐标是齐次的，w 来自投影矩阵第 4 行（即相机前方的距离），透视除法就是拿它去除 x、y、z。本节讲清 w 的来源与除法的意义，给出 NDC 到屏幕 Q6 的定点映射，并用一个小场景验证相机后方 w&lt;=0 的点必须被拒绝。</description></item><item><title>3.1 模型矩阵</title><link>https://plumephp.com/cg-raster-03-1-model-matrix/</link><pubDate>Thu, 15 Oct 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/cg-raster-03-1-model-matrix/</guid><description>从平移、旋转、缩放的 4x4 齐次形式出发，解释复合变换为何不可交换，给出「先缩放、再旋转、再平移」的 Q16.16 定点实现并断言它与逐点手算逐项一致，再用实测数据说明矩阵乘的中间量为何超过 32 位、JavaScript 侧必须改用 BigInt。</description></item><item><title>3.2 视图矩阵</title><link>https://plumephp.com/cg-raster-03-2-view-matrix/</link><pubDate>Thu, 15 Oct 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/cg-raster-03-2-view-matrix/</guid><description>推导 lookAt 的三个正交基 f/s/u 与平移项的来历，说明视图矩阵为何是相机世界变换的逆，用可跑的定点脚本验证世界原点在视图空间的位置等于相机位置取反后再旋转，并给出视线与 up 平行时叉积退化为零向量、矩阵奇异时的应对与拦截办法。</description></item><item><title>3.3 投影矩阵与 MVP 合成</title><link>https://plumephp.com/cg-raster-03-3-projection-matrix-mvp/</link><pubDate>Thu, 15 Oct 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/cg-raster-03-3-projection-matrix-mvp/</guid><description>逐项推导透视投影矩阵的来历，含 (far+near)/(near-far) 与 2·far·near/(near-far) 的定点化；说明 MVP = P·V·M 的合成顺序与深度归一化到 [0, ONE] 的映射，并给出完整一帧渲染，断言 Python 与 TypeScript 的像素缓冲 sha256 完全相同。</description></item><item><title>4.1 旋转矩阵与欧拉角</title><link>https://plumephp.com/cg-raster-04-1-rotation-euler-angles/</link><pubDate>Thu, 15 Oct 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/cg-raster-04-1-rotation-euler-angles/</guid><description>在 config 禁浮点的前提下用纯整数造定点正弦表：嵌套泰勒构造四分之一波表、查表加线性插值、二分查表求反三角，再用它搭出绕 x/y/z 三轴的旋转矩阵，断言 sin²+cos²=ONE 与正交性在声明容差内成立，并量化欧拉角 ZYX 与 XYZ 的顺序差异。</description></item><item><title>4.2 四元数与万向节死锁</title><link>https://plumephp.com/cg-raster-04-2-quaternion-gimbal-lock/</link><pubDate>Thu, 15 Oct 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/cg-raster-04-2-quaternion-gimbal-lock/</guid><description>把万向节死锁从口号变成三个可断言的数字：世界角速度 Jacobian 行列式 -cosβ 在 β=90° 归零、α 与 γ 的旋转轴从垂直变成反向共线、参数走一样远世界朝向却不动或转 180° 的死区；再给出整数四元数的表示、Hamilton 乘法与旋转，说明它为何不退化。</description></item><item><title>4.3 朝向的插值</title><link>https://plumephp.com/cg-raster-04-3-orientation-interpolation/</link><pubDate>Thu, 15 Oct 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/cg-raster-04-3-orientation-interpolation/</guid><description>把 nlerp 与 slerp 的差别量化：nlerp 走弦、速度不均（170° 行程逐帧步长 max/min=1.784），slerp 走大圆弧、恒定角速度（max/min=1.004）；演示四元数双覆盖——q 与 -q 同朝向，不取最短路径会绕 350° 远路，并给出全整数插值实现与端点、单调性断言。</description></item><item><title>5.1 针孔相机模型</title><link>https://plumephp.com/cg-raster-05-1-pinhole-camera-model/</link><pubDate>Thu, 15 Oct 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/cg-raster-05-1-pinhole-camera-model/</guid><description>从小孔成像推出针孔相机模型，把 scene_spec.json 的 eyeQ16/targetQ16/upQ16/tanHalfFovYQ16/nearQ16/farQ16 换算成位置、视场角与等效焦距，用定点投影验证「同一物体距离翻倍、屏幕尺寸减半」这条不变量，并给出 Python 与 TypeScript 两侧逐位相同的屏幕高度。</description></item><item><title>5.2 透视与正交投影</title><link>https://plumephp.com/cg-raster-05-2-perspective-orthographic/</link><pubDate>Thu, 15 Oct 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/cg-raster-05-2-perspective-orthographic/</guid><description>逐项推导透视与正交两个投影矩阵：透视最后一行 (0,0,-1,0) 让 w=-z_view 随深度变化、片元要除以 w，正交最后一行 (0,0,0,1) 让 w 恒为 1、不做透视除法。用同一场景分别渲染两帧并量化覆盖率与深度分布差别，说明正交为何在工程制图里仍然有用。</description></item><item><title>5.3 视锥与近远平面</title><link>https://plumephp.com/cg-raster-05-3-frustum-near-far/</link><pubDate>Thu, 15 Oct 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/cg-raster-05-3-frustum-near-far/</guid><description>视锥六平面的解析构造与近远平面：从 MVP 直接抽出六平面并用 45 个采样点核对判定，解释近平面不能取 0（深度值会塌到 1），用纯 xml.etree 生成 depth(D)=far/(far-near)·(1-near/D) 的精度分布 SVG，量化给出首个倍程独占约 503‰ 深度量程的结论。</description></item><item><title>6.1 边函数与覆盖判定</title><link>https://plumephp.com/cg-raster-06-1-edge-function-coverage/</link><pubDate>Thu, 15 Oct 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/cg-raster-06-1-edge-function-coverage/</guid><description>从整数边函数 E(A,B,P) 的「有向面积 2 倍」含义出发，推出三个边函数同号即在三角形内；实测屏幕空间 y 向下时 area &gt; 0 对应的环绕方向、Q6 子像素精度与像素中心取法，并用子像素扰动实验区分恒等实现，最后看 `&gt;= 0` 如何让共享边像素被重复认领。</description></item><item><title>6.2 重心坐标与插值</title><link>https://plumephp.com/cg-raster-06-2-barycentric-interpolation/</link><pubDate>Thu, 15 Oct 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/cg-raster-06-2-barycentric-interpolation/</guid><description>把 6.1 的三条边函数归一化就得到重心坐标：权重 w0/w1/w2 是像素对三个顶点的贡献比例。本节证明不变量 w0+w1+w2 恒等于面积（定点残差严格为 0），用权重线性插值颜色与深度，说清分子非负时 Python 的 `//` 与截断除同义，最后让 TypeScript 复现出逐字节相同的像素缓冲。</description></item><item><title>6.3 深度插值与 z-buffer</title><link>https://plumephp.com/cg-raster-06-3-depth-zbuffer/</link><pubDate>Thu, 15 Oct 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/cg-raster-06-3-depth-zbuffer/</guid><description>多个三角形覆盖同一个像素时，谁的颜色留下由深度测试决定。本节把 6.2 插出的深度送进 z-buffer，说清严格 `&lt;` 与 `&lt;=` 的差别：前者让共享边像素的归属由绘制顺序决定——这不是「与顺序无关」，只是把赢家换成先画的那个；再用一份 64×48 场景让 WebGL2 与 CPU 定点内核对照，并给出必被拒绝的负例。</description></item><item><title>7.1 DDA 与 Bresenham</title><link>https://plumephp.com/cg-raster-07-1-dda-bresenham/</link><pubDate>Thu, 15 Oct 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/cg-raster-07-1-dda-bresenham/</guid><description>直线的光栅化先要把方向折进一个八分圆，再决定每一步的取整语义：floor 会系统性偏下并漏掉终点，半像素偏置才落到最近像素。本节用定点 DDA 与整数 Bresenham 扫过 2079 组斜率，量出两者的分歧只出现在平局且步长无截断的 129 组，并用覆盖掩码的 sha256 把 Python 与 TypeScript 逐字节对齐。</description></item><item><title>9.1 环绕顺序与法线朝向</title><link>https://plumephp.com/cg-raster-09-1-winding-normal-orientation/</link><pubDate>Thu, 15 Oct 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/cg-raster-09-1-winding-normal-orientation/</guid><description>屏幕空间边函数 E(A,B,C) 的符号就是三角形的朝向。本节在《烛影山谷》的 896 个三角形上实测 606 正面、290 背面、0 退化，与光栅化器剔除的 290 完全一致；再证明世界空间几何法线与视线方向的点积是同一条判据，并用 det&lt;0 的镜像矩阵说明手性反转时法线必须跟着翻。</description></item><item><title>9.2 剔除的判定与代价</title><link>https://plumephp.com/cg-raster-09-2-cull-test-cost/</link><pubDate>Thu, 15 Oct 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/cg-raster-09-2-cull-test-cost/</guid><description>背面剔除的判定只是一次整数符号比较，可它省下的到底是什么？本节把代价拆成像素测试数与覆盖像素数两笔，实测 896 个三角形下测试数从 161448 降到 140493（省 129‰），覆盖集合分毫不变，而地形这类开曲面在掠射处仍有 2477 个像素会因剔除而换色。</description></item><item><title>9.3 双面材质</title><link>https://plumephp.com/cg-raster-09-3-two-sided-material/</link><pubDate>Thu, 15 Oct 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/cg-raster-09-3-two-sided-material/</guid><description>开曲面没有厚度：从背面看，一块 4x4 的布帘 32 个三角形全是背面，单面渲染得到一张空图。双面材质的做法不是不剔除，而是把背面三角形的几何法线取反再着色；本节实测单趟与两遍渲染逐字节相同，并给出「忘了取反」的指纹——背面图像恰好是正面图像的左右镜像。</description></item><item><title>附录 A 场景规格字段表、定点约定与数据集索引</title><link>https://plumephp.com/cg-raster-appendix-a/</link><pubDate>Thu, 15 Oct 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/cg-raster-appendix-a/</guid><description>《计算机图形学》卷一附录 A：scene_spec.json 的 71 个字段全表（相机、方向光、点光源、地形、球体、渲染参数，全部为整数）、Q16.16 与 Q6 子像素的定点约定、四条舍入铁律、定点不变量清单、两条一致性纪律的判据表，以及全书数据集索引与一个可跑的定点约定自检脚本。</description></item></channel></rss>