GEN / ART / CODE进入文章 ↓
A 40-MINUTE TALK BY 题叶

在屏幕里
模拟真实空间

这不是让 AI 替我画画,也不是摆放静态模型。它更像是在屏幕里模拟真实空间中的物体:几何、光照与规则实时演化,逐帧长出高复杂度的图案。

分形 · Shader · VR · AI Coding约 40 分钟
从这里开始
00 / SPEAKER

开场:
关于讲者

题叶头像 题叶 · Tiye tiye.me ↗

业余兴趣,就是好奇心和探索欲。用 Shader / WebGPU / VR 在屏幕里画数学图案,也写过脚本语言——总想知道每个规则会长成什么样。

兴趣项目

开场建议:30 秒
一句话带过「有工作、这是兴趣」,三个项目各一句带过,就进正文。
01 / BACKGROUND

背景:
谁在用代码画数学

先交代这个领域的生态:Twitter/X 上活跃着一批用代码把数学变成图案的人,也在持续分享共用的规则与代码。认识他们,才看得懂后面每个 demo 在做什么。

这个圈子不叫“AI 画图”:作者写 Shader、粒子、迭代与微分方程,让 GPU 实时算成画面,同一段代码既是作品也是教程。下面先列出几位仍在活跃的创作者,再看他们常用的平台。

活跃的创作者 · Twitter / X

Nona

生成式 Shader 艺术家,Shadertoy 高产作者,用极简 GLSL 做出精致动态图案。

natived_

用代码生成视觉图案的创作者,在 X 上持续分享实时渲染与算法实验。

TheInfinitySI

Shadertoy 上活跃的数学 / Shader 图案创作者,风格偏几何与光线。

Freya Holmér

图形学与数学可视化教育者,擅长讲清贝塞尔曲线与 Shader 动画。

Yohei Nishitsuji

日本 Shader 艺术家,Shadertoy 活跃作者,极简代码产出精细图案。

S. Conradi

用代码生成数学图案的创作者,常在 X 分享实时渲染实验。

KAZOOO

Shader / 生成式图案创作者,分享实时渲染与算法生成的视觉。

XorDev

GLSL / Shader 教育者,专注一分钟 shader、SDF 与实时图形技巧。

这些账号的共同点:他们不只展示“结果”,更展示“让结果出现的规则”,而且往往把代码一起分享出来。
在线平台 · 零安装 · 打开就能写

Shadertoy:在浏览器里写 Shader,立刻看见图案

Shadertoy 是在线 GLSL 片段着色器平台:打开网页写一段片元着色器,浏览器实时算出每个像素的颜色,也能直接看别人的完整代码和参数。前面这些创作者大多在这里做实验,后面不少 demo 也来自同一思路。

本次分享的路线
先看这个领域的社区与 Shadertoy(本节);再建立技术地基:透视投影、Ray Marching,以及渲染计算怎么把规则变成颜色,最后整理用到的数学概念;然后回到我的实践时间线,其中「直接计算 Shader」阶段会补上“每个像素都是一次函数调用”的图形 API 基础;最后讨论 AI Coding 怎样改变探索速度,以及下一步可能出现的创作媒介。
02 / PROJECTION

透视投影:
把三维放进二维屏幕

要画“空间”,得先回答:一个点用什么坐标描述,又怎样从三维投影到二维屏幕。定位(坐标)与投影(到屏幕)是所有 demo 的共同语言;Shader 的逐像素运行,会在后面的实践时间线里接上。

生成式画面里的一切——点、粒子、曲线、分形表面——都是空间中的坐标。看懂所有 demo 的钥匙只有三个动作:定位(坐标)、变换(旋转 / 平移)、投影(到屏幕)。旋转作为“改变坐标的规则”,留到数学概念一节展开。

变换流水线:把空间中的一个点逐级“翻译”到屏幕 物体坐标 object 模型 M 世界坐标 world 视图 V 相机坐标 view 投影 P 裁剪坐标 clip 屏幕 2D 旋转 = 改变坐标的规则 旋转矩阵 · 欧拉角 · 轴角 · 四元数 矩阵通用但易积累误差,欧拉角直观但会万向节死锁,四元数稳定且适合插值
变换流水线:一个点从物体坐标出发,经过模型 / 视图 / 投影三次矩阵变换进入裁剪坐标,再除以深度投影到二维屏幕;旋转是其中改变坐标的规则。

空间坐标

物体空间、世界空间、相机空间、裁剪空间层层变换;一个位置就是一个向量(x, y, z),建模就是给每个点一个确定的坐标。

