Show HN: 在终端中旋转的环面(使用 Kitty 图形协议)
摘要
一位开发者分享了使用 Kitty 图形协议在终端中渲染的旋转环面,并解释了 base64 编码和协议细节。
Hi HN,<p>今年夏天我将在斯坦福大学学习计算机图形学,想表达一些我脑海中非常简单的概念。所以我用 C 语言写了一个旋转环面。从编写一个能在 Blender 中工作的光线追踪器,到没有任何依赖的纯 C 语言,感觉非常轻松。我还想顺便试试 Kitty Graphics Protocol,在终端中渲染图像感觉太酷了。<p>欢迎评论和建议。
查看缓存全文
缓存时间: 2026/08/08 14:18
# torus v0.5
Source: https://andreadimatteo.com/torus-v0-5.html ·2026\-08\-01
---
嗨,我是 Andrea。在稍微玩了一下这个暂时还没有被遗忘的 torus 程序之后,我决定用 Kitty Graphics Protocol (https://sw.kovidgoyal.net/kitty/graphics-protocol/) 来渲染它,我的终端 (https://ghostty.org/) 也支持这个协议。如果你一开始像我一样不仔细看,可能会以为就是发送用纯 ASCII 编码的原始像素数据。嗯,可没那么简单,嘿嘿。你必须发送 base64 编码的图像(RGB、RGBA、PNG)。对于那些不了解的人来说(包括我在阅读之前的我),这种编码的工作方式如下:
- 取 3 个字节作为输入
- 将其拆分成每 6 位一组
- 给定 `i`,一个 6 位无符号整数,返回字符 `map\[i\]`,其中 `map` 是编码特有的映射表,对这四个 6 位无符号数中的每一个都这样做
- 如果输入不是 3 字节的整数倍,则根据需要填充 `=`(特殊字符)
如果你想了解更多,并且想用老式方式来做,就去看看 RFC (https://datatracker.ietf.org/doc/html/rfc4648#section-4) 吧。
对 RGB 数据来说,它的实现简单得令人意外,而且你还可以炫耀一下你知道 RFC 的全称是 Request For Comment。
一旦你有了 base64 编码的图像,就可以使用 kitty 图形协议,以最大 4096 字节的块来发送它。所有图形都遵循 `\_G;\\` 这种格式,翻译成 `printf\(\)` 也就是:`printf\("\\033\_G;\\033\\\\"\);`,其中 `<key-value map>` 是一个以 `;` 结尾的、用逗号分隔的键值字符串。这个映射表的一些基本信息有:
- 在终端上显示:`a=T` ~必须指定,否则什么都不会显示 :)~
- 数据类型:`f=24/32/100` 分别对应 RGB、RGBA 和 PNG(必须指定)
- 宽度:`s=%n`(必须指定)
- 高度:`v=%n`(必须指定)
- 压缩:`o=z`(可选)
- 终端列数和行数:`c=%d,r=%d`(可选)
- 更多(如果后面还有数据块):`m=%1`
现在,有了真实的图像渲染,我终于可以看到到底发生了什么。事实上,之前发生了一些非常奇怪的事情,比如 torus 被切成两半、光照不一致。视觉调试起来容易多了,还可以添加很酷的东西,比如颜色和第二个(不同颜色的)光源。
写 `Metal` 代码来在 Apple Silicon 上加速这一切会很有趣,可能学起来有意思,也可能纯粹是找罪受;或者也可以把它做成一个真正能加载 OBJ 网格的渲染引擎;又或者干脆永远忘记这个项目。
这就是目前的结果,很酷吧 :) ?
代码可以在下面的仓库里找到: (https://github.com/andimatteo/torus)
torus
> 帧率计数器让它看起来更专业,尽管它其实没用,因为它会休眠来避免帧率超过 33.33 (0.o)
冷知识:你知道品红色(蓝色 + 红色)并不是一种真实的颜色吗?它在可见光谱中并不真正存在,只是我们的大脑编造出来的 :)
相似文章
Ratty: A terminal emulator with inline 3D graphics
# Ratty — A GPU-rendered terminal emulator with inline 3D graphics 🐀🧀 Source: [https://ratty-term.org/](https://ratty-term.org/) © 2026 Ratty,[Orhun Parmaksız](https://github.com/orhun)
Show HN:一个ASCII 3D渲染引擎
GlyphCSS是一个JavaScript库,它使用ASCII字符在DOM中渲染带纹理的3D网格,支持多种3D格式,并与原生JS、React和Vue集成。
@RoundtableSpace:当开发者把终端配置做成艺术品时,就成了 NEOVIM + HERD + GITU + GHOSTTY + KEEBY 这副模样……
精选终端组合(Neovim、Herd、Gitu、Ghostty、Keeby)展示,将开发环境美学化的潮流。
Tsplat – 在终端中运行高斯泼溅渲染
Tsplat 是一款基于 Rust 的命令行工具,仅使用 CPU 即可直接在终端中渲染 3D 高斯泼溅场景,甚至支持通过 SSH 运行。它支持 Unicode 半角块和图形协议,并具有导航和自动旋转控制。
@tom_doerr: 将复杂的终端输出转换为带样式的HTML页面 https://github.com/nicobailon/visual-explainer…
visual-explainer 是一个智能体技能,可将复杂的终端输出(如 ASCII 艺术图和管道表格)转换为带有 Mermaid 图表、支持深色/浅色主题以及多种 AI 编码智能体框架的带样式的交互式 HTML 页面。