﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-Raytrace world-随笔分类-Blooming Quad</title><link>http://www.cppblog.com/chaos/category/178.html</link><description>Chaos 的光线跟踪世界</description><language>zh-cn</language><lastBuildDate>Tue, 20 May 2008 09:55:41 GMT</lastBuildDate><pubDate>Tue, 20 May 2008 09:55:41 GMT</pubDate><ttl>60</ttl><item><title>About Blooming Quad，我的准实时光线跟踪渲染引擎</title><link>http://www.cppblog.com/chaos/archive/2005/10/21/BQ.html</link><dc:creator>Chaos Chiao</dc:creator><author>Chaos Chiao</author><pubDate>Fri, 21 Oct 2005 13:29:00 GMT</pubDate><guid>http://www.cppblog.com/chaos/archive/2005/10/21/BQ.html</guid><wfw:comment>http://www.cppblog.com/chaos/comments/784.html</wfw:comment><comments>http://www.cppblog.com/chaos/archive/2005/10/21/BQ.html#Feedback</comments><slash:comments>19</slash:comments><wfw:commentRss>http://www.cppblog.com/chaos/comments/commentRss/784.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/chaos/services/trackbacks/784.html</trackback:ping><description><![CDATA[<DIV>&nbsp;</DIV>
<DIV>一个支持 RIB 和&nbsp;RSL 的高速 raytracer，高速得可以近实时进行光线跟踪。</DIV>
<DIV>&nbsp;</DIV>
<DIV>
<HR>
</DIV>
<DIV><A href="http://www.chinadv.com/forum/Web/UpFiles/2005/7/4/35980179.jpg"><FONT color=#e68328>大图</FONT></A></DIV>
<DIV><FONT color=#e68328></FONT>&nbsp;</DIV>
<DIV><A><FONT color=#e68328><IMG style="ZOOM: 50%" src="http://www.chinadv.com/forum/Web/UpFiles/2005/7/4/35980179.jpg" border=0></FONT></A></DIV>
<DIV><FONT color=#e68328></FONT>&nbsp;</DIV>
<DIV>经过了一年多的断断续续的开发，BloomingQuad 终于已经成型了，并能向一些实际应用性工作迈进，比如 Ambient Occlusion ，或者 RSL Shader。<BR><BR>其实我已经写疯了，所以现在我似乎都不知道应该写什么来介绍它好。<BR><BR>然而，我刚刚毕业了，离开了舒服的学校，接下来必须面对吃饭问题。<BR><BR>所以、开门见山，我现在发布的 BloomingQuad 其实并不完善（应该说相当不完善），我 90% 是为了找工作才发布的，又或者说，希望能找到懂得它的作用和意义的合作伙伴。<BR><BR>很多人说我不切实际、又说我开发些没有 P 用的东西，也有很多人不屑，我不在乎，因为只要这个世界上依然有一个人懂得下面这些东西是什么，那就已经足够了。当然，还希望那个人能支持我继续做下去。</DIV>
<DIV>&nbsp;</DIV>
<DIV>
<HR>
</DIV>
<DIV>&nbsp;</DIV>
<DIV><A href="http://www.chinadv.com/forum/Web/UpFiles/2005/7/4/54319736.jpg"><FONT color=#e68328>大图</FONT></A></DIV>
<DIV><FONT color=#e68328><IMG style="ZOOM: 60%" src="http://www.chinadv.com/forum/Web/UpFiles/2005/7/4/54319736.jpg" border=0></FONT></DIV>
<DIV><FONT color=#e68328></FONT>&nbsp;</DIV>
<DIV>Ambient Occlusion 演示。</DIV>
<DIV>&nbsp;</DIV>
<DIV>
<HR>
</DIV>
<DIV>&nbsp;</DIV>
<DIV>把它作为商业用渲染器，在国内唯一有用武之地的就是为专业工作室定制特殊的渲染效果，又或是一些需要用到更开放的渲染技术的高端项目。简而言之、就是作为 In house Renderer.<BR><BR>但也必须先讲明白，开发和维护这么一个东西，是极其不容易的，在目前来说投入与产出可能不成正比，它的价值，必须在一段时间的积累后才能看到。 Pixar 开发的 PRMan 也不是一年半载就能为它渲染电影的，80 年的项目，到了 95 年才渲染出第一部动画电影。<BR><BR>尽管这是一场持久战，但若我们真想达到 Pixar 的高度，一味地研究别人开发出来的软件和技术是徒劳的，鼻子将永远被别人牵着走。<BR><BR>那么除了开发一个 PRMan 的替代品外，我也自认通过这个渲染器的开发，我已经对整个 RenderMan 体系有非常深入的了解，甚至对各种渲染器的工作体系和结构有了很深刻的认识。不仅仅是 RenderMan ，MentalRay 的 MI 架构也是我的重点研究部分，BloomingQuad 的前几版所使用的 Scene Description 就是类 MI 的节点式结构。<BR><BR>不过后来我觉得 RenderMan 比 MentalRay 要流行得多，而直接使用 RIB 会更划算，于是我开始把整个结构体系进行重写，以 RI Spec 3.3 为标准，力求可以完全符合 RI Spec 3.3 ，希望能渲染出和 PRMan （在轮廓和基本要素上）一致的图像。<BR><BR>当然这是非常艰难而痛苦的，特别是一个人、只能利用课余时间编写。</DIV>
<DIV>&nbsp;</DIV>
<DIV>为了达到能在实际渲染中使用，我把整个渲染器都使用了 SSE/SSE2 指令优化，尤其是 Raytrace 核心部分，全部用汇编写成，速度“可以说”非常快，能达到（某一测试场景）1800 万次/秒，约是 Pixie 的 2 倍。<BR><BR>而最后，为了找到商业使用的机会，我修改了一下内核，使它能实现简单的 Realtime Raytrace，以直观的方法表现它到底有多快。</DIV>
<DIV>&nbsp;</DIV>
<DIV>
<HR>
</DIV>
<DIV>&nbsp;</DIV>
<DIV><A href="http://www.chinadv.com/forum/Web/UpFiles/2005/7/4/60540141.jpg"><FONT color=#e68328>大图</FONT></A></DIV>
<DIV><FONT color=#e68328><IMG style="ZOOM: 70%" src="http://www.chinadv.com/forum/Web/UpFiles/2005/7/4/60540141.jpg" border=0></FONT></DIV>
<DIV><FONT color=#e68328></FONT>&nbsp;</DIV>
<DIV>&nbsp;Realtime ~ 这个场景比较少面，所以也能达到 7 fps 左右，320 X 240</DIV>
<DIV>&nbsp;</DIV>
<DIV>
<HR>
</DIV>
<DIV>&nbsp;</DIV>
<DIV><A href="http://www.chinadv.com/forum/Web/UpFiles/2005/7/4/19351421.jpg"><FONT color=#e68328>大图</FONT></A></DIV>
<DIV><FONT color=#e68328><IMG style="ZOOM: 60%" src="http://www.chinadv.com/forum/Web/UpFiles/2005/7/4/19351421.jpg" border=0></FONT></DIV>
<DIV><FONT color=#e68328></FONT>&nbsp;</DIV>
<DIV>400 X 300 的 realtime 演示，我绝对不会使用 Sphere、Box 这些直接简化了 Intersection 的东西来自欺欺人，所有演示的物体都是 General 多边形。<BR></DIV>
<DIV>
<HR>
</DIV>
<DIV>&nbsp;</DIV>
<DIV><A href="http://www.chinadv.com/forum/Web/UpFiles/2005/7/4/39913397.jpg"><FONT color=#e68328>大图</FONT></A></DIV>
<P><FONT color=#e68328><IMG style="ZOOM: 50%" src="http://www.chinadv.com/forum/Web/UpFiles/2005/7/4/39913397.jpg" border=0></FONT></P>
<P><FONT color=#e68328></FONT>&nbsp;</P>
<P>支持 RSL 的编译与执行、上面的三个物体都分别使用了编写的 Shader ，盒子用了 Slim 生成的 Worley ，平面用了 step( x , mod() ) 形式的 Grid ，球体利用 s 坐标混合了 Thead 和 Spline ( Noise( P ) )。</P>
<P>&nbsp;</P>
<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 只能靠命令行激活。<BR></P>
<P>
<HR>