透视投影

把三维点投影到二维屏幕:视锥、近远平面、FOV 决定“看起来多大、多深”;近大远小来自坐标除以深度。

茶壶线框网格:大量三角形组成的网格,顶点投影到屏幕后以边相连
茶壶线框网格:表面由大量三角形组成——每个三角形由三个顶点定义,顶点经透视投影落到屏幕后以边相连,这正是投影管线在每一帧做的事情。本地程序化生成的示意。
“建模就是给每个点一个坐标;旋转是改变坐标的规则;投影是把三维坐标变成屏幕上的二维。”

后面的 Shader 逐像素计算、Compute 更新粒子、手柄移动相机、VR 生成双视图——全都建立在这套坐标与变换之上。先有这些基础,再谈高复杂度图案才不悬空。

建议讲述:这一节约 3 分钟
用“把一个点放到画面里”当例子:先给坐标,再投影到屏幕,重点讲清“近大远小来自坐标除以深度”。旋转(矩阵 / 罗德里格与旋转子 / 四元数)作为“改变坐标的规则”留到数学概念一节再展开。
03 / RAY MARCHING

Ray Marching:
不用网格建模也能画空间

如果说上一节的「透视投影」是把三维坐标一步步换算成屏幕上的二维点,那 Ray Marching 就是另一条到达屏幕的路:不提前建网格模型,而是沿视线一步步走,直到碰到隐式定义的表面。两种手法放在一起看,正好是「算坐标」与「走空间」的对比。

核心是距离函数(SDF):它回答“这个点离表面多远”,据此沿视线一步步前进,直到接近表面。这样就能直接渲染分形、反射、布尔运算等隐式几何。

SDF ray marching diagram
Ray Marching / SDF:每一步根据距离场决定安全的前进距离。图片:Wikimedia Commons。

SDF:距离场

一个函数告诉你“当前点离最近的表面有多远”,正负号表示在表面内还是外。

沿射线步进

从相机出发,每次按 SDF 给出的安全距离前进,直到接近表面或超出行程。

和透视投影对比

透视投影:每个点换算到屏幕

先有网格坐标,再用矩阵把三维点除以深度投影成二维;一次换算,位置确定。

Ray Marching:每个像素走一条视线

没有网格,每个像素沿自己的视线步进求交;表面由 SDF 隐式给出,命中才着色。

所以两种手法适合不同素材:有明确顶点坐标的网格模型交给投影管线;分形、反射这类“没有显式表面”的几何交给 Ray Marching 沿视线求交。

真正值得反复调整的不是公式本身,而是它周围的观看条件:相机、空间重复、表面着色、轨迹、颜色映射与迭代预算——它们决定同一套规则呈现为安静图案、膨胀世界还是无法预测的运动。

建议讲述:这一节约 4 分钟
紧接上一节的投影来对比:投影是「每个点一次换算到屏幕」,Ray Marching 是「每个像素沿视线步进求交」。用同一句「把三维场景放到屏幕上」引出两种上屏方式,让听众知道它们是并列的对比,而不是先后关系。
04 / RENDERING

渲染计算:
把规则算成颜色

投影与 Ray Marching 给了两种“上屏方式”。最后一个关键问题:每个像素的颜色,到底是怎么算出来的?这就是渲染计算。

渲染计算是“规则 → 像素”的最后一公里:像素位置由投影或视线求交决定,再经法线、光照与颜色映射输出一个 RGB。数学结果本身不是颜色,把它变成颜色并算得足够快,才成画面。

颜色映射

把迭代次数、密度、相位、深度映射成颜色:同一组规则,换一种映射就是另一幅画。

数值方法

Euler / RK4 积分、有限差分法线、浮点精度:让迭代、求交与梯度估计数值稳定。

迭代与采样预算

迭代次数、步数与采样决定细节也决定开销;实时渲染要在预算内取舍。

并行与逐帧更新

GPU 并行处理每个像素;Compute / storage buffer 让状态跨帧持续演化。

“数学结果不是颜色;渲染计算才把规则变成像素里的颜色。”

至此地基拼齐了:坐标与投影决定“看哪里”,Ray Marching 决定“走多远”,渲染计算把规则变成颜色——而“每个像素都是一次函数调用”的逐像素运行,正是后面实践阶段里直接计算 Shader 的基础。分形、Compute 粒子与 VR 双视图,全都建立在这些之上。

