我开发的跨平台3D引擎,移植NDS成功(有截图)(2007-09-17)

批注:博文标题中的日期标记此文为我在当时发表在csai上的博客cgao.csai.cn,今搬至此处,同时我的位于csai的博客将停止更新,改用优快云博客

以前读书的时候就一直喜欢玩游戏,想开发一个3D引擎,当时连矩阵都还没学过,一直没太搞明白3D引擎的工作原理.过了这些年后,在去年平早工作后抽空花了点时间做了一个简单的3D引擎(下面有截图),整个引擎基本用C实现,C++只在局部分析模型文件时用到一点,没有使用DirectX和OpenGL,因此可以比较容易跨平台,包括硬件平台.
        目前版本已支持3D物体及渲染列表的渲染,支持多光源,支持多格式3D模型文件的加载,Win32平台的显示由GDI实现.不过因为整个渲染纯软件实现(没有用3D硬件加速),在速度上当然和专业的引擎是没的比的,但这样可以让你对整个引擎的渲染过程更加清楚,而且更容易移植到其它平台,下面有一张我移植到NDS上的截图.
        基本功能是去年10月完成的.前几天改进了一些数据结构,添加了gouraud着色,帖图等功能,不过还没测先放几张老图上来.
 
3DEngine
 
 上面这张是加载了一个球的模型,采用恒定16位着色,打开灰色环境光源,和绿色的点光源的效果,运行时物体绕x,y,z每帧1度的速度旋转.球本身为纯白色,因为点光源为绿色,经恒定光照运算后的效果为灰色过渡到绿色.
        下面这张是移植到NDS上的图,因为没加载3D模型文件,我只手工在代码里写了一个多边形的顶点数据.运行方式和上面的球一样,开四个光源:环境光,点光源,聚光灯,无穷远光源.所有光源均为灰色.
        本例子运行时设置NDS主屏为MODE5,VRAM_A和VRAM_B用于双缓冲显示,下屏为MODE0,VRAM_C用于输出console文本.
        用devkitpro开发NDS上的程序的话,本身就有一部分OpenGL的函数移值过来,也就是说NDS的3D开发有限支持OpenGL,而且NDS硬件对3D也有支持,devkitpro的GL port就是基于NDS硬件实现的,因此效率比较高,再加上你如果是个OpenGL程序员,开发就更方便了.
        昨天通过查devkitpro的例子,刚研究透devkitpro加载3D模型文件的方法,过几天等我再放个截图上来,这张是昨天载的:
 
3DEngine
 
3DEngine
 
3DEngine
3DEngine
3DEngine
这几个演示程序速度还是可以的,除了最下面的这个圆环比较慢,大概10FPS左右,主要原因是因为,这个引擎的很多细节我还没有优化,而且光栅光化部分在X86平台是用几行汇实现的,速度比较理想,但在移植到NDS的过程时,因对ARM汇编不熟悉,目前光栅分部的批量行像素赋值是通过循环实现,速度肯定大打折扣,实现的函数如下:
inline void memset_16bit(void *dest, unsigned int data, int count)
{
 while(count--)
  *(((unsigned int*)dest)+count)=data;
}
上面这个函数其实就是按16bit做memset,因为我现在渲染的就是16位色系统.以后也许考虑32位色吧,如果哪位高手能用ARM汇编写一个16bit(或32bit)的memset,请通知我一下,不胜感激!
技术方面的讨论可以加QQ群:29894258 本群只讨论关于跨平台3D引擎开发的技术.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值