BlenderCN论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 5999|回复: 16

Cycles代码阅读

[复制链接]
发表于 2011-11-21 13:50:58 | 显示全部楼层 |阅读模式
本帖最后由 水经石 于 2012-6-1 06:55 编辑

=====前文=====

有人曾经建议出本阅读Blender代码的书。为什么不出书呢,其实出书并非难事儿,即使水平不行也不怕,顶多被别人笑话两句,难就难在坚持二字。对我来说写书是个苦差事,因为不容易有激情,也不好看到回报。今天想说说cycles,一是这东西现在很火,所以是个好东西,想介绍给大家它的实现;二是从原理上,可能讨论讨论它能实现什么,不能实现什么,让大家心里有个底儿。三是我以前自己写过基于GPU的渲染器,有部分地方还是有些了解,从某种意义上说算是一个有意义的事儿。

以前做过很多projects(这个词儿比较好,"项目"听起来很吓人),但是由于种种牵绊都不好走完全程。不能坚持到底,总会成为别人的把柄。可是理性的说,真没必要咬文嚼字儿钻牛角尖儿。毕竟我们曾经尝试过,比没有尝试的人要强。这次也是一样,cycles的代码我会慢慢的读,可是我不保证能把它读完。同时,这里我所说的读,只是给大家一个整体的架构思路,也许有些地方会深入细节,但抄一句别人的话,"细节是必要的,但细节是次要的"。

我的期待,不必说有共鸣,大家能会心一笑就行,能有兴趣,共同进步就好。另外我想说,如果你找工作的话,而且是"程序猿",看cycles基本上是没戏,因为应用面太窄。不如熟练C/C++,更想深点得看看设计模式,模板元。写这个,纯粹是为了自娱自乐和普及点儿知识。

另外,官方文档请见: http://wiki.blender.org/index.php/Dev:2.6/Source/Render/Cycles

2011年11月20日

=====获取代码=====

现在Blender还是用SVN,这东西如果你想看代码历史的话还得有internet。虽然目前cycles历史几乎没什么好看的,但是以后可能有用。介绍一个新朋友吧,它叫GIT。如果你不知道这玩意是什么,那么建议你安装个Tortoise Git玩儿玩儿。我假设你用Winows 7,你不用反驳狡辩,狡辩也没用。首先你要做的就是在桌面建立个文件夹,名字叫cycles,双击打开它,然后在出现的文件管理器里空白的地方按shift+鼠标右键(请先按住shift不放),选open command window here,然后输入
git svn clone -r 40000:HEAD https://svn.blender.org/svnroot/ ... nder/intern/cycles/ .
注意,我假设你已经装好了Tortoise Git,另外上面那行最后有个"."。经过漫长的等待,你就会有一份带历史的cycles。上面那行里40000:HEAD意思是从revision40000到最新的代码里找 属于cycles的部分,为什么不是0开始?因为cycles是revision40000以后才被加到blender官方代码库里的。

2011年11月20日

=====目录结构=====

  app/                 网络渲染服务端
  blender/             兼容Blender用的Python/C++代码
  blender/addon        Blender下插件的Python脚本
  cmake/               编译环境cmake
  bvh/                 包围体层次
  device/              CPU,CUDA, OpenCL and network的抽象
  doc/                 文档,目前是空的
  doc/license/         licences
  doc/reference/       目前也是空的
  kernel/              渲染内核,指在CPU/CUDA/OpenCL上运行的代码,渲染器的核心
  kernel/svm/          Shader virtual machine
  kernel/osl/          Open Shading Language,目前只支持CPU
  kernel/osl/nodes/    OSL shaders
  render/              数据结构和流程控制,和渲染内核互相支撑的部分
  subd/                细分表面
  test/                测试集
  util/                实用工具

2011年11月24日

=====骚包算法=====

render里有个sobol.h / sobol.cpp。这是干什么的?历史的经验教训告诉我们,一般像是个名字的,都是以数学家姓或者名命名的算法。骚包算法其实是个准随机数生成算法。用在渲染器里,它用来指明反射光线的方向。假设你是个北京的天气预报员,你想让沈阳的机器人告诉你天气的情况,机器人一般是这么做的:它会朝东南西北4个方向看看,或者是东,东偏南45度,南,南偏西45度,西,西偏北45读,北,北偏东45度,一共8个方向看看,取决于机器人设计的复杂度,但一般看8个方向总比看4个方向要精准的多。然后机器人会把得到的情况汇总告诉你,比如说晴,有点儿阴天什么的。它对各个方向的观察就叫采样。骚包算法就是一个给机器人指方向的算法,它的优点就是所有方向都能指个遍,每两个方向之间的夹角的差异出入不会太大。

准随机和真随机的区别是什么?这是一个深刻的问题!我不是数学家,更不是一个优秀的数学家,我只能告诉你,准随机是为了模仿真随机。为什么模仿随机呢?刚才的机器人设计的不是很好么?不过万一,万一北偏西45.14159这个角度发生了闪电,机器人是不能看到的。我们要通过很多次的随机(或者准随机)采样,才能万无一失。

在渲染器里也是一样,你要采样一定数目的随机(或者准随机)反射光线,你才能达到一定物理意义上的精准。

不过话说回来,对于某条光线而言,一般对其反射光线采样的次数是不会太多的,1000条也许算是上限了。所以很多时候可以牺牲物理的准确性确保快速的渲染。这个世界里,并不是只有偏执狂才能生存。

2011年11月20日

===== globals =====

