2011-04-27 11:58:34 +00:00
|
|
|
/*
|
|
|
|
|
* Copyright 2011, Blender Foundation.
|
|
|
|
|
*
|
|
|
|
|
* This program is free software; you can redistribute it and/or
|
|
|
|
|
* modify it under the terms of the GNU General Public License
|
|
|
|
|
* as published by the Free Software Foundation; either version 2
|
|
|
|
|
* of the License, or (at your option) any later version.
|
|
|
|
|
*
|
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
|
*
|
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
|
* along with this program; if not, write to the Free Software Foundation,
|
|
|
|
|
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
#include "device.h"
|
|
|
|
|
#include "integrator.h"
|
|
|
|
|
#include "scene.h"
|
|
|
|
|
#include "sobol.h"
|
|
|
|
|
|
2011-10-29 14:27:24 +00:00
|
|
|
#include "util_hash.h"
|
|
|
|
|
|
2011-04-27 11:58:34 +00:00
|
|
|
CCL_NAMESPACE_BEGIN
|
|
|
|
|
|
|
|
|
|
Integrator::Integrator()
|
|
|
|
|
{
|
2011-09-01 15:53:36 +00:00
|
|
|
min_bounce = 2;
|
|
|
|
|
max_bounce = 7;
|
|
|
|
|
|
|
|
|
|
max_diffuse_bounce = max_bounce;
|
|
|
|
|
max_glossy_bounce = max_bounce;
|
|
|
|
|
max_transmission_bounce = max_bounce;
|
|
|
|
|
probalistic_termination = true;
|
|
|
|
|
|
|
|
|
|
transparent_min_bounce = min_bounce;
|
|
|
|
|
transparent_max_bounce = max_bounce;
|
|
|
|
|
transparent_probalistic = true;
|
|
|
|
|
transparent_shadows = false;
|
|
|
|
|
|
2011-04-27 11:58:34 +00:00
|
|
|
no_caustics = false;
|
Cycles: add "Blur Glossy" integrator option.
When using a value higher than 0.0, this will blur glossy reflections after
blurry bounces, to reduce noise at the cost of accuracy. 1.0 is a good
starting value to tweak.
Some light paths have a low probability of being found while contributing much
light to the pixel. As a result these light paths will be found in some pixels
and not in others, causing fireflies. An example of such a difficult path might
be a small light that is causing a small specular highlight on a sharp glossy
material, which we are seeing through a rough glossy material. With path tracing
it is difficult to find the specular highlight, but if we increase the roughness
on the material the highlight gets bigger and softer, and so easier to find.
Often this blurring will be hardly noticeable, because we are seeing it through
a blurry material anyway, but there are also cases where this will lead to a
loss of detail in lighting.
(note that this is being committed to the tomato branch, mango will be using
this branch until feature freeze for 2.63 is over, then switch back)
2012-04-16 12:57:11 +00:00
|
|
|
blur_glossy = 0.0f;
|
2011-10-29 14:27:24 +00:00
|
|
|
seed = 0;
|
2011-12-21 20:51:43 +00:00
|
|
|
layer_flag = ~0;
|
2012-04-05 15:17:45 +00:00
|
|
|
sample_clamp = 0.0f;
|
2011-10-29 14:27:24 +00:00
|
|
|
|
2011-04-27 11:58:34 +00:00
|
|
|
need_update = true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Integrator::~Integrator()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Integrator::device_update(Device *device, DeviceScene *dscene)
|
|
|
|
|
{
|
|
|
|
|
if(!need_update)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
device_free(device, dscene);
|
|
|
|
|
|
|
|
|
|
KernelIntegrator *kintegrator = &dscene->data.integrator;
|
|
|
|
|
|
|
|
|
|
/* integrator parameters */
|
2011-09-01 15:53:36 +00:00
|
|
|
kintegrator->max_bounce = max_bounce + 1;
|
|
|
|
|
if(probalistic_termination)
|
|
|
|
|
kintegrator->min_bounce = min_bounce + 1;
|
|
|
|
|
else
|
|
|
|
|
kintegrator->min_bounce = kintegrator->max_bounce;
|
|
|
|
|
|
|
|
|
|
kintegrator->max_diffuse_bounce = max_diffuse_bounce + 1;
|
|
|
|
|
kintegrator->max_glossy_bounce = max_glossy_bounce + 1;
|
|
|
|
|
kintegrator->max_transmission_bounce = max_transmission_bounce + 1;
|
|
|
|
|
|
|
|
|
|
kintegrator->transparent_max_bounce = transparent_max_bounce + 1;
|
|
|
|
|
if(transparent_probalistic)
|
|
|
|
|
kintegrator->transparent_min_bounce = transparent_min_bounce + 1;
|
|
|
|
|
else
|
|
|
|
|
kintegrator->transparent_min_bounce = kintegrator->transparent_max_bounce;
|
|
|
|
|
|
|
|
|
|
kintegrator->transparent_shadows = transparent_shadows;
|
|
|
|
|
|
2011-04-27 11:58:34 +00:00
|
|
|
kintegrator->no_caustics = no_caustics;
|
Cycles: add "Blur Glossy" integrator option.
When using a value higher than 0.0, this will blur glossy reflections after
blurry bounces, to reduce noise at the cost of accuracy. 1.0 is a good
starting value to tweak.
Some light paths have a low probability of being found while contributing much
light to the pixel. As a result these light paths will be found in some pixels
and not in others, causing fireflies. An example of such a difficult path might
be a small light that is causing a small specular highlight on a sharp glossy
material, which we are seeing through a rough glossy material. With path tracing
it is difficult to find the specular highlight, but if we increase the roughness
on the material the highlight gets bigger and softer, and so easier to find.
Often this blurring will be hardly noticeable, because we are seeing it through
a blurry material anyway, but there are also cases where this will lead to a
loss of detail in lighting.
(note that this is being committed to the tomato branch, mango will be using
this branch until feature freeze for 2.63 is over, then switch back)
2012-04-16 12:57:11 +00:00
|
|
|
kintegrator->blur_glossy = (blur_glossy == 0.0f)? FLT_MAX: 1.0f/blur_glossy;
|
|
|
|
|
|
2011-10-29 14:27:24 +00:00
|
|
|
kintegrator->seed = hash_int(seed);
|
2011-12-21 20:51:43 +00:00
|
|
|
kintegrator->layer_flag = layer_flag << PATH_RAY_LAYER_SHIFT;
|
2011-10-29 14:27:24 +00:00
|
|
|
|
2012-02-28 16:45:08 +00:00
|
|
|
kintegrator->use_ambient_occlusion =
|
|
|
|
|
((dscene->data.film.pass_flag & PASS_AO) || dscene->data.background.ao_factor != 0.0f);
|
2012-04-05 15:17:45 +00:00
|
|
|
|
|
|
|
|
kintegrator->sample_clamp = (sample_clamp == 0.0f)? FLT_MAX: sample_clamp*3.0f;
|
2012-02-28 16:45:08 +00:00
|
|
|
|
2011-04-27 11:58:34 +00:00
|
|
|
/* sobol directions table */
|
2011-10-16 17:06:01 +00:00
|
|
|
int dimensions = PRNG_BASE_NUM + (max_bounce + transparent_max_bounce + 2)*PRNG_BOUNCE_NUM;
|
2011-04-27 11:58:34 +00:00
|
|
|
uint *directions = dscene->sobol_directions.resize(SOBOL_BITS*dimensions);
|
|
|
|
|
|
|
|
|
|
sobol_generate_direction_vectors((uint(*)[SOBOL_BITS])directions, dimensions);
|
|
|
|
|
|
|
|
|
|
device->tex_alloc("__sobol_directions", dscene->sobol_directions);
|
|
|
|
|
|
|
|
|
|
need_update = false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Integrator::device_free(Device *device, DeviceScene *dscene)
|
|
|
|
|
{
|
|
|
|
|
device->tex_free(dscene->sobol_directions);
|
|
|
|
|
dscene->sobol_directions.clear();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool Integrator::modified(const Integrator& integrator)
|
|
|
|
|
{
|
2011-09-01 15:53:36 +00:00
|
|
|
return !(min_bounce == integrator.min_bounce &&
|
|
|
|
|
max_bounce == integrator.max_bounce &&
|
|
|
|
|
max_diffuse_bounce == integrator.max_diffuse_bounce &&
|
|
|
|
|
max_glossy_bounce == integrator.max_glossy_bounce &&
|
|
|
|
|
max_transmission_bounce == integrator.max_transmission_bounce &&
|
|
|
|
|
probalistic_termination == integrator.probalistic_termination &&
|
|
|
|
|
transparent_min_bounce == integrator.transparent_min_bounce &&
|
|
|
|
|
transparent_max_bounce == integrator.transparent_max_bounce &&
|
|
|
|
|
transparent_probalistic == integrator.transparent_probalistic &&
|
|
|
|
|
transparent_shadows == integrator.transparent_shadows &&
|
2011-04-27 11:58:34 +00:00
|
|
|
no_caustics == integrator.no_caustics &&
|
Cycles: add "Blur Glossy" integrator option.
When using a value higher than 0.0, this will blur glossy reflections after
blurry bounces, to reduce noise at the cost of accuracy. 1.0 is a good
starting value to tweak.
Some light paths have a low probability of being found while contributing much
light to the pixel. As a result these light paths will be found in some pixels
and not in others, causing fireflies. An example of such a difficult path might
be a small light that is causing a small specular highlight on a sharp glossy
material, which we are seeing through a rough glossy material. With path tracing
it is difficult to find the specular highlight, but if we increase the roughness
on the material the highlight gets bigger and softer, and so easier to find.
Often this blurring will be hardly noticeable, because we are seeing it through
a blurry material anyway, but there are also cases where this will lead to a
loss of detail in lighting.
(note that this is being committed to the tomato branch, mango will be using
this branch until feature freeze for 2.63 is over, then switch back)
2012-04-16 12:57:11 +00:00
|
|
|
blur_glossy == integrator.blur_glossy &&
|
2011-12-21 20:51:43 +00:00
|
|
|
layer_flag == integrator.layer_flag &&
|
2012-04-05 15:17:45 +00:00
|
|
|
seed == integrator.seed &&
|
|
|
|
|
sample_clamp == integrator.sample_clamp);
|
2011-04-27 11:58:34 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Integrator::tag_update(Scene *scene)
|
|
|
|
|
{
|
|
|
|
|
need_update = true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
CCL_NAMESPACE_END
|
|
|
|
|
|