注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

fanhq666的博客

Fan-Fun

 
 
 

日志

 
 

光线追踪:第一次尝试  

2010-08-12 12:26:11|  分类: 程序 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
光线追踪是一个热门的话题。它的核心思想是把原来光栅化的渲染方式改成追踪从每个像素点发出的光线。
得到一本“3d计算机图形学"之后,我决心进行一次尝试,自己动手写一个简单的光线追踪程序。
光线追踪的基本框架是:计算出每个像素点对应的从眼睛发出的光线,检测它碰撞到的第一个物体,
利用光源和局部光照模型计算颜色,并递归的计算从碰撞点发出的反射光、折射光的颜色,最后混合。
核心在于碰撞检测以及光照模型。
我费了半天劲鼓捣出了一套射线和球求交点及法线的公式,并自己凭空创造了一套光照计算的公式,之后就开始动手了。
过程很痛苦。虽然我把算法做了一堆简化,包括把从眼睛发出的光改为平行光,只支持球体和点光源,但代码依然达到11k。
http://cid-354ed8646264d3c4.office.live.com/self.aspx/.Public/RayTrace/trail1.zip
可以贴一张成果图:
光线追踪:第一次尝试 - fanhq666 - fanhq666的博客
观察几个细节:
1.透明的蓝色泡泡向红球投下了带着一点蓝色的阴影
2.玻璃球展现出了透镜的效果
3.底部的白球将上面三个球的影映在了自己身上
4.图像边缘的抗锯齿效果
 
上面几个效果如果想用光栅化的方式进行渲染可是要颇费一番功夫的。
但用光线追踪的技术去实现,就变得十分自然
1:阴影的形成是由于红球表面进行光照计算时,向光源发出的探测光线被泡泡阻挡从而亮度被降低。
2:光线到达玻璃球后折射,从而形成近似透镜的效果。
3:光线到达白球之后反射,从而形成镜面的效果
4:所谓抗锯齿,就是每个像素多发出几道光线,之后取平均值不就行了
 
光线追踪也带来了一些新的思考方式。
例如:在用openggl绘制时,
某些光滑曲线需要把它拆成一连串线段,
而由众多小物体组成的大场面或许根本没有时间把所有的小物体都生成出来。
但用光线追踪就一点障碍也没有:
只要能够快速计算出射线和物体的交点,就可以将它绘制出来,无论它原来是多么复杂或庞大。
也就是说:不需要它存在,只需要我们能够把它算出来。
 
“3d计算机图形学”的作者也写了一个光线追踪包,我把它下载了下来:
想把它编译出来可是要费一些周折的。我用VS2005终于编译成功,但是好像raytracekd这个程序出问题了。
看了一下raytrace.cpp的演示效果,我不得不赞叹buss的功力:如此之快!
其实,我的代码常数非常大也不是什么好意外的事情,毕竟写它的目的仅仅是用来试验。
 
如果你对光线追踪也很感兴趣,那么快点自己动手吧。
  评论这张
 
阅读(774)| 评论(2)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017