返回

文章详情

SQL中的光线追踪器

Hacker News2026年7月1日 14:27

一个完全用ClickHouse SQL查询编写的路径追踪器,通过ClickHouse的PNG输出格式直接渲染到PNG文件中。没有用户定义的函数,也没有外部代码 — 一个SELECT语句计算每一个像素。它渲染了单词ClickHouse,呈现出玻璃质感的铬色字母 — 以安德鲁·肯斯勒(Andrew Kensler)著名的皮克斯名片光线追踪器的精神为指导,并且在上述场景中,将其悬浮在程序生成的景观上,反射地形并在山丘上投下阴影。另请参见:NoiSQL — 用SQL查询生成音乐 SQL曼德博基准 Click-V:用ClickHouse SQL构建的RISC-V模拟器 DOOMHouse是一个“类似于Doom”的游戏引擎,完全用ClickHouse SQL渲染3D图形 如何工作 渲染器的所有内容都在一个查询中:像素是行。numbers_mt(width * height * samples)为每个(像素,样本)生成一行;样本通过GROUP BY像素进行平均,输出列r,g,b(范围在[0, 1]之间)以及显式的x,y坐标列(pixel % width,intDiv(pixel,width))被写入PNG输出格式。显式坐标允许编写者根据位置放置每个像素,因此行不需要ORDER BY而且每个像素的重负荷工作保持在所有核心间的并行。 在元组上的3D数学。向量是Tuple(Float64, Float64, Float64);dotProduct、L2Normalize、tuplePlus、tupleMultiplyByNumber等做线性代数,包含在短的lambda别名中(va,vs,vm,vd,vn,vc,vref)。反弹循环是arrayFold。每个光线在范围(maxDepth)中每次折叠步骤精确推进一镜像反弹 — 这是每行内部的一个循环,因此行保持独立,渲染在所有CPU核心之间并行化。(第一版使用了WITH RECURSIVE CTE — 请参见下面的查询。)通过arrayMap进行let绑定。ClickHouse的WITH lambdas是按名称调用的,因此作为参数传递一个值会重新扩展表达式并使查询树膨胀。因此,中间变量通过arrayMap(x -> body, [expr])[1]以值的方式绑定,这是一个单元素数组“let”。 几何体(构造实体几何) 圆柱体 — 直线笔画的圆形杆,顶部平坦(l,i,k,H,u,字母e的盘)。 环面 — 圆形字母(C,c,o,u,s,e),在其签名距离场中通过光线行进;C/c/s/e的开口是从环中减去的一个方框。 球体 — 字母i上的点,加上一个铬色的“行星”,它是一个减去一个球体的球体。 定向立方体/平行六面体 — 适用于平面笔画。因此,场景中使用了立方体、圆柱体、环面和球体,采用CSG联合、差异(行星和字母开口)以及光线行进距离场(环面)。 地形 一个高度场z = amp · fBm(x, y),其中fBm是对多个倍频的格点值噪声的总和。摄像机光线与其进行光线行进 — 光线穿越空旷的空气(从光线首次降至地形最大高度处开始跳过)并线性插值表面交点,因此速度快且没有阶梯带。使用高度颜色渐变(从水 → 沙子 → 草 → 岩石 → 雪)进行着色,暖阳并附加凉爽的天空环境模型,进行光线阴影(地形自阴影和字母投射的阴影),并在天空中添加距离雾。 画廊 ClickBulb — 一个完全由球体构建的台灯跳入场景,跃过横幅,在字母间隙中扫过光线,然后探出头来注视着你。每一帧都是同一个ClickHouse SQL查询,每帧仅运行一次(全质量视频)。 皮克斯致敬 — 字母作为球体基本体的联合,铬色覆盖棋盘。 CSG基本体 — 字母从圆柱体、环面和球体中雕刻而成。 Perlin地形 — 一个独立的光线行进高度场。 综合 — ClickHouse在地形上(上面的英雄图像)。 运行 queries/中的每个文件都是完整且自给自足的,并且是参数化的:图像大小来自ClickHouse的图像输出设置(可通过getSetting以SQL读取),每个像素的样本来自{SAMPLES:UInt32}查询参数 — 一个查询可以渲染任意分辨率。用以下命令渲染一个:clickhouse local --output_format_image_width 2560 --output_format_image_height 1200 --param_SAMPLES 8 --queries-file queries/clickhouse_terrain.sql > out.png 查询 场景 分辨率 clickhouse_raytracer.sql 皮克斯致敬,WITH RECURSIVE反弹循环 640 × 256 clickhouse_raytracer_loop.sql 相同场景,arrayFold循环(并行,更快) 640 × 256 clickhouse_raytracer_primitives.sql 从CSG基本体雕刻出的字母 1280 × 512 terrain.sql Perlin噪声地形 896 × 504 clickhouse_terrain.sql ClickHouse在地形上(英雄图像) 2560 × 1200。这些查询由生成器中的Python生成,场景和弹跳深度在生成时被固定,而图像大小和每个像素的样本保持为发出查询的运行时参数。例如,重新创建英雄图像:python3 generators/gen_combined.py 2560 1200 8 2 > scene.sql # 深度2;宽度/高度/样本为运行时 clickhouse local --output_format_image_width 2560 --output_format_image_height 1200 --param_SAMPLES ...

赞助内容

NordVPN Next-gen Antivirus

本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。

请我喝杯咖啡