一个超快的3D图形引擎的实现





学计算机图形学时写过一个简单的3D图形引擎, 注意,不是使用OpenGL或 DirectX,连GDI 都没有使用,基本原理是做一个内存区,把它当做一个位图,然后在这个位图上画所有要画的,最后把它画到窗口上去;在Windows下可以通过GDI画到窗口上,而Linux 下我通过SDL 画到窗口上(也可以通过XImage),DOS 下其实可以直接在VRAM上画。这种方式实现起来比较困难,每一个点都要自己画,但好处是非常快,而且我们拥有完全的控制权。

这个引擎大致实现了如下几点:
1. 三维空间变换
    这当然是最基本的啦,否则以下根本无从谈起。需要说明的是,我实现的是一个相当标准和自由的变换方式,观察点的位置和方向是随意的。

2. Gouraud Rendering
    简单地说,就是线性插值;比如,一维的情况下,画一条长为100 像素的线,要求线的一端为红色,另一端为绿色,中间的颜色从红色渐变到绿色。不过到了三维,情况变得比较复杂,一般的书上也没有把话说清楚,更不可能有可实现的代码。
    一般做这方面的演示就是那个著名的 cube,下面是这个引擎的截图(保存时用的是JPEG,有点失真,实际效果要好得多,特别是后面的 Texture 和 RayTracer):


3. Lighting
    这个光照实现得不是很让我满意,不过毕竟还有一点启发意义,就忝列其中了


4. Texture Mapping
    不管你相信不相信,Texture Mapping 的算法和 Gouraud Rendering 的算法基本上是一样的,我后来还写了一个C++ 模板函数,专门用来处理这种应用。再次强调,实际效果要好很多,不过没办法,JPEG 有失真,但压缩率很高。


5. RayTracer
    本质上,光线跟踪完全是另外一种图形引擎的设计方式(还有一个比较著名的是Radiosity),原理也非常简单。可既使这么简单,真正实现出来的也没有多少,教科书上从来也没有过什么可用的代码。这里的实现有一点BUG,仔细观察,其中有一些黑点,目前正在检查元凶。图片上有一些模糊,这是JPEG 失真的结果,实际跑起来是很清晰的。


    以上的这几个东东是很适合教学的,你可能以为要好几千行才能做到,而实际上,前三个实现,每一个的核心代码只有几十行,最后一个也不过几百行,代码拿到面前,也许一个小时都能看完。而且整个实现采用C++面向对象的方式实现,也没有用到什么希奇古怪的语法,其主要部分(与窗口无关的部分)在VC6,VC7,GCC,Watcom C/C++, Borland C++ Builder甚至古老的 Borland C++3.1, Turbo C++ 上都能正常编译。俗话说,大道至简,我这些代码算不上什么大道,但却是我大学里几个月的心血。

    今天,我已经正式参加工作,可惜的是,我的工作基本与图形学无关。想着这些代码可能对大家有些帮助,也想着它们能够哪一天重见天日,发挥应有的作用,就挑出一部分献丑了。需要说明的是,这些代码不完全是无偿的,我会索取合理的报酬,如果感兴趣,可以联系我。

好了,就贴出这几个吧,我的代码库里还有不少好玩的代码,下次再列吧。

我的联系方式:
QQ: 793574355
email: lionhunter2010@163.com
也可以回复此贴,把你的联系方式写上
  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 21
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值