每年总有那么几个星期不想写编译器,这个时候做做ray tracing就变成一件很美妙的事情了。因此这个星期重写了当年那个超烂的光线追踪,然后加上了贴图的功能。当然图是可以直接贴在物体上的,还支持了法线贴图,譬如说下面做的地球在不同方向的光线的照射下显得有立体效果:
之所以FPS有16是因为我已经不再当年那个破thinkpad上渲染,而在一个i7四核超线程三通道的CPU上做了。渲染的时候为了简单,把屏幕等分成了八行,然后创建八个线程分别绑定到八个CPU上面去(SetThreadAffinityMask),最后渲染完出来。当然比起那些专业的还是显得相当慢,现在很多光线追踪软件都用了GPU来做,不过我GPU也没用,SSE指令也没用,就纯粹C++写。如今也懒得用C++做GUI了,所以把核心用C++做成了之后,export几个函数出来,用C#的P/Invoke直接调用。C++渲染完以后给一个HBITMAP,C#拿过来就往窗口上画,还是十分方便的哈。多语言开发万岁。
重写了光线追踪之后仍然把折射和反射给做了,因此可以做出个类似凸透镜一样的东西:
需要提一下的是,做贴图的时候实现了nearest、linear和bicubic三种插值方法。nearest基本上就是不插值,所以放大了之后会有马赛克效果。linear是线性插值,如果放得太大还是能看出一点模糊的马赛克。bicubic效果就好很多了,如果大家有兴趣的话可以到
这里去看。为了达到更好的效果,后面还有计划做ray differential和各向异性过滤。ray differential之后就可以做photon mapping(一种比较高效的全局光照模型)了。做完photon mapping之后,无聊的心情大概就结束了,可以继续写编译器了吧。
嗯嗯,虽然ray differential和photon mapping还没做,
我就先把代码丢上啦,不仅可以做备份,大家也能搞下来看一看。当然需要有Visual Studio 2010才能编译的。选择release编译之后到release文件夹下去启动,debug的话慢的不能忍。而且我的多线程模型是一个核(超线程的话算两个)一个线程,那些古老的双核CPU大概性能会很惨不忍赌吧……
posted on 2011-01-08 23:54
陈梓瀚(vczh) 阅读(6954)
评论(15) 编辑 收藏 引用 所属分类:
3D