Hotdry.
systems-engineering

Cool-Retro-Term:用 OpenGL Shader 模拟 CRT 终端效果

Cool-Retro-Term 通过 OpenGL shaders 实现可编程扫描线、磷光持久性、屏幕曲率、噪声与闪烁等 CRT 复古视觉,提供工程化参数与自定义指南。

Cool-Retro-Term 是一个专为现代终端设计的视觉增强工具,它巧妙利用 OpenGL shaders 来模拟经典 CRT 显示器的复古效果,而不牺牲性能。这种方法的核心在于将终端渲染管道与 GPU 着色器深度融合,实现扫描线(scanlines)、磷光持久性(phosphor persistence)、屏幕曲率(curvature)、噪声(noise)和闪烁(flicker)等真实物理特性。通过这种 shader-based 渲染,开发者可以获得高度可编程的视觉参数,同时保持终端的响应性和轻量级特性。

在传统终端模拟器中,文本渲染通常依赖 CPU 或简单 2D 绘制,导致复古效果难以实现真实感。Cool-Retro-Term 则转向 QML + Qt5 架构,结合 qmltermwidget 库,将终端内容作为纹理输入 OpenGL fragment shader。该 shader 在每个像素级别应用 CRT 模拟算法:例如,扫描线通过 sin 函数周期性调制亮度,磷光持久利用多帧缓冲区模拟荧光衰减,曲率则通过 radial distortion 映射 UV 坐标。GitHub 仓库数据显示,该项目积累 24.3k stars,用户反馈确认其在 Linux/macOS 上运行流畅,无明显 FPS 损失。

要落地部署,首先从 Releases 下载 AppImage(Linux)或 dmg(macOS),无需编译。启动后右键菜单访问 “Effects” 面板,核心参数如下清单:

扫描线(Scanlines)参数:

  • 强度(Strength):0.5-0.8,推荐 0.65,避免过度遮挡文本。
  • 宽度(Width):1-3 像素,匹配终端字体大小(如 12pt 时设 2)。
  • 抖动(Jitter):0.1-0.3,模拟真实 CRT 不均匀扫描。

磷光持久性(Phosphor Persistence):

  • 衰减率(Decay):0.85-0.95 / 帧,模拟绿色 / 琥珀荧光余辉。
  • 颜色偏移(Color Shift):R/G/B 通道微调 0.02,实现磷光辉光。
  • 缓冲层数:2-4 帧,平衡真实感与内存(GPU 显存 < 100MB)。

屏幕曲率与畸变(Curvature):

  • 曲率半径(Radius):0.15-0.25,模拟 14 寸 CRT 边缘弯曲。
  • 桶形畸变(Barrel Distortion):系数 0.4,结合枕形校正 0.2。

噪声与闪烁(Noise & Flicker):

  • 噪声强度(Noise Amount):0.05-0.15,高斯噪声模拟粒子干扰。
  • 闪烁频率(Flicker Rate):0.01-0.03 / 帧,随机种子驱动,低频避免眩晕。

自定义 shader 示例:在 app/qml/CoolRetroTerm.qml 中注入 fragment shader:

uniform float scanline_strength;
void main() {
    vec2 uv = gl_FragCoord.xy / resolution;
    float scan = sin(uv.y * scanline_count) * scanline_strength;
    gl_FragColor.rgb *= (1.0 - abs(scan));
}

编译 Qt 项目时,确保 OpenGL ES 3.0+ 支持。参数调优原则:从默认 “Default Amber/Green” 预设起步,监控 GPU 使用率(nvidia-smi 或 radeontop < 5%),文本可读性 > 视觉美感。

风险控制:低端 GPU(如集成显卡)设 persistence_decay > 0.92,避免卡顿;禁用 flicker 于生产环境。回滚策略:Effects → None 即时恢复原生渲染。

实际案例:在开发服务器监控脚本时,启用 curvature + phosphor 提升沉浸感,结合 tmux 分屏无延迟。相比 Alacritty 等现代终端,其 CRT shader 提供独特审美价值。

资料来源:

查看归档