yzsdr

Generative Shader|程序化图像生成

Generative shader 通过 GPU 程序生成图像。fragment shader(片元着色器)通常为每个屏幕像素计算颜色,可以读取坐标、时间、纹理、声音或上一帧结果,组合成形状、光照和运动。

同一函数在不同分辨率、时间和镜头下可以生成不同图案。参数、尺度和边界的设置决定结果,程序化并不等于随机。

SDF 与射线步进

自制解释图。左边把圆写成一个带正负号的距离函数:点在圆内、表面上或外部,函数值不同。右边显示 ray marching(步进式射线行进):离表面远时迈大步,接近表面后缩小步长。图示使用理想化圆形帮助建立直觉,不代表完整的光照或材质系统。

signed distance field(有符号距离场,SDF)为每个空间点提供到最近表面的距离,并用正负表示内外。球体、盒子和圆环可以用简单函数描述,再用最小值、最大值或平滑合并组合成复杂形体。与多边形模型相比,SDF 的边界天然连续,缩放和布尔运算很容易;代价是每个像素都要重复计算距离,复杂场景会迅速变慢。

程序从摄像机出发,查询当前位置的距离;如果距离是 0.5,就可以安全地沿光线前进约 0.5,因为最近表面不会在这段范围内出现。不断重复后,光线靠近表面,再用法线估计光照。法线、阴影、反射和环境采样决定最后的“材质感”;SDF 只提供形体边界。

噪声、反馈与时间

噪声(noise)常被用来破坏过于规则的表面,但不同噪声承担不同工作。低频噪声可以让地形缓慢起伏,高频噪声适合颗粒和细裂纹;分形布朗运动把多个尺度叠加,产生云、烟和岩石的连续变化。若每帧独立生成随机数,画面会闪烁;将噪声坐标随时间平滑移动,才会被读成流动。

反馈式 shader 会把上一帧写回纹理,再用它影响下一帧。反馈可用于涟漪、反应扩散、粒子和绘画痕迹。此时图像不只是时间参数的函数,还依赖过去发生过什么。程序视觉可以因此产生一种与 Glitch and Datamosh 不同的故障感:Glitch 是编码或信号被破坏,反馈 shader 是规则允许误差持续累积。

参数与性能

参数可对应可见变化:时间改变水面速度,阈值控制形体黏合,采样次数影响阴影细节。

在游戏中,shader 还必须服从性能与稳定性。屏幕空间效果依赖当前分辨率,SDF 场景受步数和最大距离限制,移动设备上的带宽和功耗又会改变可用预算。项目 brief 应把生成方式拆成形体函数、噪声尺度、颜色映射、光照、时间和性能目标。

与 PS1-era 3D 对照,早期实时三维的视觉特征来自硬件无法连续计算,shader 则可以把数学连续性作为主要材料;与 Watercolor Rendering 对照,水彩模拟要让扩散受纸张和湿度影响,生成式 shader 则把这些过程抽象成可重复的场函数。

屏幕空间处理与形体生成

一段 shader 既可以只改变颜色,也可以从零构造形体。屏幕空间 shader 常根据深度、法线或邻近像素处理已经渲染好的图像;SDF / ray marching 则把摄像机射线送进一个数学场,直接决定哪里出现表面。两者都被称为 shader,却对性能、可控性和艺术工作流有不同要求。

时间、噪声尺度、阈值、颜色曲线和采样次数可拆成独立控制项,便于观察与修改。

传统媒介模拟需要对应材料行为:纸张扩散涉及湿度和吸收方向,金属涉及反射与粗糙度,颗粒噪声可用于砂石。

English Wikipedia