告别了2007,好安心做点正事了。不过恐怕还是安心不下来,因为近期需要完成的任务太多太紧,我有点担心自己的能力了。CG作业已经完成了,我花了3天时间写完了光照渲染、2天时间写掉了光栅图形生成的Demo。虽然不是特别快,但长时间的身心疲惫,能有这样的结果我已很满足了。可能是自己喜欢追求完美,对接下来的网络作业我坚持要做到自己满意,所以还是要坚持在linux下开发sniffer。(或许有人认为我是自讨苦吃,让他们说去吧)。
好了,来说说这个作业吧。发布它的原因不是我觉得做得好,是因为
1. 这些都是Demo性质的作业,今后不会有什么特别应用,不过如果刚学习CG可以当作参考
2. 程序构架上我还是花了不少精力的,特别一些代码片断,比如仿造Photoshop的色彩选择器、演示光栅绘图的框架代码、基于PS2.0 ASM的渲染框架,这些今后如果各位需要作类似的东西,不妨拿去直接用。一些手法也可以作为参考(当然我保留版权)。
先介绍这次CG的选作题:光照模型的实现。
(光栅绘图部分见后文)
下面是用本程序渲染的效果:
上图是本程序分别用Phong和Gouraud渲染模型产生的图片。Phong模型要比Gouraud细腻,原因就是对法向量进行插值。不过要知道DirectX里面是不支持的
多重光源的渲染效果
由于时间太紧张,我也有一定的偷懒,那就是采用了DirectX3d作为框架,不过当然,光照部分我是自己重写的。而能重写光照的办法无外乎处理纹理或者就是——采用Programmable Shader, 也就是常提到的Vertex Shader和Pixel Shader, 通过对GPU的编程来实现光照。这样的好处是效率很高,基本不用优化、而且不用花很多精力去处理无关的东西。不过坏处么...对显卡有一定的要求,如果显卡不支持DirectX8的话,那本程序完全不能跑(相信现在这样的机器也快淘汰了)。如果不支持DirectX9,那么Phong渲染模型无法开启。因为Phong我采用Pixel Shader 2.0实现的。而Gouraud我只用了Vertex Shader 1.1。(注:这是我第一次接触D3d, 说错什么不负责)
所以本次作业也可以看成是我对VS和PS编程的实践... 而且我没有用HLSL或Cg这类语言,而是直接用GPU汇编写的。所以对VS和PS汇编编程的朋友可以看看
不过相信类似的代码也不少吧。对Phong的实现我是将顶点的法向量和坐标作为定点的贴图坐标(不过是3维贴图),然后再PS中GPU就会自动实现法向量的插值(当作贴图了)。这样直接在PS中实现光照算法即可。
下面是本程序完成的特性:
- 所实现的光照模型:
漫反射模型
反光模型
环境光照模型
对于片面模型表面像素的渲染,本程序支持如下插值算法
Flat模型
Gouraud顶点色彩插值模型
Phong定点法向量差值模型
本程序支持具有色彩的光源,同时实现了如下类型的光源
环境光源
线光源
点光源
在程序的交互性上,具有如下功能
通过鼠标或者轨迹球改变物体的方位(旋转和平移)
可以实时选择需要渲染得模型(茶壶、指环、球体)
动态添加、删除光源
改变光源的属性,包括颜色、方位、类型、名称
改变物体的属性,如表面材质信息
改变环境光源
察看当前光照模型算法的GPU渲染程序(汇编形式)
最后附上本程序的截图:
程序和源代码的下载地址见:
ftp://FTP_Visitor:visitor@ftp.csksoft.net/Public/Products/APP/fine_cg.rarftp://FTP_Visitor:visitor@ftp.csksoft.net/Public/Products/code_and_lib/fine_cg_src.rar
由于采用了WTL库,所以需要编译的话请自行下载(十分推荐,比MFC好很多)。同时,如果对上面那个选色器感兴趣,不妨提取出来用吧。(需要DirectX 9.0c)
其中的PS和VS代码我就不贴出来了,程序里面能看到。
光栅绘图部分:
这部分主要是对下面几个算法的演示。
算法 | 说明 |
直线的DDA算法 | 使用了教材中的扩展算法 |
直线的Bresenham算法 | |
圆的Bresenham算法 | 支持任意位置绘图,下同 |
圆的中点生成算法 | |
椭圆的中点生成算法 | |
程序的界面如图:
算法上没啥好说的,都是经典的光栅化算法。主要是这个Demo用于CG学习还是不错的,支持鼠标拖动。还有可以作为WTL类库的使用教程:-P
同样也带有我做的色彩选择器,这次来个大一个的截图:
要求里所谓的“鼠标交互”,其实也蛮无聊的
大致就这些了,代码和程序在这,还是一样,要编译需要WTL(我想看到这里你可以去看看WTL的说明了:-)
http://www.csksoft.net/data/legacyftp/Products/APP/flat_demo_csk.rar
http://www.csksoft.net/data/legacyftp/Products/code_and_lib/flat_demo_src.rar
ok,最后附上写的cg报告,不过基本属于吹牛,光照的原理部分可以稍微看看:
http://www.csksoft.net/data/legacyftp/Article/cg_final_report.rar
文章写完了,其实我很希望下周三以后再这里发布我的Linux 版Sniffer, 名字已经取好了,暂时不透露。