<DIV><A href="http://www.chinadv.com/forum/Web/UpFiles/2005/7/4/44045248.jpg"><FONT color=#e68328>大图</FONT></A></DIV>
<P><BR><FONT color=#e68328><IMG style="ZOOM: 40%" src="http://www.chinadv.com/forum/Web/UpFiles/2005/7/4/44045248.jpg" border=0></FONT></P>
<P><FONT color=#e68328></FONT>&nbsp;</P>
<P>相信有更多人（可能一共才只有几个吧）会关心它到底怎么在 Max、Maya 、XSI 中使用，其实很简单，RIB 非常流行，几乎所有的大型软件上都有导出 RIB 文件的软件，MAX 有 maxman，Maya 有 RAT、mayaman、liquid，XSI 有 rib 插件，LW 有 Lightman，Houdini 本身直接支持，所以根本不需要担心、所有的大型软件都能和 BloomingQuad 进行沟通。<BR><BR>而且我能保证 MTOR 从 Maya 里导出的东西能大部分正确渲染。<BR><BR>大部分是指哪些部分呢？其实目前仅仅是指多边形而已，而且最好是三角片面的多边形，又或者保证“合法”的多边形，若有重边或者法线有问题，都不能渲染。<BR><BR>上面测试用的两个人头模型，都是我自己在 Maya 里做的，然后用 MTOR 导出来渲染的，可以看看它到底渲染出来的结果准确不准确。<BR><BR>如果你想直接在 Maya 里渲染 —— No problem ，在 RAT 里设置一下就 OK 了。</P>
<P>&nbsp;</P>
<P>
<HR>

