Hacker News 中文摘要

RSS订阅

我在Game Boy Color上实现了实时3D着色器 -- I put a real-time 3D shader on the Game Boy Color

文章摘要

作者成功在Game Boy Color上实现了实时3D着色效果,详细介绍了从Blender法线贴图制作到Lambert着色计算的完整技术流程,并分享了可下载的ROM和源代码。

文章总结

标题:在Game Boy Color上实现实时3D着色效果

作者Danny Spencer在2025年12月5日发表的技术博客中,详细记录了他如何在Game Boy Color掌机上实现实时3D着色渲染的创新过程。这项突破性工作主要包含以下核心内容:

技术实现 1. 核心算法 - 采用法线贴图技术,将3D物体表面法线信息编码为RGB图像 - 通过Lambert着色模型计算光照,核心公式为v = N·L(法向量与光照向量的点积) - 创新性地使用球坐标系简化运算,公式转换为v = sinθ₁sinθ₂cos(φ₁-φ₂) + cosθ₁cosθ₂

  1. 硬件适配
  • 针对Game Boy Color的SM83处理器(无乘法指令/浮点运算)设计特殊解决方案:
    • 使用对数转换将乘法运算转为查表加法
    • 开发8位定点数系统(-1.0到+1.0范围)
    • 实现自修改代码优化关键循环(节省12%性能)
  1. 性能表现
  • 每帧处理15个图块(约960像素)
  • 单像素渲染约130周期,空行仅需3周期
  • 占用单帧89%的CPU资源(约123,972周期)

开发流程 1. 前期验证 - 在Blender中进行视觉原型测试 - 开发伪随机抖动效果增强立体感

  1. 资产制作
  • 使用Blender生成法线贴图序列
  • 通过Cryptomatte技术处理特定几何体的固色需求
  1. AI辅助尝试
  • 使用Claude生成部分Python脚本(OpenEXR读取/Blender场景构建)
  • 尝试生成SM83汇编代码但最终手动优化
  • 作者强调95%代码为手工编写

项目资源 - 可玩ROM与完整代码已开源:https://github.com/nukep/gbshader - 包含茶壶和旋转Game Boy两种3D模型演示 - 通过方向键控制光源环绕效果

技术细节亮点 1. 独创编码方案 - 每个像素存储为3字节元组(Nφ, log(m), b) - 使用2^(1/6)为对数底数防止数据溢出

  1. 视觉优化
  • 利用LCD残影特性容忍画面撕裂
  • 分帧渲染不同区域降低处理负荷

这项成果展示了在8位掌机上实现实时3D渲染的可行性,为复古硬件开发提供了新的技术思路。作者特别指出,虽然AI在某些脚本编写上有辅助作用,但核心算法和优化仍需人工完成。

评论总结

总结评论内容如下:

  1. 对项目效果的赞叹
  • "Awesome looking results"("效果看起来太棒了")
  • "It's nice getting real hacker material on hackernews"("能在HN看到真正的黑客内容真好")
  1. 对技术实现的讨论
  • "3D shader...prerendered 2D normal map"("3D着色器...预渲染的2D法线贴图")
  • "Multiplication becomes table lookups plus addition"("乘法变成了查表加法")
  1. 怀旧情怀
  • "almost gives me the same joy as flipping through tech magazines"("几乎给了我翻阅旧科技杂志的快乐")
  • "Always loved using old hardware with recent understandings"("一直喜欢用现代理解来使用老硬件")
  1. AI使用讨论
  • "Thank you for your honesty!"("感谢你的诚实!")
  • "disclosing all attempts...unethical to deceive"("披露所有尝试...欺骗是不道德的")
  1. 技术细节疑问
  • "The 'Making it work' section seems to abruptly end"("'实现过程'部分似乎突然结束")
  1. 实际应用意向
  • "I'll have to give this a try on my Analogue Pocket"("我要在我的Analogue Pocket上试试")