11.2 亮度分布与对比度
暗色主题的调色板几乎全落在低亮度区,文字能不能读只剩对比度这一根拐杖。本节用与卷一 ch4 同源的 WCAG ×10 整数口径,算分级后 token 的相对亮度千分比、亮度分带直方图与相邻亮度阶梯的最小间隔,并从只读真源取对比度下限,逐对检查暗色调色板是否达标。
tag
暗色主题的调色板几乎全落在低亮度区,文字能不能读只剩对比度这一根拐杖。本节用与卷一 ch4 同源的 WCAG ×10 整数口径,算分级后 token 的相对亮度千分比、亮度分带直方图与相邻亮度阶梯的最小间隔,并从只读真源取对比度下限,逐对检查暗色调色板是否达标。
暗黑与恐怖的第一步不是换色相,而是把整块调色板压饱和度。本节从 retro-cyber 的暗色档出发,用整数地板除做分级:灰值加权和加按等级往灰值收,算出每个 token 分级前后的饱和度千分比与四个等级的平均饱和度,并让 Python 与 TypeScript 各自复算、逐位对齐。
前两节把二次元里能写成数据的部分写完了:色彩、线色、色阶带、头身比、面部特征线。剩下的那一半——画质——本机根本做不了。本节整节标 X,逐条说明它为什么不可复现,并把「不许给不可复现的东西编一个数字」写成一条会失败的门禁:声明表里只要出现一个测量值字段,测试立刻报错。
10.1 管的是颜色与线宽,这一节管结构:角色的头身比、头高与全身高、面部三条特征线(眼 / 鼻 / 嘴)在头部框内的相对位置、双眼加眼距占头宽的比例,全部是整数。本节把它们落成一份 D 层比例表与一段可跑的 TypeScript 校验器,头身比恒等式与面部顺序都会被断言。
二次元的「好看」几乎全在画师手上,但色彩与线条里仍有一半能写成整数:角色色的饱和度上限与明度下限、色阶带的档数与档间明度差、线宽区间,以及线色不许近似纯黑、不许近似中性灰、色相必须落在冷色带内。本节把这些落成一份 D 层规范与一段可跑的 TypeScript 校验器,并说清本章为什么只走 D+P+X。
距离矩阵回答「哪两套最像」,但项目要选的是「最合约束的那套」。本节把风格选择写成一笔可算的账:四道硬门槛(对比度 / 可区分 / 细节上限 / 明度下限)先过滤,过关者再按与项目目标向量的加权 L1 距离排序,预算内取最近者。结果是 cozy-clean,拟合度 969,比第二名近 136。
1.1 给了六个主题的五维向量,本节把它铺成一张 6×6 的风格距离矩阵:用声明权重 [2,2,1,3,3] 的加权 L1 整数均值再 ×10,判据是下限 800。15 对全部高于下限,最近一对 lowpoly/cozy-clean 是 1002;摘要指纹与卷二 16.2 独立复算逐位相同,这就是「同源但可区分」。
风格能不能被量成几个数?本节把第一卷的五维风格向量拆回人话——色彩(明度中位数 / 饱和度均值 / 色相跨度)、形状(描边占比)、细节(细节密度)三个可测维度,并做一次消融对照:只用色彩三维时最近一对会掉到可区分下限以下,补上形状与细节才恢复,这正是「三个维度一个都不能少」的整数证据。
本节不是内容而是边界:第 8 章只讲骨骼数、调色板上限与蒙皮数据字节账,蒙皮矩阵数学、硬件 uniform 上限成因、骨骼贴图显存机制一律外链。把「什么归本章讲」编码成一张可断言的路由表——external 在前、this-book 在后,首个命中胜出;三条外链路径两两不同且全部在 public/ 产物中存在。
LOD 切换那一帧的跳变不是玄学。同一段相机轨迹下,单阈值选级在阈值附近抖了 17 次,双阈值迟滞只切 1 次;相邻级的误差跳变里,LOD2 到 LOD3 的 75 千分比超过 60 的上限,被门禁判违例。本节把「切几次」与「跳多大」都变成整数账。
屏幕占比是一屏三角预算的分配依据。本节用整数针孔相机把距离换算成占比千分比,按阈值表逐实例选级,把一屏 12 件家具的三角数合计到 1072,与 1200 的帧预算对账;并算出「全部拉到 LOD0」的最坏视角会爆到 3024,说明预算必须按最坏视角算。
LOD 不是「离远了换低模」一句话,而是一张分级表加一个能算的误差指标。本节把家具轮廓归一化到规范轮廓,用整数 shoelace 逐级算面积损失千分比,给出 4 级 LOD 链的误差账,并由 P 层 TS 内核复算,两侧逐位一致,全程整数可复现。
本节不是内容而是边界:第 6 章只讲参数表与默认值、参数对齐与打包,着色器编译、变体爆炸、渲染管线原理一律外链给 graphics 专题。把「什么归本章讲」编码成一张可断言的路由表——external 规则在前、this-book 在后,首个命中胜出;三条外链路径两两不同、全部在 public/ 产物中存在,越界与漏网都被断言挡住。
参数对齐不是玄学:一个常量寄存器是 16 字节 = float4,参数必须整块落在某个寄存器内、不许跨边界,放不下就顺延、余量作废。本节用《星屑旅店》的 10 个参数把「按逻辑顺序声明」与「按寄存器边界重排」各算一遍,给出可复现的整数账——naive 占 5 个寄存器、packed 占 4 个,S 层与 P 层逐位一致。
材质参数表不是美术的内部草稿,而是美术与程序之间的契约:每个参数都要写明类型、取值范围、单位、默认值与是否暴露给美术。本节用《星屑旅店》三套材质做一份可跑的表校验,并让「默认值被改动」这件事在构建期就被摘要检测到,S 层与 P 层结果逐位一致。
图集重打包后,UV 变了的区域会牵动所有引用它的 sprite、material 与 screen。本节把这份引用关系建成有向图,从变更 rect 沿反向边做 BFS,输出受影响资产清单与需要重跑的回归套件,并让同一份传播逻辑在 Python 与 TS 内核两处逐位一致。
mip 链的字节账是整数题:第 i 级尺寸是 ceil(w/2^i)×ceil(h/2^i),未压缩按 bpp 逐级累加并按 4 字节对齐,块压缩按块向上取整。本节复现共享真源基线 5592404,给出四张纹理 × 八种格式的整数字节账与有效位深,压缩原理外链 graphics 专题。
图集装箱是整数题,更是确定性题:同一批输入必须产出同一张布局。本节用《星屑旅店》的 31 个混合尺寸矩形,对比 shelf(货架)与 skyline(天际线)两种确定性装箱在 512/1024/2048 三档的装箱率,并用布局摘要 digest 把可复现性锁死,S 层与 P 层逐位一致。
前两节各报了 8 条问题,本节把它们合成一份分级清单:按一张可判定的映射表,每个规则码落到 block / warn / info 三级,并给出修复动作与能否自动修。16 条问题判成 block 3 / warn 11 / info 2,3 条 block 落在 2 条记录上,门禁直接判阻断;分级表未覆盖的规则码一律判失败。
上一节判的是「字段对不对」,这一节判「值合不合规」。尺寸、格式、命名三类判据被写成一张全整数与字符串的规则表,再用一份真跑的 Python 规则引擎与 TS 内核在 9 条导入记录上跑出 8 条违例,八个规则码各命中一次;两侧违例集合逐位一致,且每条规则都配了一条能触发的负例。