黑屏、伪影与“它为什么没动”
Shader 错误常常没有堆栈:坐标系翻转、uniform 没更新、buffer 布局不一致,都可能黑屏或闪烁。WebGPU 的 bind group 与 pipeline 还增加了资源匹配的检查面。
费力点:把“画面不对”翻译成可定位的资源、坐标或管线问题;要可视化中间值,而不只盯着最终画面。
这不是让 AI 替我画画,也不是摆放静态模型。它更像是在屏幕里模拟真实空间中的物体:几何、光照与规则实时演化,逐帧长出高复杂度的图案。
从这里开始先交代这个领域的生态:Twitter/X 上活跃着一批用代码把数学变成图案的人,也在持续分享共用的规则与代码。认识他们,才看得懂后面每个 demo 在做什么。
这个圈子不叫“AI 画图”:作者写 Shader、粒子、迭代与微分方程,让 GPU 实时算成画面,同一段代码既是作品也是教程。下面先列出几位仍在活跃的创作者,再看他们常用的平台。
Shadertoy 是在线 GLSL 片段着色器平台:打开网页写一段片元着色器,浏览器实时算出每个像素的颜色,也能直接看别人的完整代码和参数。前面这些创作者大多在这里做实验,后面不少 demo 也来自同一思路。
要画“空间”,得先回答:一个点用什么坐标描述,又怎样从三维投影到二维屏幕。定位(坐标)与投影(到屏幕)是所有 demo 的共同语言;Shader 的逐像素运行,会在后面的实践时间线里接上。
生成式画面里的一切——点、粒子、曲线、分形表面——都是空间中的坐标。看懂所有 demo 的钥匙只有三个动作:定位(坐标)、变换(旋转 / 平移)、投影(到屏幕)。旋转作为“改变坐标的规则”,留到数学概念一节展开。
物体空间、世界空间、相机空间、裁剪空间层层变换;一个位置就是一个向量(x, y, z),建模就是给每个点一个确定的坐标。
把三维点投影到二维屏幕:视锥、近远平面、FOV 决定“看起来多大、多深”;近大远小来自坐标除以深度。
后面的 Shader 逐像素计算、Compute 更新粒子、手柄移动相机、VR 生成双视图——全都建立在这套坐标与变换之上。先有这些基础,再谈高复杂度图案才不悬空。
如果说上一节的「透视投影」是把三维坐标一步步换算成屏幕上的二维点,那 Ray Marching 就是另一条到达屏幕的路:不提前建网格模型,而是沿视线一步步走,直到碰到隐式定义的表面。两种手法放在一起看,正好是「算坐标」与「走空间」的对比。
核心是距离函数(SDF):它回答“这个点离表面多远”,据此沿视线一步步前进,直到接近表面。这样就能直接渲染分形、反射、布尔运算等隐式几何。