对于CPU而言,一般没有local这个概念,因为OpenCL query过来,你会发现对于cache的定义是CL_GLOBAL,这就是说在GPU层面上轻松得到的加速并不好在CPU上施展。CPU和GPU架构不同,可以理解。同时,这也说明,想写好同时可以在CPU和GPU上都快的代码,是很困难,甚至是不实际的。对于Cycles而言,GPU加速才是让天平倾斜的因素。目前,global和local是对于GPU而言的。Local memory的速度要比global memory快很多。
我们看到kernel底下有个kernel_globals.h,先不管它是干什么的,首先我们提个问题,既然local memory那么快,为什么不把所有东西都放到local里?答案是,local memory很少,一块GPU的local memory总和也许只有几兆,而global memory却可以有1G甚至几G。

可以看到kernel_globals.h其实是在索引kernel_textures.h。对CUDA和OpenCL,kernel_textures.h定义了bvh,objects,triangles,attributes,lights,shaders,camera/film,sobol,另外,CUDA还有100个image texture来辅助渲染。OpenCL没有,也许是因为对OpenCL的支持尚未完善。

2011年11月23日

===== 2011的总结 =====

明年马上到来, 更新了本地cycles的代码,看看今年发生了哪些事儿。 ( 更新代码在有.git的目录做git-svn rebase )

基本上从11月8日的merge到11月23日的check-in,今年就这么完了。多数的工作在维护build的稳定性,包括OpenCL和Windows的支持。由此大概可以猜测出cycles的coding部分首先是在linux上完成的。

有意思的check-in有两个,一个是CPU SSE的优化 (11月15日), 另一个是Oren-Nayar BSDF反射模型。 关于反射模型,实现是基于SIGGRAPH 94年的一篇论文[[http://www1.cs.columbia.edu/CAVE ... Oren_SIGGRAPH94.pdf|Generalization of Lambert’s Reflectance Model]]。 11月14日的check-in。

下次会介绍一下cycles这个team的成员。 祝大家新年快乐!

2011年12月31日

===== cycles的team成员 =====

  blendix, Brecht已经是Blender开发团队的元老了,名字可能陌生,不过说他实现了Blender的次表面渲染(SSS),你也许可能大概会uh huh一下? cycles的主程。
  aligorith, CUDA的支持。
  dingto, python的支持。
  mont29, python的支持。
  campbellbarton, python和cmake的支持。
  psy-fi, cmake和scons支持。
  jesterking, scons的支持。
  gsrb3d, SVN的支持。

从以上的成员结构来看,cycles可以说是blendix一个人的作品。所以看官们都鼓起勇气,把它看完。虽然只有一个人,我们同样可以窥见其架构之美。但是记住一句话,想用general的优化手段来对付CPU和GPU,是不太实际的。我无法预见将来的样子,不过从性能的角度考虑,分而治之,才是万神归宗之道。(这是个悖论么?)

2012年1月1日

===== 代码打印版 =====

一晃半年就要过去了,这段日子真的很忙,没有时间读代码。

上传了2002-05-31的代码到http://drupal.blendercn.org/tmp/ ... d5bc5f4ad0c64d5.pdf,非常感兴趣的同学可以打印出来看看。

2012年5月31日

发表于 2011-11-21 13:58:13 | 显示全部楼层
美工过来顶一个
回复 支持 反对

使用道具 举报

发表于 2011-11-22 20:35:52 | 显示全部楼层
我也顶一下
回复 支持 反对

使用道具 举报

发表于 2011-11-27 15:25:02 | 显示全部楼层
俺也顶一下,最近正在读代码。
回复 支持 反对

使用道具 举报

发表于 2011-12-15 10:38:25 | 显示全部楼层
长知识了,啥时候说它能干什么,不能干什么
回复 支持 反对

使用道具 举报

发表于 2012-1-1 09:16:49 | 显示全部楼层
更新了段,支持。wiki版同时更新中。
http://wiki.blendercn.org/doku.php?id=code:cyclescodereading
回复 支持 反对

使用道具 举报

发表于 2012-5-2 10:36:34 | 显示全部楼层
了解了,还没有看到关键部分
回复 支持 反对

使用道具 举报

发表于 2012-7-27 12:31:24 | 显示全部楼层
见天才看到此帖。。。
回复 支持 反对

使用道具 举报

发表于 2013-8-18 22:51:10 | 显示全部楼层
我来挖坟了,cycles的理论框架可以看PBRT这本书,GPU部分研究opencl的几个示例,现在大集团都在强推opencl,Blender在Intel的5系卡上已经可以跑opencl了。apple今年sig说要密切配合将新的macpro跑上Blender的cycles和其他的并行功能。希望在macpro发售时上能看到一些好玩的。

点评

PBRT不是LuxRender的前身么  详情 回复 发表于 2013-8-21 14:19
回复 支持 反对

使用道具 举报

发表于 2013-8-21 14:19:51 | 显示全部楼层
kidux 发表于 2013-8-18 22:51
我来挖坟了,cycles的理论框架可以看PBRT这本书,GPU部分研究opencl的几个示例,现在大集团都在强推opencl ...

PBRT不是LuxRender的前身么

点评

很明显是的,代码是 physical based rendering这本书的示例。都差不多的理论方法  详情 回复 发表于 2013-8-22 14:16
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

Blender最新中文教学视频|Blender头条|小黑屋|手机版|Archiver|Blender中国 ( 蜀ICP备17002929号 )360网站安全检测平台

GMT+8, 2019-1-23 16:36 , Processed in 0.018580 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表