建议讲述:这一节约 3 分钟
用一个具体画面把四块串起来:某个像素 → 它对应哪条视线或哪个坐标 → 经过哪些迭代与求交 → 映射成什么颜色。点明“数学结果不是颜色,渲染计算才把它变成颜色”。
05 / MATH

用到的数学概念:
让边界变复杂的工具箱

坐标、投影、Ray Marching 与渲染计算背后,还有一批反复出现的数学概念。它们不是孤立的公式,而是同一个主题:重复局部规则,得到复杂边界。

旋转:两种相反的思路

旋转可以用两种相反的思路理解,都能表达“绕轴 n 转 θ”,但看问题的角度完全不同。一种把它当作作用在坐标上的变换:矩阵把整组坐标线性地转过去,罗德里格公式负责从轴和角度直接构造这张矩阵。另一种把它当作一个对象本身:四元数(几何代数里叫旋转子)把旋转“装”进四个数里,再用它去包裹向量。

① 变换旋转矩阵 · 罗德里格公式

旋转矩阵与罗德里格公式示意
旋转矩阵:输入向量 v,经矩阵 R 一次乘法得到 v';R 由轴 n 与角度 θ 用罗德里格公式构造。它是一张“线性变换表”,对整组坐标一视同仁。

矩阵把旋转表达为一次乘法,与位移、缩放统一在同一套运算里,是引擎与 Shader 的标准形态。代价是九个数冗余、重复累乘会积累浮点漂移,需定期正交化——它更像“怎么算”,而不是“旋转是什么”。

② 对象旋转子 / 四元数

旋转子与四元数共轭示意
四元数 / 旋转子:把旋转装进 q 这一个对象里,向量被“夹”在中间 v' = q·v·q*;在单位球面上做 SLERP,就能在两次旋转之间平滑地走弧线。

旋转子是“旋转本身”:四个数、归一化即稳定、组合即乘法,SLERP 让相机旋转顺滑,也没有万向节死锁。它更像“旋转是什么”——后面手柄与 VR 的相机都依赖它。

更高复杂度的数学工具

分形与迭代

Mandelbrot / Julia、四元数分形、Mandelbox、Apollonian:重复局部规则,得到复杂边界。

奇异吸引子与微分方程

Lorenz、Chen 等 ODE 用数值积分变成空间中的连续轨迹。

噪声与 fBm

Perlin / Simplex 噪声与域扭曲(domain warping),叠加出有机而复杂的纹理。

复数与四元数

复平面变换与高维迭代、旋转,是许多 3D 分形和投影的底层。

Voronoi 与流场

空间划分和向量场驱动:把平面切块,或让粒子顺着场流动。

保形映射与投影

Möbius 变换、球极投影、庞加莱圆盘:把空间变换成更“看得懂”的形状。

“重复局部规则,得到复杂边界——高复杂度图案的共同源头。”
建议讲述:这一节约 3 分钟
旋转按“变换 vs 对象”两种思路讲(矩阵 / 罗德里格 → 旋转子 / 四元数),点出相机为何选择后者;其余概念用一张工具箱清单带过,每个配一个后面会出现的 demo,不展开公式。
06 / MY PATH

我的尝试:
从工具到世界

这不是一条从“不会图形学”到“掌握图形学”的直线,而是一连串对反馈速度的追问:能不能更快看见?能不能更容易改变?能不能让系统自己长出下一步?

下面用五个阶段和十三个 demo 把这条线展开:有的证明公式能变成图像,有的证明工具能让实验变快,有的暴露出下一步的问题。播放前先讲该观察什么,播放后再讲它如何影响下一阶段。

阶段一:先用 Three.js / PixiJS 快速作图

Quatrefoil 与 Phlox 建立了即时视觉反馈:框架把场景、相机和绘制循环变成可用的创作语言。

阶段二:直接写 WebGL Shader

Ray Marching 与四元数分形把“图像”还原成坐标、时间和参数上的函数计算。

阶段三:WebGPU 与 Compute Shader

WGSL 与 GPU 通用计算让状态可在显存中持续演化,渲染只是结果被看见的最后一步。

阶段四:手柄成为视角控制

输入映射、坐标变换和相机运动让空间不再是静态展示,而是可以被身体化探索的场所。

阶段五:VR 中的更多尝试

双眼视图、头部追踪和实时性能预算,把生成式规则从屏幕图案推进为可置身其中的世界。

讲者提示:五个阶段各约 3 分钟,每段 demo 播放约 1 分钟,剩余时间讲“看什么”和“它为什么改变了下一阶段”。网络不稳定时,可把 iframe 替换成提前录好的片段。
07 / FRICTION

