<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>吃了蘑菇 · 观 · 记事</title>
    <link>https://chilemogu.com/gaze/</link>
    <description>做一个关于光的站，顺便记下过程。</description>
    <language>zh-CN</language>
    <lastBuildDate>Sat, 17 Oct 2026 14:43:56 GMT</lastBuildDate>
    <item>
      <title>一滴水，和它变灰的那条路</title>
      <link>https://chilemogu.com/gaze/water-turned-grey/</link>
      <guid isPermaLink="true">https://chilemogu.com/gaze/water-turned-grey/</guid>
      <pubDate>Sat, 17 Oct 2026 13:10:00 GMT</pubDate>
      <category>作品手记</category>
      <description>《观》上线这天，水还是像一块丝绸。下面是把它找回来的过程。</description>
      <content:encoded><![CDATA[<p>《观》是一部十一幕的长片：从一滴水落进水池开始，一路走到你决定「看不看」那颗已经飞过去的光子。中间要出现水波、声波、干涉条纹、粒子、探测器和一次延迟选择。</p><p>它只有一个 HTML 文件，页面自身不引任何外部资源。这话听起来像洁癖，其实是约束：所有几何、所有光、所有声音，都得在同一个画布上一笔笔画出来。</p><p>第一版发布完，我盯着第一幕看了两分钟，觉得不对。水是灰的。</p><p>不是不亮，是均匀地发灰。像一块被熨平的丝绸铺在桌上，风来了它皱一下，但怎么看都不像水。</p><h3>第一反应：加高光</h3><p>水该有什么，我想了一圈：反射光带、镜面高光、菲涅尔、近岸亮边。四条都加了，八十多行。</p><p>结果只是让那块灰布上多了一点波浪形的亮纹。更糟的是，它现在看起来像一块有光泽的灰布。</p><p>那时候该停一下，问一句：如果底色本身就是错的，上面加多少层光有意义？</p><p>但我没问，继续调参数。反射带压到 0.085，菲涅尔压到 0.13，亮边压到 0.30。三次之后，截图放大看，还是灰。</p><h3>排除法：一个一个关掉</h3><p>写了个脚本，把画面上的绘制函数逐个替换成空函数，再采样水面上同一个像素。规则很简单：关掉哪个之后水变蓝了，问题就在那一层。</p><p>关掉菲涅尔，没变。关掉反射带，没变。关掉波场贴图 —— 水一下子回到深蓝 #0a1628。</p><p>是我自己写的贴图函数，把整面水垫灰了。</p><h3>真正的一行</h3><p>贴图里每个像素做的是：把该点所有波源的正弦加起来得到 a，再映射成灰度。第一版这么写：</p><pre><code>let v = a * 0.5 + 0.5;
v = clamp(v, 0, 1);</code></pre><p>a 是波幅。没有波的时候 a = 0，于是 v = 0.5。</p><p>整面水，每一格，都被当成「半个波峰」来画。几十万个像素一起撒了个毫不显眼的谎。</p><p>所以我后面加的所有高光，都在跟一个假底较劲。它们压不平那层 0.5，只能在那层灰上再叠一层亮。越叠越像布。</p><p>改法是把正负两半分开：没有波就是底色，波峰才变白，波谷不比底色更亮。</p><pre><code>let v = a &lt; 0 ? 0 : (a &gt; 1 ? 1 : a);</code></pre><p>一行。改完那一帧，水第一次是深蓝的。</p><p>原来那句 *0.5 + 0.5 是从别处抄来的 —— 那里用的是无符号采样，需要把 [-1,1] 映射到 [0,1]。这里的波幅本来就不是那个范围。</p><h3>墙：另一种错</h3><p>墙看起来像贴纸，原因不是颜色，是没有第二张面。</p><p>一面朝你的墙只画正面，就是一张纸。要有厚度，得给它四样东西：</p><ul><li>顶面 —— 朝天，受光，最亮的一档；</li><li>右侧暗面 —— 光在左，右边必然背光；</li><li>落影 —— 往右下甩一段，证明它站在桌面上；</li><li>墙根渐变 —— 靠近桌面的一段变暗，墙才接得住地。</li></ul><p>四样都加，墙立刻立住了。缝口处的顶面还要断开 —— 那两条缝是通透的，顶面连成一条就成了实心墙。</p><p>这里踩了一个坑：destination-out 挖洞很方便，但直接在主画布上挖，会把整块画布擦成透明。得先画到离屏层，擦完再贴回来。</p><p>同一件事，两种错法：一个是底色错，加多少层都救不回来；一个是少了一个面，怎么调色都还是平的。加东西之前，先看看底子对不对。</p><h3>标点</h3><p>这个站从头到尾不用英文标点。引号用「」，书名用《》，省略号是六个点，破折号是两画长的一条。</p><p>大陆出版物其实多用“”，但“”打出来像一对英文引号，夹在中文里太轻。所以这里分了两套：句中的强调用「」，成段引文用“”。不统一，但我偏爱这样。</p>]]></content:encoded>
    </item>
    <item>
      <title>为什么这个站要有一份记事</title>
      <link>https://chilemogu.com/gaze/why-this-column/</link>
      <guid isPermaLink="true">https://chilemogu.com/gaze/why-this-column/</guid>
      <pubDate>Sat, 17 Oct 2026 12:40:00 GMT</pubDate>
      <category>建站</category>
      <description>六件作品摆在门面上，背后全是没地方说的事。给它们开一个抽屉。</description>
      <content:encoded><![CDATA[<p>这个站原本只有一层：门口一排卡片，点进去，玩，出来。作品自己说话，别的什么都不解释。</p><p>这个原则我仍然认。门面无趣，作品才有意思 —— 挂在门口招揽的话，都是在替作品道歉。</p><p>但门面之外还有一片地方空着：那些没被摆上桌的东西。</p><p>为什么《捏》里的东西永远是十六种，换多少纪元都不加新的。为什么《观》的第一幕要让人先落一滴水，而不是直接给答案。某天为了一个灰蒙蒙的水面花了四个小时，最后是删掉半行代码解决的。这些事情不进作品，但没有它们，作品就长不成现在这样。</p><h3>所以开了这一栏</h3><p>名字叫「观 · 记事」。</p><p>叫「开发日记」太像更新公告，叫「博客」又太重 —— 会暗示这里有观点要输出。记事轻一点：发生了什么，记下来，不保证有用。</p><p>它挂在这个站的同一个域名下，和作品共用一套标点和同一种语气。它不是另一个站，是这个站的背面。</p><p>分四类，不多：</p><ul><li>建站 —— 站本身的事：栏目、结构、部署、那些看不见的管线；</li><li>作品手记 —— 某件作品怎么来的，改了什么，哪些地方是错的；</li><li>运营思考 —— 为什么这么做，读者怎么反应，下一步要不要做；</li><li>随手 —— 想说的话，生活里的片段，跟代码没关系的东西。</li></ul><h3>这里会写什么，不会写什么</h3><p>会写：踩过的坑，判断错的地方，以及为什么最后选了这条路。</p><p>不会写：账号、后台、别人的隐私、没公开的数据。也不会写「欢迎关注我的公众号」那种话 —— 你来玩就够了。</p><p>也不会把每篇写成总结报告。有些篇可能只有三句话，因为那天真的只有三句话。</p><h3>多久一篇</h3><p>不承诺频率。有东西写就写，可能一周三篇，也可能一个月没有。</p><p>比频率更要紧的是：每一篇都得是真的发生过的事。写不出来就空着，空着比凑数诚实。</p><h3>技术上</h3><p>这个站没有后台，没有数据库，每篇都是纯静态的 HTML。所以记事也不是发出来的，是构建出来的：</p><pre><code>node _build/build.js</code></pre><p>跑一遍，列表页、每篇的独立页面、翻页、RSS 全部重新生成，然后照常部署。加一篇就是往 _build/posts 里丢一个 js 文件，正文写成段落数组 —— 不用管 HTML，也不用管样式。</p><p>顺手做了这几样：日期、分类、标签、上下篇、RSS、草稿开关（draft: true 的稿子不会被生成到任何页面）、分页。评论没做，也不打算做 —— 这个站不需要有人值守。</p>]]></content:encoded>
    </item>
  </channel>
</rss>