<DIV><A href="http://www.chinadv.com/forum/Web/UpFiles/2005/7/4/28777276.jpg"><FONT color=#e68328>大图</FONT></A></DIV>
<P><FONT color=#e68328><IMG style="ZOOM: 40%" src="http://www.chinadv.com/forum/Web/UpFiles/2005/7/4/28777276.jpg" border=0></FONT></P>
<P><FONT color=#e68328></FONT>&nbsp;</P>
<P>也可以在 Maya 里启动实时 raytrace ~&nbsp;&nbsp;</P>
<P>&nbsp;</P>
<P>
<HR>

<P>&nbsp;</P>
<DIV>说实在，这个 Realtime Raytrace 不太 Realtime，当然，我只是修改了一下 Render Loop 就拿出来了，里面的模型结构、Shading 体系，都是按照软渲染设计的，和普通软渲染共用同一个结构，没有作任何的实时渲染优化，所以能跑出这个 fps ，我自己就觉得已经 OK 了。<BR><BR>为了要说明它是 Realtime 的，我还设计了几个按键，i k l j , . 这六个，可以移动镜头，很简陋的功能而已，当然可以做得更复杂一些，但我目前只是演示一下我能做到什么地步，而怎么再精益求精则是在我解决了工作问题之后再想的事情了。<BR><BR>那么基本上都讲得 7788 了，开发过程还有很多有趣的东西，不过这只是很少数比较关心开发的人想要知道的。<BR></DIV>
<DIV>
<HR>
</DIV>
<DIV>&nbsp;</DIV>
<DIV>其实这个所谓“渲染器”所能做到的还很有限，毕竟我只有一双手、一个脑袋，但我所希望的是能通过它让更多人看到，到底我们的开发能够做到些什么出来。</DIV>
<DIV>&nbsp;</DIV>
<DIV>并不是说，别人的软件、所实现的功能，我们就一定绝对无法赶得上，这个说法是完全错误的。</DIV>
<DIV>&nbsp;</DIV>
<DIV>问题在于，一直以来我们从来没有怎么在这上面投入过，大部分人都在观望，还有的在冷嘲热讽。</DIV>
<DIV>&nbsp;</DIV>
<DIV>对，可能还没有这个市场、可能技术还不成熟，但必须有人去尝试，必须有人出来承担这个责任。</DIV>
<DIV>&nbsp;</DIV>
<DIV>上面那些效果，在大部分人用商业渲染器看来，很幼稚。不过这仅仅是一个开始，我用一年时间做到了一个开始。</DIV>
<DIV>&nbsp;</DIV>
<DIV>或许我最后还是要被迫放弃 CG 的工作，放弃我喜欢的开发，放弃我要超越 PRMan 的梦，但发这个帖子，除了为我自己找一个机会以外，<STRONG><FONT color=#ff0000>更多的是希望大家在建模的时候、在 Rig 的时候、在 Surfacing 的时候、在 Key 动作的时候、在等待渲染的时候，能多想一想、什么时候我们能用我们自己的 CG 软件去做这些事情。</FONT></STRONG></DIV>
<P>&nbsp;&nbsp; 
<HR>

