用C在GBA上写光线追踪(0)配置开发编译环境

前段时间用C#写了一个光线追踪程序,可以渲染圆球,平面这些基本图形,大致尝试做了一下反射、光照、阴影等效果。

↑ C#实现的光线追踪

   

↑ GBA上C实现的光线追踪

然而,在我打算继续深入优化的时候,我失去了我的好帮手强强电脑,换成了超极本。看来继续做技术密集型光线追踪是不行的了。

就在这时,我看到了一些GBA的开发文章,以前的GBA也留着,于是我产生了一个大胆的想法——在GBA上实现光线追踪。

GBA架构清晰简明,入手门槛低,而且还有一个官方的编程手册,很适合我这种人折腾。

初代GBA

在写程序之前,我要先花点时间了解GBA。作为黑白掌机GB的下一代,GBA(Game Boy Advance)是任天堂2001年的推出的彩色游戏掌机。它的硬件如下:

  • 屏幕:16位色深240x160的液晶屏幕,初代无背光。
  • 处理器:16.78Mhz的RISC类型的32位CPU(型号为ARM7TDMI,不支持浮点数)
  • 内存(RAM):它机身的内存有两部分,一个是32KB的内部工作内存,还有一个256KB的外部工作内存。内部内存读写要比外部内存快一些。
  • 游戏卡(ROM):游戏卡容量最大32M,除了大部分只读储存器,也有一小部分可擦写的闪存用于储存游戏存档

虽然GBA的处理器频率比起现在的GHz级别的处理器实在太低,但只要使用得当,完全可以满足游戏,阅读器,播放器等程序的需求。内存同理。

其实,GBA的硬件和现在的嵌入式很相似,很适合入门学习系统底层和嵌入式开发。但是现在网络上GBA的中文资料很少,所以我打算不直接从写代码讲起,而是先分享我了解到的GBA开发的所有知识,希望能吸引更多人入门GBA编程。

这是接下来我几篇系列文章的大纲:

  1. 配置GBA开发和编译环境
  2. GBA的功能和运行机制
  3. 编写GBA库
  4. 光线追踪基础
  5. 在GBA上实现光线追踪基础结构
  6. 几种常见几何体的光线求交算法
  7. 实现光照,阴影和材质
  8. 实现动画系统
  9. 迁移到PC上

 


 

第一篇:配置GBA开发和编译环境

关于配置环境更详尽的教程:TONC教程:建立开发环境

开发前的准备

准备一台电脑 : ) 本文介绍的是在windows电脑上的配置。

GBA开发主要使用C语言,因为GBA上没有系统,运行的是裸机代码,C能和底层交互。虽然C++也可以,但不如C快、小。

因此要想玩好GBA,要熟悉C语言,了解系统底层原理。即使不太会也没关系,俺也不会,用着用着踩多几个坑就熟悉了。

为了方便测试,当然要有一个GBA的模拟器,这样就不用每次都把程序放到真机上运行了。我推荐mGBA,这是一个新开发(2013年)的模拟器,开发它的人希望兼顾准确性和速度。它不仅可以显示地图,精灵,调色板,还可以使用GDB调试(俺也不会)

如果你想在真机上运行,可以采用两种方法。

1、使用flash烧录卡,将程序写入到烧录卡里就可以插入到GBA上运行。但烧录卡一般比较贵,即使是GBA完全不流行的现在也要150~1000元。

2、使用multiboot线,直接把程序送到机子256kB的内存里,不用插卡就能运行。这其实是利用了GBA多人连线游戏的功能,这个功能可以让一台机子通过连接线把小游戏发给其他机子,这样大家就可以一起玩小游戏了。我们通过将电脑伪装成一台主机,就可以实现传输自己的程序。这种特制线一般买不到,需要的话可以自制,不太难成本也低。(前提是电脑要有串口,相信现在大多数电脑都没有,我也乖乖买了使用SD卡的烧录卡)

要用什么编译器?

对于这种嵌入式的开发,最重要的是要有一套工具链。工具链是指编译器、连接器、解释器和调试器这些组成的一套工具,它可以把我们的代码编译成在特定机器上运行的机器代码。不同的机器的工具链一般不通用,例如ARM公司就提供了它们处理器的工具链。

ARM的官方编译器

GBA用的就是ARM的CPU,因此可以从ARM那里找到工具链,但是时代久远,有点难找,而且可能是收费的。

gcc编译器

除此之外我们可以使用gcc的编译器,gcc是免费开源的编译器,是开源计划里的重要组成部分,这个东西大概程序员都知道,程序员们希望世界上所有程序都是开源的,可以自由修改,于是他们一起做了一个开源的编译器(gcc),然后通过编译器做了开源的系统(linux),然后在系统上写了开源的软件。

一般的gcc是运行在linux上并编译到linux的,也有编译到ARM的gcc-arm,这叫交叉编译。我们只需要针对GBA配置一个就可以了,当然我不会,不过一些GBA爱好者已经为我们做好在Windows上编译ARM的gcc编译器,附带其他工具,组成了工具链。

DevKitAdv:这个比较旧,需要使用.bat脚本管理编译。

devkitPro:整合了多个游戏机的工具链,支持GBA,NDS,PSP,NS等,可以按需下载。这个工具内有一些makefile模板,可以使用makefile方便的管理要编译的内容,输入make就可以编译,makefile很有了解的必要。

这些工具链中也提供了用于GBA的库libgba,包含了常用类型和数学运算库,内存操作,中断系统等一些常用的功能。

安装工具链

我这里介绍devkit Pro的安装:

去devkit Pro论坛里下载devkit Pro的Windows安装包,名称是devkitProUpdater,选择安装位置(建议C盘根目录,因为库、编译路径等原因),点选需要的组件(GBA),之后就会开始联网下载。

选择devkitPro组件

安装之后打开安装目录,看看包含什么:

devkitARM:这就是工具链

examples:示例文件,里面有图像、音频演示,xboo连接线项目,还有一个空的项目模板。

libgba: devkitPro的GBA库;

libtonc:tonc教程的作者写的GBA库。

tools:一些小工具,例如修复rom头部,图像转换。

sys2等一些安装文件。

测试工具链

现在来测试能不能正常使用工具链。

打开examples->gba->graphics->SimpleBGScroll,在这里打开cmd(shift+右键菜单)(win10下是powershell)

在cmd下输入 make ,看看有没有编译出一个build文件夹和.gba的rom文件。

 
成功编译的输出

如果成功了,恭喜你,可以往下看开始配置新项目然后写代码了!

错误的解决方法

如果有错误,我这里列出了2种可能的原因:

1、cmd或PowerShell的目录地址不在 \divkitPro\examples\gba\graphics\SimpleBGScroll。

2、make指令是调用工具链里make.exe,如果没有添加Path,系统会找不到这个程序。

打开环境变量的窗口,检查是否已经配置了变量。正常情况下,应该有四个:1) 在Path里的“c:\devkitPro\msys2\usr\bin”,2) 名称为DEVKITARM的“/opt/devkitpro/devkitARM”,3) 名称为DEVKITPPC的“/opt/devkitpro/devkitPPC” ,4) 名称为DEVKITPRO的“/opt/devkitpro”。

如果检查无误还是不行,可以试试卸载重装到C盘 orz

 

配置新项目

我也不知道怎么配置一个既可以一键编译,又可以进行调试的开发环境。我只能介绍一下我摸索出来的勉强能用的方法。

我使用的是VisualStudio 2019,好像很多人觉得vs不适合嵌入式和Linux开发,但我vs用惯了,能不换就不换。vs2017后加入了Linux的开发组件,我觉得还是很好用的。如果你使用的不是vs,可以直接看文章末尾的TONC教程和附录里的其他方法。

首先我们需要安装VS2019的c/c++开发组件,还有Linux开发组件(为了可以建立makefile项目)

新项目配置

启动vs,新建一个makefile项目(翻译为生成文件项目)。

 

之后我们需要在项目属性的NMake里设置include文件的位置和make等命令。

  • 包含搜索路径 设置为 /divkitPro/libgba/include和/libtonc/include的地址。
  • 生成命令行 输入 make
  • 全部重新生成命令行 输入 make clean (换行)make
  • 清除命令行 输入 make clean
  • 输出  _run.bat

这个输出指的是在点击运行按钮后会运行的程序,因为我们生成的结果是一个.gba文件,是不能当exe运行的,所以我用了一个取巧的办法,建立一个_run.bat命令脚本,里面写上:

start %MGBA% xxx.gba  (%MGBA% 是模拟器程序的路径,我把这个路径添加到系统Path里了,MGBA等价于 C:/Programs/mGBA/mGBA.exe)

这样只要按vs里的运行,就会开始编译,用模拟器运行编译好的.gba文件。

  • 最后一点,make命令实际会查找当前目录里的makefile文件,然后按照里面的说明来编译,因此我们要到devkitPro的examples里把示例文件的makefile复制到我们的项目根目录下

生成

如果源文件里已经有main.c了,现在按生成->生成*你的项目名称* 或者Ctrl + B 应该就可以编译代码生成.gba文件了。

新建源文件

之后如果我们要新建一个源文件,在解决方案资源管理器的源文件里新建项,名称为xxx.c ,后缀为c,目录为项目里的/source

新建头文件

解决方案资源管理器的头文件里新建项,选择.h文件。可以新建一个文件夹例如/include,如果新建了include文件夹,要记得把这个文件夹地址加入项目的包含搜索路径。此外我们还要修改添加makefile里的include路径,不然编译器不知道。

由于makefile已经写好了模板,所以我们只需要在INCLUDES := 后面写include,他就会自动识别为项目目录/include。如果项目目录里有多个头文件文件夹,可以在include后加空格,再写名称。

 

makefile模板里有3处include地址:

1、我们写的 INCLUDES := xxx ,是项目目录里的。

2、devkitPro自带的两个库里的include

3、项目编译后产生的Build目录

 

到这里应该已经介绍完配置环境的问题了,之后要学的就是如何编程使用GBA上的硬件。在下一篇文章之前,我先推荐一些对学习GBA编程很有帮助的内容。

开发资料推荐

GBA编程手册。这个好像是官方的手册,中文版翻译到第六章就没了。里面说明了GBA的硬件和功能,相当于GBA的说明书,应该是最有用的资料。

GBA教程TONC。非常全面,很有深度,但有些地方难度也比较大。这个教程也讲了如何配置环境,包括visual c++ 和 NP2编辑器的配置。此外还讲了makefile的原理和编写方法。(可惜中国打不开)

GBA开发网站。存了很多开发的软件和资料,还有别人做好的游戏。

 


下一篇文章我会再讲讲GBA的硬件和基本运行原理,之后就开始写光线追踪程序。


参考资料

Eclipse+devkitPor搭个GBA开发环境

GBA开发入门:做一个名叫Hello World的游戏

 

posted @ 2019-09-28 13:37  H5L0  阅读(1002)  评论(0编辑  收藏  举报