我所遭遇过的中间件--VTK
Vtk是我接触的第一款软件开发包,它引导我对图形学的入门.我是先学的VTK,后学的OpenGL和D3D.VTK是专为图形学开发,特点是接口清晰,好上手,又含有大量的图像处理算法.从VTK入手3D图形学,要比从OpenGL和D3D容易的多.
最初接触VTK是研一那年暑假,研一时我做医学图像处理.VTK很适合由图像处理转到3D图形学,对做医学图像也很方便.它集成着DICOM图像文件格式的解析器.我看过解析DICOM文件的代码,大约5000多行.这代码量对当时的我来说如同天文数字,而使用VTK,几行代码就可以搞定.这就是中间件的方便之处,为开发者提供成熟的功能.我用VTK做三维医学图像绘制,原始数据是一系列的CT断层切片图像,对其做三维重建,以3D的形式显示.有两种绘制方式,体绘制和面绘制,这方面的资料有很多,我就不细讲了.
我在VTK上投入了极大的激情,VTK的大部分Demo是用一种名为Tcl的脚本语言写的,我便将它们翻译成C++代码.记得有一年的圣诞还是元旦的,我在实验室花了一晚上的时间,将一个Tcl的DEMO改成C++,总共有2000多行代码.程序功能是各种三维图形的堆集.而后我还翻译<Vtk User Guide>,激情燃烧的岁月竟然搞了VTK.我还是国内两个VTK论坛的版主,发过很多关于VTK的帖子,受到很多网友的吹捧,当时我还真有种欣欣然的感觉.但现实总让人很无奈,VTK只是一种现成的图形技术,研究生的工作重点不在于做出了多么牛的软件,不在于你掌握了多强的技术,而是你提出了什么理论,发表了什么论文.不管理论是否可行,能够实现,甚至不管论文的数据是否真实.只要你的理论让人看上去深奥一些,能自圆其说,该有的数据看上去正常一些,毕业就是如此容易.可惜我是在研二结束的开题评审后,才意识到这件事.当时我的开题是要做一套医学三维图像显示系统,并准备了很多自己生成的三维效果截图.但评审老师很明确的指出我的问题,没有自己的理论.幸好我的导师在院里地位高,我的评审算过了.而我的研究课题就改成了三维医学图像体数据分割与显示.三维体数据分割,这个方向算不错,在当时搞的人少又比较新.但我已然没有搞这算法的激情了,既然造数据就能发论文,何必再写代码生成数据呢?我提出的理论为基于8叉树的三维体数据分割,然后实验的截图是用VTK本来提供的区域增长法得到的,具体的算法性能数据是自己编造的.于是顺利完成毕业论文,顺利答辩通过,顺利毕业.毕业时,将自己写的VTK的程序都发布到网上,我就再也没有碰过VTK.毕业两年后,接了个私活是代人写硕士毕业论文,题目还是三维体数据分割,这次又提出一个算法为基于自适应包围盒的体数据分割.当时参考了若干篇毕业论文,发现有个人的实验数据和我的一模一样,有点搞笑,我的数据也是假的.不过这次代人写论文时,我用代码实现了基于8叉树的三维体数据分割和基于自适应包围盒的体数据分割这两种算法.在我的博客中已经将算法的详细介绍以及代码发布出去了.只是,代码我也没有运行调试过,当年的运行环境,实验的原始图像数据已经不存在了.
再回到VTK的话题上,由于已经五,六年没有碰过VTK了,这门手艺算是废了.记得VTK对数据的处理是一种管道流的架构,这很符合图像的滤波处理,输入图像经过处理后再输出图像.多个滤波器可以串行处理,实现复杂的图像处理.不过话又说回来,所有的图像处理都不是完美的,任何一个滤波操作会有一定的信息丢失.也就是说,图像还是原始的好.VTK提供的官方的DEMO大多采用面向过程的流程,一套数据,从加载到渲染一路串下来很清晰.VTK的低层渲染用的是OpenGL但是在VTK对外提供的接口中,看不到任何OPENGL的影子,VTK将OPENGL完全封装了.记得当年论坛上有人问能否在VTK中集成OPENGL,答案是当然可以,只是怎么集成我没研究过.当年VTK的体绘制非常卡,不知道现在优化的怎么样.毕竟过去这么多年了,算法和硬件都提升了很多.体绘制也是种很神奇的算法,但在游戏中没人会用.
如果说我在VTK上有什么遗憾的话,那就是:我从没有看过VTK的源码.当年我仅仅满足于论坛上一群粉丝的热捧,自我感觉良好,却没有意识到自己是井底之蛙.我不过是VTK的一个User,连Reader都算不上,更别提Developer了.在这里,我不得不佩服国外这些写开源软件的人.VTK是一款很棒的图形引擎,又是开源,没有好好读下它的源码实在遗憾.它有几个MESH三角形细分的算法,有一些曲线生成,曲面生成的算法,值得一看.