用代码绘制一座砖塔

查看原文 HN 讨论

文章摘要

这是一段编程演示视频,作者通过纯代码(着色器/shader)的方式绘制出一座砖塔。这类作品通常依托 Shadertoy 这样的在线着色器平台,使用符号距离场(SDF, Signed Distance Field)与光线步进(ray marching / sphere tracing)技术,在 GPU 上以片元着色器实时计算并渲染出三维几何体——这里就是一座由砖块堆砌、带有立体感和光照的塔楼。

SDF 是一种用数学函数描述几何形状的方法:场景中任意一点到最近表面的有符号距离由一个函数给出,渲染时从摄像机出发沿视线方向”步进”,每一步前进的距离由当前点的 SDF 值决定,直到足够接近表面即判定为命中。这种方法的魅力在于可以用相对简洁的数学公式构造出复杂的形状、重复结构(如成排的砖块)和光影效果,而不需要传统的网格模型和顶点数据。砖塔正是利用 SDF 的域重复(domain repetition)技巧高效地生成大量规则排列的砖块。

视频展示了从基本形状到完整砖塔的构建过程,体现了 SDF 在程序化生成、过程化几何方面的表现力。不过这类技术也有现实的性能权衡:全屏实时光线步进在普通硬件上帧率有限,因此它更多被用作创意演示、视觉特效或游戏中的局部效果,而非整个世界的主力渲染方案。

HN 评论精华

petermcneeley 分享了一个 Shadertoy 实现,指出它”在我的 Intel 第 12 代核显上全屏只能跑 10fps”,认为这类技术”很可爱但很受限”。

aulit 反驳说优化空间是存在的,指出 sphere tracing(球体追踪)并不是光线步进的最优方案,并引用了一篇关于改进技术的学术论文。

starkrights 报告了在 iPhone 17 Air 上的测试结果:初始能达到 15-16 fps,但一分钟后因热降频降到 10-12 fps。

kg 为 SDF 技术辩护,称其”在真实游戏中被广泛使用”,强调要把生产环境中的实现与随手写的演示项目区分开来。

petermcneeley 随后澄清了自己的立场,表示他的质疑特指”用一个 SDF 方程创建一个完整的模型或整个世界”这种做法,并推荐了 IQ(Inigo Quilez,SDF 领域的知名专家)的另一个 Shadertoy 范例作为优秀作品的标杆。整体讨论围绕 SDF 渲染的实用性展开:当前硬件上的性能限制、它在专业游戏开发中的合理应用,以及概念验证演示与优化后生产实现之间的区别。