BlenderCN论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

12
返回列表 发新帖
楼主: 水经石

Cycles代码阅读

[复制链接]
发表于 2013-8-22 14:16:29 | 显示全部楼层
acme_pjz 发表于 2013-8-21 14:19
PBRT不是LuxRender的前身么

很明显是的,代码是 physical based rendering这本书的示例。都差不多的理论方法
回复 支持 反对

使用道具 举报

发表于 2013-9-19 16:12:44 | 显示全部楼层
cycles现在的开发进度更加迅速,而且开始走向独立化的渲染引擎,对cycles的开发和shader设置都会开始有大量需求。
回复 支持 反对

使用道具 举报

发表于 2013-11-4 15:31:16 | 显示全部楼层
Blender现在的渲染器外挂从 pyobject 的 render_func ()开始,接入外部渲染器就从这个函数入手。
入口函数从:blender_session.h 的 render() 开始,进行了初始化,场景建立,胶片设置,采样生成,光线与物体相交测试,计算,brdf查询计算,图片生成等多个步骤。其中的光线相交计算作为kernel,单独存放。
回复 支持 反对

使用道具 举报

发表于 2013-11-4 15:36:46 | 显示全部楼层
  1. void BlenderSession::render()
  2. {
  3.         /* set callback to write out render results */
  4.         session->write_render_tile_cb = function_bind(&BlenderSession::write_render_tile, this, _1);
  5.         session->update_render_tile_cb = function_bind(&BlenderSession::update_render_tile, this, _1);

  6.         /* get buffer parameters */
  7.         SessionParams session_params = BlenderSync::get_session_params(b_engine, b_userpref, b_scene, background);
  8.         BufferParams buffer_params = BlenderSync::get_buffer_params(b_render, b_scene, b_v3d, b_rv3d, scene->camera, width, height);

  9.         /* render each layer */
  10.         BL::RenderSettings r = b_scene.render();
  11.         BL::RenderSettings::layers_iterator b_iter;
  12.        
  13.         for(r.layers.begin(b_iter); b_iter != r.layers.end(); ++b_iter) {
  14.                 b_rlay_name = b_iter->name();

  15.                 /* temporary render result to find needed passes */
  16.                 BL::RenderResult b_rr = begin_render_result(b_engine, 0, 0, 1, 1, b_rlay_name.c_str());
  17.                 BL::RenderResult::layers_iterator b_single_rlay;
  18.                 b_rr.layers.begin(b_single_rlay);

  19.                 /* layer will be missing if it was disabled in the UI */
  20.                 if(b_single_rlay == b_rr.layers.end()) {
  21.                         end_render_result(b_engine, b_rr, true);
  22.                         continue;
  23.                 }

  24.                 BL::RenderLayer b_rlay = *b_single_rlay;

  25.                 /* add passes */
  26.                 vector<Pass> passes;
  27.                 Pass::add(PASS_COMBINED, passes);

  28.                 if(session_params.device.advanced_shading) {

  29.                         /* loop over passes */
  30.                         BL::RenderLayer::passes_iterator b_pass_iter;

  31.                         for(b_rlay.passes.begin(b_pass_iter); b_pass_iter != b_rlay.passes.end(); ++b_pass_iter) {
  32.                                 BL::RenderPass b_pass(*b_pass_iter);
  33.                                 PassType pass_type = get_pass_type(b_pass);

  34.                                 if(pass_type == PASS_MOTION && scene->integrator->motion_blur)
  35.                                         continue;
  36.                                 if(pass_type != PASS_NONE)
  37.                                         Pass::add(pass_type, passes);
  38.                         }
  39.                 }

  40.                 /* free result without merging */
  41.                 end_render_result(b_engine, b_rr, true);

  42.                 buffer_params.passes = passes;
  43.                 scene->film->tag_passes_update(scene, passes);
  44.                 scene->film->tag_update(scene);
  45.                 scene->integrator->tag_update(scene);

  46.                 /* update scene */
  47.                 sync->sync_camera(b_render, b_engine.camera_override(), width, height);
  48.                 sync->sync_data(b_v3d, b_engine.camera_override(), b_rlay_name.c_str());

  49.                 /* update number of samples per layer */
  50.                 int samples = sync->get_layer_samples();
  51.                 bool bound_samples = sync->get_layer_bound_samples();

  52.                 if(samples != 0 && (!bound_samples || (samples < session_params.samples)))
  53.                         session->reset(buffer_params, samples);
  54.                 else
  55.                         session->reset(buffer_params, session_params.samples);

  56.                 /* render */
  57.                 session->start();
  58.                 session->wait();

  59.                 if(session->progress.get_cancel())
  60.                         break;
  61.         }

  62.         /* clear callback */
  63.         session->write_render_tile_cb = NULL;
  64.         session->update_render_tile_cb = NULL;

  65.         /* free all memory used (host and device), so we wouldn't leave render
  66.          * engine with extra memory allocated
  67.          */

  68.         session->device_free();

  69.         delete sync;
  70.         sync = NULL;
  71. }
