看日落
摘要
Fabien Sanglard 描述了他迁移至 Pixel 7 后尝试复现 Horizon 动态壁纸的过程,使用了一个简单的 WallpaperService,根据电池电量切换屏幕截图。
暂无内容
查看缓存全文
缓存时间: 2026/05/16 03:35
# 看日落
来源:https://fabiensanglard.net/sunset/index.html
2024年8月18日
看日落
---
我和妻子经常傍晚在查尔斯顿沼泽(https://www.google.com/maps/place/Charleston+Slough/@37.4407272,-122.0992144,16z/data=!3m1!4b1!4m6!3m5!1s0x808fba2544d78f0f:0x4a9d0c8855b8b7d9!8m2!3d37.4412256!4d-122.0915558!16s%2Fg%2F1td5rh_8?entry=ttu)散步。日落时分,所有徒步者都会停下脚步。像其他人一样,我们也喜欢看太阳划过地平线。
我更喜欢日出。主要是因为这意味着我早起,那天能完成很多事情。那时周围人少,哪里都不用排队。仿佛世界都属于你。
总之,从 Pixel 1 开始,我的壁纸就是 Live Earth 系列中的《地平线》(https://fabiensanglard.net/sunset/screen49.webp)。
> 望向地平线。手机充电时太阳升起,电量消耗时太阳落下。
> ——《地平线》Live Earth 壁纸描述
不幸的是,2022年我从 Pixel 5 迁移到 Pixel 7 时,发现它已经不再可用[\[1\]](https://fabiensanglard.net/sunset/index.html#footnote_1)。
## PBR 着色器的尝试
---
我的第一个想法是编写自己的壁纸和对应的着色器。关于光散射的文献很多。我甚至在 GPU 时代[研究过这个效果](https://fabiensanglard.net/lightScattering)。但为了加快进度,我从 wwwtyro 的实现[\[2\]](https://fabiensanglard.net/sunset/index.html#footnote_2)入手。如果你对 Rayleigh 和 Mie 散射不太熟悉,Nvidia 的 GPU Gems 有一篇很棒的文章[\[3\]](https://fabiensanglard.net/sunset/index.html#footnote_3)。
我拍摄了 Pixel 5 的[一百张屏幕截图](https://fabiensanglard.net/sunset/screencap.sh)作为参考,然后开始工作。
| 地平线(屏幕截图) | 地平线(清理后[\[4\]](https://fabiensanglard.net/sunset/index.html#footnote_4)) | PBR 着色器版本 |
|-------------------|----------------------|----------------|
我对着色器进行了调整,在一天结束时添加了粉色的渐变,但看起来还是太干净了。另一个问题是下午缺乏视觉反馈。瞥一眼屏幕很难看出当前电量。
## 更简单的方案
---
我想过编写另一个着色器,通过艺术挑选并硬编码五种或六种关键天空的颜色值。我会在关键帧之间使用双线性插值,在屏幕空间生成颜色渐变。这样我就能学习[颜色插值](https://www.alanzucconi.com/2016/01/06/colour-interpolation/)、LAB 以及 GLSL 的 `in`/`out` 语法(替代我熟悉的 `uniform`/`varying`)。
但这样会花掉我几个月的业余时间。而有一种替代方案只需要半天。
我写了一个 Photoshop 脚本,用来“清理”那一百张参考截图并移除小部件。我对“内容感知”填充的强大功能印象深刻。然后我按照 Kirill Grouchnikov 的教程[\[6\]](https://fabiensanglard.net/sunset/index.html#footnote_6)编写了一个 `WallpaperService`[\[5\]](https://fabiensanglard.net/sunset/index.html#footnote_5)。当收到 `Intent.ACTION_BATTERY_CHANGED` 事件时,它会绘制新的一帧。电池电量被转换为文件名,然后从 `res` 文件夹加载背景。整件事花了 1 小时写完,只有 150 行代码。
*我的 Pixel 7 上的“Hackizon”*
## 尾声
---
有些人“给篱笆背面刷漆”,有些人用 `screencap` 解决问题。大多数 hack 不过是缓兵之计,这种方法一旦手机屏幕比例变化就会失效。
一年后,《地平线》壁纸回归了[\[7\]](https://fabiensanglard.net/sunset/index.html#footnote_7)[\[8\]](https://fabiensanglard.net/sunset/index.html#footnote_8)。有时候,解决办法就是耐心等待。
## 参考
---
^ (https://fabiensanglard.net/sunset/index.html#back_1)[\[1\]Pixel 7 和 7 Pro 缺少“地平线”动态壁纸 (https://9to5google.com/2022/10/15/pixel-7-horizon-wallpaper-missing/)]
^ (https://fabiensanglard.net/sunset/index.html#back_2)[\[2\]wwwtyro 的 glsl-atmosphere (https://github.com/wwwtyro/glsl-atmosphere)]
^ (https://fabiensanglard.net/sunset/index.html#back_3)[\[3\]GPU Gems 2:精确的大气散射 (https://developer.nvidia.com/gpugems/gpugems2/part-ii-shading-lighting-and-shadows/chapter-16-accurate-atmospheric-scattering)]
^ (https://fabiensanglard.net/sunset/index.html#back_4)[\[4\]Photoshop 的“内容感知填充”+ 批处理让我惊叹。]
^ (https://fabiensanglard.net/sunset/index.html#back_5)[\[5\]Neo-horizon (https://github.com/fabiensanglard/horizons/tree/main)]
^ (https://fabiensanglard.net/sunset/index.html#back_6)[\[6\]使用 Android SDK 2.1 创建动态壁纸 (https://www.pushing-pixels.org/2010/02/01/live-wallpapers-with-android-sdk-2-1.html)]
^ (https://fabiensanglard.net/sunset/index.html#back_7)[\[7\]Google 最新的 Pixel 动态壁纸是来自过去的回忆 (https://www.androidpolice.com/google-pixel-live-wallpaper-horizon/)]
^ (https://fabiensanglard.net/sunset/index.html#back_8)[\[8\]Google 在 Pixel 7 上重新带回“地平线”动态壁纸 (https://9to5google.com/2023/07/04/pixel-7-horizon-wallpaper/)]
---
\*
相似文章
天空、日落与行星的渲染
一篇技术博客文章,提供了使用着色器实现逼真天空、日落和行星渲染的逐步指南,重点介绍了瑞利散射和米氏散射等大气散射技术。
@billtheinvestor: 想象一下,你屏幕上的每一个像素都直接从模型实时流式传输而来。没有 HTML,没有布局引擎,没有代码。只有你想要看到的画面。@eddiejiao_obj、@drewocarr 和我构建了一个原型,以探索这在实际中如何运作,并致力于将其变为现…
Flipbook is a prototype that streams every screen pixel directly from an AI model in real time, eliminating HTML, layout engines, and traditional code.
本地Qwen 3.6与前沿模型在编码基础任务上的对比:单文件HTML Canvas驾驶动画——结果与GIF
用户将本地量化的Qwen 3.6模型与前沿模型在单文件HTML Canvas驾驶动画任务上进行比较,发现本地27B Qwen量化模型在视差和运动方面比某些前沿输出表现更好。
@zan2434:想象屏幕上的每个像素,都由模型实时流式渲染。没有 HTML,没有排版引擎,没有代码,只有你想看到的画面……
一款原型直接把 AI 模型的像素实时流式输出到屏幕,绕过 HTML、排版引擎和传统代码。
Skyty Wall
Skyty Wall 是一款可将闲置 iPad 转变为环境航班信息显示屏的产品。