学计算机图形学时写过一个简单的3D图形引擎, 注意,不是使用OpenGL或 DirectX,连GDI 都没有使用,基本原理是做一个内存区,把它当做一个位图,然后在这个位图上画所有要画的,最后把它画到窗口上去;在Windows下可以通过GDI画到窗口上,而Linux 下我通过SDL 画到窗口上(也可以通过XImage),DOS 下其实可以直接在VRAM上画。这种方式实现起来比较困难,每一个点都要自己画,但好处是非常快,而且我们拥有完全的控制权。
这个引擎大致实现了如下几点:
1. 三维空间变换
这当然是最基本的啦,否则以下根本无从谈起。需要说明的是,我实现的是一个相当标准和自由的变换方式,观察点的位置和方向是随意的。
2. Gouraud Rendering
简单地说,就是线性插值;比如,一维的情况下,画一条长为100 像素的线,要求线的一端为红色,另一端为绿色,中间的颜色从红色渐变到绿色。不过到了三维,情况变得比较复杂,一般的书上也没有把话说清楚,更不可能有可实现的代码。
一般做这方面的演示就是那个著名的 cube,下面是这个引擎的截图(保存时用的是JPEG,有点失真,实际效果要好得多,特别是后面的 Texture 和 RayTracer):
![](https://p-blog.csdn.net/images/p_blog_csdn_net/lionhunter2010/354738/o_cube.jpg)
3. Lighting
这个光照实现得不是很让我满意,不过毕竟还有一点启发意义,就忝列其中了
![](https://p-blog.csdn.net/images/p_blog_csdn_net/lionhunter2010/354738/o_lighting.jpg)
4. Texture Mapping
不管你相信不相信,Texture Mapping 的算法和 Gouraud Rendering 的算法基本上是一样的,我后来还写了一个C++ 模板函数,专门用来处理这种应用。再次强调,实际效果要好很多,不过没办法,JPEG 有失真,但压缩率很高。
![](https://p-blog.csdn.net/images/p_blog_csdn_net/lionhunter2010/354738/o_texture.jpg)
5. RayTracer
本质上,光线跟踪完全是另外一种图形引擎的设计方式(还有一个比较著名的是Radiosity),原理也非常简单。可既使这么简单,真正实现出来的也没有多少,教科书上从来也没有过什么可用的代码。这里的实现有一点BUG,仔细观察,其中有一些黑点,目前正在检查元凶。图片上有一些模糊,这是JPEG 失真的结果,实际跑起来是很清晰的。
![](https://p-blog.csdn.net/images/p_blog_csdn_net/lionhunter2010/354738/o_raytracer.jpg)
以上的这几个东东是很适合教学的,你可能以为要好几千行才能做到,而实际上,前三个实现,每一个的核心代码只有几十行,最后一个也不过几百行,代码拿到面前,也许一个小时都能看完。而且整个实现采用C++面向对象的方式实现,也没有用到什么希奇古怪的语法,其主要部分(与窗口无关的部分)在VC6,VC7,GCC,Watcom C/C++, Borland C++ Builder甚至古老的 Borland C++3.1, Turbo C++ 上都能正常编译。俗话说,大道至简,我这些代码算不上什么大道,但却是我大学里几个月的心血。
今天,我已经正式参加工作,可惜的是,我的工作基本与图形学无关。想着这些代码可能对大家有些帮助,也想着它们能够哪一天重见天日,发挥应有的作用,就挑出一部分献丑了。需要说明的是,这些代码不完全是无偿的,我会索取合理的报酬,如果感兴趣,可以联系我。
好了,就贴出这几个吧,我的代码库里还有不少好玩的代码,下次再列吧。
我的联系方式:
QQ: 793574355
email: lionhunter2010@163.com
也可以回复此贴,把你的联系方式写上