真正费力的部分:
调试、数学与状态

这些 demo 看上去像一段段“效果”,但开发过程里最耗时间的往往不是写出第一个画面,而是让它可解释、可控制、可持续地运行。把困难说出来,才自然引出 AI Coding 可以帮到哪里、又不能替代什么。

从已有仓库看,这不是单一的 Shader 难题。WebGPU-Art/soluble 同时组织 WGSL、TypeScript、参数、bind group 与手柄控制;vr-dive 的 greddysnake 分支 则把 Ray Marching 放进 VR 的视角和交互约束。困难会在图形、数值、输入和运行环境之间来回传导。

01 / DEBUG

黑屏、伪影与“它为什么没动”

Shader 错误常常没有堆栈:坐标系翻转、uniform 没更新、buffer 布局不一致,都可能黑屏或闪烁。WebGPU 的 bind group 与 pipeline 还增加了资源匹配的检查面。

费力点:把“画面不对”翻译成可定位的资源、坐标或管线问题;要可视化中间值,而不只盯着最终画面。

02 / MATH

公式能跑,不等于能看

四元数、Mandelbox、SDF 都涉及迭代、距离估计与浮点精度:次数过低丢细节,过高超实时预算;距离估计不稳会穿透表面;颜色映射与相机又会放大微小误差。

费力点:要同时调公式、步数、epsilon、镜头和采样;数学正确只是起点,视觉稳定与性能可接受才是作品成立的条件。

03 / STATE

GPU 的状态怎样被安全地传下去

生成式作品一旦不只画一帧,就会有状态:粒子、元胞、参数、时间或交互输入。soluble 用 storage buffer 保存可读写的点,再让后续管线使用同一份数据;这要求对数据布局、读写顺序和帧间更新有明确模型。

费力点:从“写一个函数”变成“管理一个持续演化的系统”:CPU / GPU 边界、buffer 对齐、生命周期与调度都要说清楚。

04 / EMBODIMENT

手柄、相机与 VR 的舒适边界

手柄轴值不能直接拿来移动相机:需要 dead zone、速度曲线、delta time 与坐标变换。进入 VR 后,双眼视图与头部追踪会放大延迟问题;桌面成立的 Ray Marching,在头显里必须重算采样与帧率预算。

费力点:优化目标不是单纯更高帧率,而是让人能自然探索空间:画面、输入和身体感受要一起调试。

“在生成式项目中,调试不是创作之后的清理工作;它本身就是探索规则、验证直觉、决定参数边界的过程。”

AI 最能降低的摩擦

解释报错与 API、生成最小复现、翻译 GLSL / WGSL、列出变量检查表、为公式写可视化测试,或协助对比两种实现。

仍需要作者判断的部分

这个误差是否有视觉价值?这个镜头是否让空间成立?这个控制是否舒适?哪些参数值得暴露给观众?这些都无法由“代码能运行”自动推出。

建议讲述:这一节约 5 分钟
每张难点卡讲 45—60 秒。不要把它讲成“踩坑列表”,而是用“现象 → 排查方式 → 创作上的判断”串起来。例如:先看到闪烁,再定位距离估计或精度,再决定是否把这种不稳定变成视觉语言。最后用两张卡明确 AI Coding 的边界,再进入下一节。
08 / AI CODING

AI Coding:
把想法变成实验

AI Coding 最适合生成式艺术的地方,不是替我决定作品长什么样,而是把“我想试一个假设”到“我看见它运行”的距离缩短。

生成式艺术里有很多“半懂不懂但很想试”的时刻:知道想要一种结构,却不知从哪个距离函数开始;知道一个吸引子的名字,却不熟悉方程。AI 能把模糊意图翻译成一组可以运行、可以失败、可以继续追问的实验。

解释

把不熟悉的公式、WGSL/GLSL API 或仓库拆成可修改的问题。

翻译

在 GLSL、WGSL、JavaScript、Rust 和 VR 框架间搬运想法。

变体

探索颜色、镜头、空间折叠、噪声与参数范围。

诊断

解释伪影、精度不足、性能瓶颈和交互 bug。

AI 很擅长把“试试看”变成代码;但“什么值得继续看”仍然需要人的判断。

模型越容易生成代码,人越需要判断:这个变化真正改变了结构,还是只换了颜色?结果是值得探索的空间,还是常见案例的表面拼接?AI 让代码更便宜,也让选择更重要。