复制代码

回复 支持 反对

使用道具 举报

发表于 2013-11-11 20:05:21 | 显示全部楼层
要分析 Blender cycles,从理论指导实践的角度来说,应该先研究光线追踪算法的研究历史和演变。以及在raytracing里面实现的GI算法,继而获知计算强度最大的几个地方,比如相交计算,sampling采样方式。从而可以得到cycles渲染速度具体卡在哪些地方的问题,以及为什么使用GPU可以加速某些部分的计算速度。
回复 支持 反对

使用道具 举报

发表于 2014-9-6 01:27:48 | 显示全部楼层
我来继续废话:
1,今年的upbp算法将 从79年开始在计算机上提出光线追踪方法到现在的研究方法都做出了一次总结。将path trace和photon mapping进行了融合。第一次将所有的光线传输模型的各种可能性都集合到一套算法框架中来。预计今后的渲染器质量和效率上都会有一次大的改观。
2,还是从楼主的sobol开始,谈谈渲染器要解决的核心问题
a,sobol是一个伪随机量的生成算法,可以产生一系列的伪随机数,这些数据的可视化表达就是:一张图片中均匀的散布着点,非常均匀,你根本看不出有任何的重复,不管这幅图片有多么大 sobol都能生成均匀点
b,为什么需要sobol这样的伪随机量?这是为了解方程,这个方程就是光线传播的方程:Lo=Le+TLi,用中文表达就是:某点X的光线输出量=某点X自身的发光量+传人某点X的光线的处理量,这个方程是一个积分方程,科学家把它定义为 Fredholm二型,有数值解。这个解法需要用到蒙特卡洛方法。
c,蒙特卡洛方法英文缩写是MC,用MC解方程需要随机数来做采样,这样自然用到了sobol这种比较均匀的生成算法。
3,再说说 光线传播方程
这个方程里面包含了  物体几何信息(我们的建模),反射面数据信息就是我们通常说的brdf(我们的材质纹理),光照信息等,通过解这套方程将最终的图像算出并得到。
为什么第一点会说到 path tracing和photon mapping,这两类解光线传播方程的方法其实是看待问题的方式不同,前面是通过图像合成在图像空间解决光线传播问题,后者是在物体空间对光线传播进行分析;通过这十多年的研究演进最终汇集到了updp算法上。








===========
updp:Unifying points, beams, and paths in volumetric light transport simulation
回复 支持 反对

使用道具 举报

发表于 2015-8-11 07:55:37 | 显示全部楼层
mark,虽然看不懂,收藏一下~
回复 支持 反对

使用道具 举报

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

本版积分规则

关闭

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

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

GMT+8, 2019-6-17 15:52 , Processed in 0.014415 second(s), 14 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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