CSK.Blog--个人原创Weblog

« Reloadthe lost part »

还算看得过去,我的CG实践作业及代码

告别了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.rar

 

ftp://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, 名字已经取好了,暂时不透露。

  • 相关文章:
  • quote 1.vinjn
  • 你这个缩略文太具迷惑性了,还以为是soft-rendering的,把我吓坏了。
    phong我的破机器自然是跑不动的
    界面一如既往的漂亮

    我这次很bt的没有用windows的控件,用ddraw自画了一些需要的元素,效果还不错。
    3d部分完成度很高,一个基于ddraw的引擎,最后的效果么,勉强也算是个动画场景吧,有光照,有gouraud shader。纹理勉强实现了下,但是效果差,效率低,就没放进去。
    这东西我打算做下去,然后开源。
  • 1/13/2008 12:54:48 AM 回复该留言

发表评论:

注意:为了有效防止SPAM,任何含有http://字样的消息会被阻止发布同时,本站仅供技术交流,请不要讨论任何政治敏感话题或者低级趣味问题。

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

日历

最新评论及回复

最近发表

Copyright Shikai Chen 2000-2012. Powered By Z-Blog(CSK Modified)