一个函数告诉你“当前点离最近的表面有多远”,正负号表示在表面内还是外。
从相机出发,每次按 SDF 给出的安全距离前进,直到接近表面或超出行程。
先有网格坐标,再用矩阵把三维点除以深度投影成二维;一次换算,位置确定。
没有网格,每个像素沿自己的视线步进求交;表面由 SDF 隐式给出,命中才着色。
所以两种手法适合不同素材:有明确顶点坐标的网格模型交给投影管线;分形、反射这类“没有显式表面”的几何交给 Ray Marching 沿视线求交。
真正值得反复调整的不是公式本身,而是它周围的观看条件:相机、空间重复、表面着色、轨迹、颜色映射与迭代预算——它们决定同一套规则呈现为安静图案、膨胀世界还是无法预测的运动。
投影与 Ray Marching 给了两种“上屏方式”。最后一个关键问题:每个像素的颜色,到底是怎么算出来的?这就是渲染计算。
渲染计算是“规则 → 像素”的最后一公里:像素位置由投影或视线求交决定,再经法线、光照与颜色映射输出一个 RGB。数学结果本身不是颜色,把它变成颜色并算得足够快,才成画面。
把迭代次数、密度、相位、深度映射成颜色:同一组规则,换一种映射就是另一幅画。
Euler / RK4 积分、有限差分法线、浮点精度:让迭代、求交与梯度估计数值稳定。
迭代次数、步数与采样决定细节也决定开销;实时渲染要在预算内取舍。
GPU 并行处理每个像素;Compute / storage buffer 让状态跨帧持续演化。
至此地基拼齐了:坐标与投影决定“看哪里”,Ray Marching 决定“走多远”,渲染计算把规则变成颜色——而“每个像素都是一次函数调用”的逐像素运行,正是后面实践阶段里直接计算 Shader 的基础。分形、Compute 粒子与 VR 双视图,全都建立在这些之上。
坐标、投影、Ray Marching 与渲染计算背后,还有一批反复出现的数学概念。它们不是孤立的公式,而是同一个主题:重复局部规则,得到复杂边界。
旋转可以用两种相反的思路理解,都能表达“绕轴 n 转 θ”,但看问题的角度完全不同。一种把它当作作用在坐标上的变换:矩阵把整组坐标线性地转过去,罗德里格公式负责从轴和角度直接构造这张矩阵。另一种把它当作一个对象本身:四元数(几何代数里叫旋转子)把旋转“装”进四个数里,再用它去包裹向量。
矩阵把旋转表达为一次乘法,与位移、缩放统一在同一套运算里,是引擎与 Shader 的标准形态。代价是九个数冗余、重复累乘会积累浮点漂移,需定期正交化——它更像“怎么算”,而不是“旋转是什么”。
旋转子是“旋转本身”:四个数、归一化即稳定、组合即乘法,SLERP 让相机旋转顺滑,也没有万向节死锁。它更像“旋转是什么”——后面手柄与 VR 的相机都依赖它。
Mandelbrot / Julia、四元数分形、Mandelbox、Apollonian:重复局部规则,得到复杂边界。
Lorenz、Chen 等 ODE 用数值积分变成空间中的连续轨迹。
Perlin / Simplex 噪声与域扭曲(domain warping),叠加出有机而复杂的纹理。
复平面变换与高维迭代、旋转,是许多 3D 分形和投影的底层。
空间划分和向量场驱动:把平面切块,或让粒子顺着场流动。
Möbius 变换、球极投影、庞加莱圆盘:把空间变换成更“看得懂”的形状。
这不是一条从“不会图形学”到“掌握图形学”的直线,而是一连串对反馈速度的追问:能不能更快看见?能不能更容易改变?能不能让系统自己长出下一步?
下面用五个阶段和十三个 demo 把这条线展开:有的证明公式能变成图像,有的证明工具能让实验变快,有的暴露出下一步的问题。播放前先讲该观察什么,播放后再讲它如何影响下一阶段。
Quatrefoil 与 Phlox 建立了即时视觉反馈:框架把场景、相机和绘制循环变成可用的创作语言。
Ray Marching 与四元数分形把“图像”还原成坐标、时间和参数上的函数计算。
WGSL 与 GPU 通用计算让状态可在显存中持续演化,渲染只是结果被看见的最后一步。
输入映射、坐标变换和相机运动让空间不再是静态展示,而是可以被身体化探索的场所。
双眼视图、头部追踪和实时性能预算,把生成式规则从屏幕图案推进为可置身其中的世界。
这些 demo 看上去像一段段“效果”,但开发过程里最耗时间的往往不是写出第一个画面,而是让它可解释、可控制、可持续地运行。把困难说出来,才自然引出 AI Coding 可以帮到哪里、又不能替代什么。
从已有仓库看,这不是单一的 Shader 难题。WebGPU-Art/soluble 同时组织 WGSL、TypeScript、参数、bind group 与手柄控制;vr-dive 的 greddysnake 分支 则把 Ray Marching 放进 VR 的视角和交互约束。困难会在图形、数值、输入和运行环境之间来回传导。
Shader 错误常常没有堆栈:坐标系翻转、uniform 没更新、buffer 布局不一致,都可能黑屏或闪烁。WebGPU 的 bind group 与 pipeline 还增加了资源匹配的检查面。
费力点:把“画面不对”翻译成可定位的资源、坐标或管线问题;要可视化中间值,而不只盯着最终画面。
四元数、Mandelbox、SDF 都涉及迭代、距离估计与浮点精度:次数过低丢细节,过高超实时预算;距离估计不稳会穿透表面;颜色映射与相机又会放大微小误差。
费力点:要同时调公式、步数、epsilon、镜头和采样;数学正确只是起点,视觉稳定与性能可接受才是作品成立的条件。
生成式作品一旦不只画一帧,就会有状态:粒子、元胞、参数、时间或交互输入。soluble 用 storage buffer 保存可读写的点,再让后续管线使用同一份数据;这要求对数据布局、读写顺序和帧间更新有明确模型。
费力点:从“写一个函数”变成“管理一个持续演化的系统”:CPU / GPU 边界、buffer 对齐、生命周期与调度都要说清楚。
手柄轴值不能直接拿来移动相机:需要 dead zone、速度曲线、delta time 与坐标变换。进入 VR 后,双眼视图与头部追踪会放大延迟问题;桌面成立的 Ray Marching,在头显里必须重算采样与帧率预算。
费力点:优化目标不是单纯更高帧率,而是让人能自然探索空间:画面、输入和身体感受要一起调试。
解释报错与 API、生成最小复现、翻译 GLSL / WGSL、列出变量检查表、为公式写可视化测试,或协助对比两种实现。
这个误差是否有视觉价值?这个镜头是否让空间成立?这个控制是否舒适?哪些参数值得暴露给观众?这些都无法由“代码能运行”自动推出。
AI Coding 最适合生成式艺术的地方,不是替我决定作品长什么样,而是把“我想试一个假设”到“我看见它运行”的距离缩短。
生成式艺术里有很多“半懂不懂但很想试”的时刻:知道想要一种结构,却不知从哪个距离函数开始;知道一个吸引子的名字,却不熟悉方程。AI 能把模糊意图翻译成一组可以运行、可以失败、可以继续追问的实验。
把不熟悉的公式、WGSL/GLSL API 或仓库拆成可修改的问题。
在 GLSL、WGSL、JavaScript、Rust 和 VR 框架间搬运想法。
探索颜色、镜头、空间折叠、噪声与参数范围。
解释伪影、精度不足、性能瓶颈和交互 bug。
模型越容易生成代码,人越需要判断:这个变化真正改变了结构,还是只换了颜色?结果是值得探索的空间,还是常见案例的表面拼接?AI 让代码更便宜,也让选择更重要。
未来的生成式艺术可能不再以“最终图片”结束。它会更像一个可以进入的规则空间:你可以改变参数、加入动作,甚至让另一个 agent 继续修改它。
更有意思的方向不是生成更复杂的画面,而是让作品暴露自己的生成机制:观众知道哪些参数可改、动作怎样进入系统、一次变化由什么规则造成。作品因此同时像作品、工具和实验室。
让语义映射成可探索的参数空间。
让行为成为系统状态,作品每次生成不同版本。
Shader 片段、规则库、renderer 和 agent 形成持续积累。
让系统暴露规则、来源、参数和限制。
这也带来可理解性与作者性的问题:观众能否理解自己的参与?实时计算和模型调用的成本如何进入作品?规则、代码与模型共同参与时,贡献如何被描述?
今天一路都是从写 Shader、写规则出发的,但这远不是生成式艺术的全貌:还有一大批工具靠节点、参数与 AI 也能生成精美作品。它们不在今天分享范围,却值得被知道。
它们的共性依然是“定义规则,让结果自动出现”,只是输入不再是文本代码:拖连线、调参数、拼节点,或只给一句提示词交给模型。下面挑几个有代表性的。
节点式实时视觉编程,现场演出与交互装置常用;连线、参数、缓存全在节点图里。
节点式程序化特效,粒子、破碎、地形都能用节点网络“生成”,被影视行业大量使用。
不写 Python 也能做程序化建模:用节点把网格、分布、噪声组合成复杂几何。
Rhino 里的参数化设计插件,建筑师常用它把逻辑变成可调节的形体。
把 AI 图像生成做成节点工作流,提示词、模型、采样器用连线组合,介于编程与工具之间。
节点式实时媒体:声音、图像、交互都可以用“接线”的方式搭起来。
讲了这么多规则,
真正想留下的,
只有最后这一件事。
AI Coding 改变的不只是写代码的速度,而是让很多曾因为太难、太陌生而被搁置的创意,第一次有机会被真正做出来。过去我们往往只能沿着自己熟悉的规则走;现在每个人都能更快地试探那些不熟悉的规则。
所以最后只想问一句:如果敢把那个模糊的想法交给规则和 AI,它会把你带进一个什么样的空间?规则只是入口,空间没有尽头,创意因此也没有尽头——而门后面永远还有下一扇门。