一个支持 RIB 和 RSL 的高速 raytracer,高速得可以近实时进行光线跟踪。
经过了一年多的断断续续的开发,BloomingQuad 终于已经成型了,并能向一些实际应用性工作迈进,比如 Ambient Occlusion ,或者 RSL Shader。
其实我已经写疯了,所以现在我似乎都不知道应该写什么来介绍它好。
然而,我刚刚毕业了,离开了舒服的学校,接下来必须面对吃饭问题。
所以、开门见山,我现在发布的 BloomingQuad 其实并不完善(应该说相当不完善),我 90% 是为了找工作才发布的,又或者说,希望能找到懂得它的作用和意义的合作伙伴。
很多人说我不切实际、又说我开发些没有 P 用的东西,也有很多人不屑,我不在乎,因为只要这个世界上依然有一个人懂得下面这些东西是什么,那就已经足够了。当然,还希望那个人能支持我继续做下去。
Ambient Occlusion 演示。
把它作为商业用渲染器,在国内唯一有用武之地的就是为专业工作室定制特殊的渲染效果,又或是一些需要用到更开放的渲染技术的高端项目。简而言之、就是作为 In house Renderer.
但也必须先讲明白,开发和维护这么一个东西,是极其不容易的,在目前来说投入与产出可能不成正比,它的价值,必须在一段时间的积累后才能看到。 Pixar 开发的 PRMan 也不是一年半载就能为它渲染电影的,80 年的项目,到了 95 年才渲染出第一部动画电影。
尽管这是一场持久战,但若我们真想达到 Pixar 的高度,一味地研究别人开发出来的软件和技术是徒劳的,鼻子将永远被别人牵着走。
那么除了开发一个 PRMan 的替代品外,我也自认通过这个渲染器的开发,我已经对整个 RenderMan 体系有非常深入的了解,甚至对各种渲染器的工作体系和结构有了很深刻的认识。不仅仅是 RenderMan ,MentalRay 的 MI 架构也是我的重点研究部分,BloomingQuad 的前几版所使用的 Scene Description 就是类 MI 的节点式结构。
不过后来我觉得 RenderMan 比 MentalRay 要流行得多,而直接使用 RIB 会更划算,于是我开始把整个结构体系进行重写,以 RI Spec 3.3 为标准,力求可以完全符合 RI Spec 3.3 ,希望能渲染出和 PRMan (在轮廓和基本要素上)一致的图像。
当然这是非常艰难而痛苦的,特别是一个人、只能利用课余时间编写。
为了达到能在实际渲染中使用,我把整个渲染器都使用了 SSE/SSE2 指令优化,尤其是 Raytrace 核心部分,全部用汇编写成,速度“可以说”非常快,能达到(某一测试场景)1800 万次/秒,约是 Pixie 的 2 倍。
而最后,为了找到商业使用的机会,我修改了一下内核,使它能实现简单的 Realtime Raytrace,以直观的方法表现它到底有多快。
Realtime ~ 这个场景比较少面,所以也能达到 7 fps 左右,320 X 240
400 X 300 的 realtime 演示,我绝对不会使用 Sphere、Box 这些直接简化了 Intersection 的东西来自欺欺人,所有演示的物体都是 General 多边形。
支持 RSL 的编译与执行、上面的三个物体都分别使用了编写的 Shader ,盒子用了 Slim 生成的 Worley ,平面用了 step( x , mod() ) 形式的 Grid ,球体利用 s 坐标混合了 Thead 和 Spline ( Noise( P ) )。
另外我也终于完成了持久的“抗战”,写出了一个 RenderMan Shading Language 编译器与执行虚拟机。这个编译器符合 RI Spec 3.3 标准,能成功编译出 Slim 生成的各种 Shader ,而且支持 Constant Folding、Instruction Replacement、Dead Code Elimination 等优化。但目前它的光照部分(包括 Illumination 和 Illuminate 、Solar、Ambience)都在测试中,Gather 正在编写,而 Occlusion 和 Indirect Diffuse 只能靠命令行激活。
相信有更多人(可能一共才只有几个吧)会关心它到底怎么在 Max、Maya 、XSI 中使用,其实很简单,RIB 非常流行,几乎所有的大型软件上都有导出 RIB 文件的软件,MAX 有 maxman,Maya 有 RAT、mayaman、liquid,XSI 有 rib 插件,LW 有 Lightman,Houdini 本身直接支持,所以根本不需要担心、所有的大型软件都能和 BloomingQuad 进行沟通。
而且我能保证 MTOR 从 Maya 里导出的东西能大部分正确渲染。
大部分是指哪些部分呢?其实目前仅仅是指多边形而已,而且最好是三角片面的多边形,又或者保证“合法”的多边形,若有重边或者法线有问题,都不能渲染。
上面测试用的两个人头模型,都是我自己在 Maya 里做的,然后用 MTOR 导出来渲染的,可以看看它到底渲染出来的结果准确不准确。
如果你想直接在 Maya 里渲染 —— No problem ,在 RAT 里设置一下就 OK 了。
也可以在 Maya 里启动实时 raytrace ~
说实在,这个 Realtime Raytrace 不太 Realtime,当然,我只是修改了一下 Render Loop 就拿出来了,里面的模型结构、Shading 体系,都是按照软渲染设计的,和普通软渲染共用同一个结构,没有作任何的实时渲染优化,所以能跑出这个 fps ,我自己就觉得已经 OK 了。
为了要说明它是 Realtime 的,我还设计了几个按键,i k l j , . 这六个,可以移动镜头,很简陋的功能而已,当然可以做得更复杂一些,但我目前只是演示一下我能做到什么地步,而怎么再精益求精则是在我解决了工作问题之后再想的事情了。
那么基本上都讲得 7788 了,开发过程还有很多有趣的东西,不过这只是很少数比较关心开发的人想要知道的。
其实这个所谓“渲染器”所能做到的还很有限,毕竟我只有一双手、一个脑袋,但我所希望的是能通过它让更多人看到,到底我们的开发能够做到些什么出来。
并不是说,别人的软件、所实现的功能,我们就一定绝对无法赶得上,这个说法是完全错误的。
问题在于,一直以来我们从来没有怎么在这上面投入过,大部分人都在观望,还有的在冷嘲热讽。
对,可能还没有这个市场、可能技术还不成熟,但必须有人去尝试,必须有人出来承担这个责任。
上面那些效果,在大部分人用商业渲染器看来,很幼稚。不过这仅仅是一个开始,我用一年时间做到了一个开始。
或许我最后还是要被迫放弃 CG 的工作,放弃我喜欢的开发,放弃我要超越 PRMan 的梦,但发这个帖子,除了为我自己找一个机会以外,更多的是希望大家在建模的时候、在 Rig 的时候、在 Surfacing 的时候、在 Key 动作的时候、在等待渲染的时候,能多想一想、什么时候我们能用我们自己的 CG 软件去做这些事情。
下载:
两个文件解压到任何一个文件夹都可以,如果想要在 Maya 里调用,就必须放到 RAT 能找到的目录里,比如任何一个在 PATH 里的目录。
注意!必须是支持 SSE2 指令集的机器(即 P4、PM、A64)才可以运行。
在命令行里输入:
bqrd -rt occlusion.rib
即可进入 Realtime 测试。
bqrd -oc 32 king-triangle.rib
测试渲染 Ambient Occlusion,其中 -oc X 是指定采样的数目。
而 rscl 是 RSL 的编译器,懂 RenderMan 的朋友可以试一下自己写 Shader 给 rscl 编译,.shader 的文件是已经编译好了的 Shader。
注意!illuminance、illuminate、gather 等 statement 目前仍不支持,所有的 Derivative 都有限度支持(不支持 Du() 与 Dv() ,dPdu 与 dPdv 的结果只能作为切线方向)。
其它都合符 RenderMan Interface Specification 3.3 。
p.s.
渲染完成后可以按 's' 快捷键把渲染结果储存成 TIFF 格式的图片。
渲染窗口中按 F1 可以看到其它快捷键表,可以显示独立通道、或者混合显示 alpha 等等。