<P></P>
<P>&nbsp;</P>
<P><STRONG>下载：</STRONG></P>
<P><STRONG>rar 包</STRONG> <A href="http://www.chinadv.com/forum/Web/UpFiles/2005/7/4/97004177.rar"><FONT color=#e68328>1</FONT></A> <A href="http://www.chinadv.com/forum/Web/UpFiles/2005/7/4/51712960.rar"><FONT color=#e68328>2</FONT></A>&nbsp;</P>
<P>&nbsp;</P>
<P>
<HR>

<P></P>
<DIV>两个文件解压到任何一个文件夹都可以，如果想要在 Maya 里调用，就必须放到 RAT 能找到的目录里，比如任何一个在 PATH 里的目录。</DIV>
<DIV>&nbsp;</DIV>
<DIV>注意！必须是支持 SSE2 指令集的机器（即 P4、PM、A64）才可以运行。</DIV>
<DIV>&nbsp;</DIV>
<DIV>在命令行里输入：</DIV>
<DIV>&nbsp;</DIV>
<DIV><FONT style="BACKGROUND-COLOR: #000000" color=#ffffff>bqrd -rt occlusion.rib&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</FONT></DIV>
<DIV>&nbsp;</DIV>
<DIV>即可进入 Realtime 测试。</DIV>
<DIV>&nbsp;</DIV>
<DIV><FONT style="BACKGROUND-COLOR: #000000" color=#ffffff>bqrd -oc 32 king-triangle.rib&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </FONT></DIV>
<DIV>&nbsp;</DIV>
<DIV>测试渲染 Ambient Occlusion，其中 -oc X 是指定采样的数目。</DIV>
<DIV>&nbsp;</DIV>
<DIV>而 rscl 是 RSL 的编译器，懂 RenderMan&nbsp; 的朋友可以试一下自己写 Shader 给 rscl 编译，.shader 的文件是已经编译好了的 Shader。</DIV>
<DIV>&nbsp;</DIV>
<DIV>注意！illuminance、illuminate、gather 等 statement 目前仍不支持，所有的 Derivative 都有限度支持（不支持 Du() 与 Dv() ，dPdu 与 dPdv 的结果只能作为切线方向）。</DIV>
<DIV>&nbsp;</DIV>
<DIV>其它都合符 RenderMan Interface Specification 3.3 。</DIV>
<P>&nbsp;</P>
<P>
<HR>

<P></P>
<P>p.s. </P>
<DIV>&nbsp;</DIV>
<DIV>渲染完成后可以按 's' 快捷键把渲染结果储存成 TIFF 格式的图片。</DIV>
<DIV>&nbsp;</DIV>
<DIV>渲染窗口中按 F1 可以看到其它快捷键表，可以显示独立通道、或者混合显示 alpha 等等。</DIV>
<DIV>&nbsp;</DIV><img src ="http://www.cppblog.com/chaos/aggbug/784.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/chaos/" target="_blank">Chaos Chiao</a> 2005-10-21 21:29 <a href="http://www.cppblog.com/chaos/archive/2005/10/21/BQ.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>