一个适合现场演示的 AI Coding 回路
  1. 先描述视觉目标,不急着指定实现。
  2. 要求 AI 写出最小可运行版本。
  3. 只改一个变量:距离函数、迭代次数、颜色或相机。
  4. 把失败作为反馈。
  5. 总结哪些参数真正改变了结构。
建议讲述:AI Coding 约 6 分钟
最好展示三次失败:第一次能运行但形状不对,第二次结构对了但性能差,第三次才开始有视觉方向。这样可以说明 AI 的价值是扩大实验次数,而不是一次性给出正确答案。代码审查、许可证、数值稳定性和性能边界仍然需要人负责。
09 / FUTURE

未来的想象:
作品是一个入口

未来的生成式艺术可能不再以“最终图片”结束。它会更像一个可以进入的规则空间:你可以改变参数、加入动作,甚至让另一个 agent 继续修改它。

更有意思的方向不是生成更复杂的画面,而是让作品暴露自己的生成机制:观众知道哪些参数可改、动作怎样进入系统、一次变化由什么规则造成。作品因此同时像作品、工具和实验室。

从 prompt 到 parameter space

让语义映射成可探索的参数空间。

从观看到共同演化

让行为成为系统状态,作品每次生成不同版本。

从作品到个人引擎

Shader 片段、规则库、renderer 和 agent 形成持续积累。

从“更像”到“更可理解”

让系统暴露规则、来源、参数和限制。

未来最值得设计的,不是更多结果,而是更好的探索空间。

这也带来可理解性与作者性的问题:观众能否理解自己的参与?实时计算和模型调用的成本如何进入作品?规则、代码与模型共同参与时,贡献如何被描述?

规则反馈参数空间协作判断
最后带走的三个问题
  1. 我是在制作一个结果,还是在设计一个会产生结果的系统?
  2. 我能否让观众看懂一次变化由哪个规则造成?
  3. AI 帮我扩大了什么搜索空间,又替我隐藏了什么判断?
建议讲述:未来约 4 分钟
不要预测某个具体产品。回到创作现场:作品怎样让观众进入参数空间?agent 怎样参与修改而不遮蔽规则?系统怎样留下可追溯的过程?用这些问题收束。
10 / BEYOND

不止代码:
其他的生成艺术工具

今天一路都是从写 Shader、写规则出发的,但这远不是生成式艺术的全貌:还有一大批工具靠节点、参数与 AI 也能生成精美作品。它们不在今天分享范围,却值得被知道。

它们的共性依然是“定义规则,让结果自动出现”,只是输入不再是文本代码:拖连线、调参数、拼节点,或只给一句提示词交给模型。下面挑几个有代表性的。

TouchDesigner

节点式实时视觉编程,现场演出与交互装置常用;连线、参数、缓存全在节点图里。

Houdini

节点式程序化特效,粒子、破碎、地形都能用节点网络“生成”,被影视行业大量使用。

Blender 几何节点

不写 Python 也能做程序化建模:用节点把网格、分布、噪声组合成复杂几何。

Grasshopper

Rhino 里的参数化设计插件,建筑师常用它把逻辑变成可调节的形体。

ComfyUI / Stable Diffusion

把 AI 图像生成做成节点工作流,提示词、模型、采样器用连线组合,介于编程与工具之间。

Max MSP / vvvv

节点式实时媒体:声音、图像、交互都可以用“接线”的方式搭起来。

“是否写代码,不是生成式艺术的分界线;分界线是:你有没有在定义一套会让结果自己出现的规则。”
为什么要提这些工具
我自己的路径几乎全程是代码(Shader / WebGPU / VR),这些工具我并没有深入用过,但它们证明了“生成”可以属于不同人群:设计师、建筑师、音乐人、艺术家都能找到各自的入口。把它们放在结尾,是为了避免把生成式艺术讲成“只会写代码的人”的事。
END / BEGIN AGAIN

空间没有尽头,
创意也是

讲了这么多规则,
真正想留下的,
只有最后这一件事。

AI Coding 改变的不只是写代码的速度,而是让很多曾因为太难、太陌生而被搁置的创意,第一次有机会被真正做出来。过去我们往往只能沿着自己熟悉的规则走;现在每个人都能更快地试探那些不熟悉的规则。

所以最后只想问一句:如果敢把那个模糊的想法交给规则和 AI,它会把你带进一个什么样的空间?规则只是入口,空间没有尽头,创意因此也没有尽头——而门后面永远还有下一扇门。