2011-04-27 11:58:34 +00:00
|
|
|
/*
|
2013-08-18 14:16:15 +00:00
|
|
|
* Copyright 2011-2013 Blender Foundation
|
2011-04-27 11:58:34 +00:00
|
|
|
*
|
2013-08-18 14:16:15 +00:00
|
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
* you may not use this file except in compliance with the License.
|
|
|
|
* You may obtain a copy of the License at
|
2011-04-27 11:58:34 +00:00
|
|
|
*
|
2013-08-18 14:16:15 +00:00
|
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
2011-04-27 11:58:34 +00:00
|
|
|
*
|
2013-08-18 14:16:15 +00:00
|
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
* See the License for the specific language governing permissions and
|
2014-12-25 01:50:24 +00:00
|
|
|
* limitations under the License.
|
2011-04-27 11:58:34 +00:00
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef __SHADER_H__
|
|
|
|
#define __SHADER_H__
|
|
|
|
|
2014-10-06 07:39:19 +00:00
|
|
|
#ifdef WITH_OSL
|
2016-02-05 08:09:39 +00:00
|
|
|
/* So no context pollution happens from indirectly included windows.h */
|
Cycles: Make all #include statements relative to cycles source directory
The idea is to make include statements more explicit and obvious where the
file is coming from, additionally reducing chance of wrong header being
picked up.
For example, it was not obvious whether bvh.h was refferring to builder
or traversal, whenter node.h is a generic graph node or a shader node
and cases like that.
Surely this might look obvious for the active developers, but after some
time of not touching the code it becomes less obvious where file is coming
from.
This was briefly mentioned in T50824 and seems @brecht is fine with such
explicitness, but need to agree with all active developers before committing
this.
Please note that this patch is lacking changes related on GPU/OpenCL
support. This will be solved if/when we all agree this is a good idea to move
forward.
Reviewers: brecht, lukasstockner97, maiself, nirved, dingto, juicyfruit, swerner
Reviewed By: lukasstockner97, maiself, nirved, dingto
Subscribers: brecht
Differential Revision: https://developer.blender.org/D2586
2017-03-28 18:39:14 +00:00
|
|
|
# include "util/util_windows.h"
|
2014-10-06 07:39:19 +00:00
|
|
|
# include <OSL/oslexec.h>
|
|
|
|
#endif
|
|
|
|
|
Cycles: Make all #include statements relative to cycles source directory
The idea is to make include statements more explicit and obvious where the
file is coming from, additionally reducing chance of wrong header being
picked up.
For example, it was not obvious whether bvh.h was refferring to builder
or traversal, whenter node.h is a generic graph node or a shader node
and cases like that.
Surely this might look obvious for the active developers, but after some
time of not touching the code it becomes less obvious where file is coming
from.
This was briefly mentioned in T50824 and seems @brecht is fine with such
explicitness, but need to agree with all active developers before committing
this.
Please note that this patch is lacking changes related on GPU/OpenCL
support. This will be solved if/when we all agree this is a good idea to move
forward.
Reviewers: brecht, lukasstockner97, maiself, nirved, dingto, juicyfruit, swerner
Reviewed By: lukasstockner97, maiself, nirved, dingto
Subscribers: brecht
Differential Revision: https://developer.blender.org/D2586
2017-03-28 18:39:14 +00:00
|
|
|
#include "render/attribute.h"
|
|
|
|
#include "kernel/kernel_types.h"
|
2011-04-27 11:58:34 +00:00
|
|
|
|
Cycles: Make all #include statements relative to cycles source directory
The idea is to make include statements more explicit and obvious where the
file is coming from, additionally reducing chance of wrong header being
picked up.
For example, it was not obvious whether bvh.h was refferring to builder
or traversal, whenter node.h is a generic graph node or a shader node
and cases like that.
Surely this might look obvious for the active developers, but after some
time of not touching the code it becomes less obvious where file is coming
from.
This was briefly mentioned in T50824 and seems @brecht is fine with such
explicitness, but need to agree with all active developers before committing
this.
Please note that this patch is lacking changes related on GPU/OpenCL
support. This will be solved if/when we all agree this is a good idea to move
forward.
Reviewers: brecht, lukasstockner97, maiself, nirved, dingto, juicyfruit, swerner
Reviewed By: lukasstockner97, maiself, nirved, dingto
Subscribers: brecht
Differential Revision: https://developer.blender.org/D2586
2017-03-28 18:39:14 +00:00
|
|
|
#include "graph/node.h"
|
2016-05-07 22:18:32 +00:00
|
|
|
|
Cycles: Make all #include statements relative to cycles source directory
The idea is to make include statements more explicit and obvious where the
file is coming from, additionally reducing chance of wrong header being
picked up.
For example, it was not obvious whether bvh.h was refferring to builder
or traversal, whenter node.h is a generic graph node or a shader node
and cases like that.
Surely this might look obvious for the active developers, but after some
time of not touching the code it becomes less obvious where file is coming
from.
This was briefly mentioned in T50824 and seems @brecht is fine with such
explicitness, but need to agree with all active developers before committing
this.
Please note that this patch is lacking changes related on GPU/OpenCL
support. This will be solved if/when we all agree this is a good idea to move
forward.
Reviewers: brecht, lukasstockner97, maiself, nirved, dingto, juicyfruit, swerner
Reviewed By: lukasstockner97, maiself, nirved, dingto
Subscribers: brecht
Differential Revision: https://developer.blender.org/D2586
2017-03-28 18:39:14 +00:00
|
|
|
#include "util/util_map.h"
|
|
|
|
#include "util/util_param.h"
|
|
|
|
#include "util/util_string.h"
|
|
|
|
#include "util/util_thread.h"
|
|
|
|
#include "util/util_types.h"
|
2011-04-27 11:58:34 +00:00
|
|
|
|
|
|
|
CCL_NAMESPACE_BEGIN
|
|
|
|
|
|
|
|
class Device;
|
|
|
|
class DeviceScene;
|
2015-11-21 17:31:58 +00:00
|
|
|
class DeviceRequestedFeatures;
|
2011-04-27 11:58:34 +00:00
|
|
|
class Mesh;
|
|
|
|
class Progress;
|
|
|
|
class Scene;
|
|
|
|
class ShaderGraph;
|
2011-05-03 18:29:11 +00:00
|
|
|
struct float3;
|
2011-04-27 11:58:34 +00:00
|
|
|
|
2014-05-19 10:49:36 +00:00
|
|
|
enum ShadingSystem {
|
|
|
|
SHADINGSYSTEM_OSL,
|
|
|
|
SHADINGSYSTEM_SVM
|
|
|
|
};
|
|
|
|
|
2014-10-22 14:17:03 +00:00
|
|
|
/* Keep those in sync with the python-defined enum. */
|
|
|
|
enum VolumeSampling {
|
|
|
|
VOLUME_SAMPLING_DISTANCE = 0,
|
|
|
|
VOLUME_SAMPLING_EQUIANGULAR = 1,
|
|
|
|
VOLUME_SAMPLING_MULTIPLE_IMPORTANCE = 2,
|
2016-02-10 14:09:45 +00:00
|
|
|
|
|
|
|
VOLUME_NUM_SAMPLING,
|
2014-10-22 14:17:03 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
enum VolumeInterpolation {
|
|
|
|
VOLUME_INTERPOLATION_LINEAR = 0,
|
|
|
|
VOLUME_INTERPOLATION_CUBIC = 1,
|
2016-02-10 14:09:45 +00:00
|
|
|
|
|
|
|
VOLUME_NUM_INTERPOLATION,
|
2014-10-22 14:17:03 +00:00
|
|
|
};
|
|
|
|
|
2016-08-02 09:13:58 +00:00
|
|
|
enum DisplacementMethod {
|
|
|
|
DISPLACE_BUMP = 0,
|
|
|
|
DISPLACE_TRUE = 1,
|
|
|
|
DISPLACE_BOTH = 2,
|
|
|
|
|
|
|
|
DISPLACE_NUM_METHODS,
|
|
|
|
};
|
|
|
|
|
2011-04-27 11:58:34 +00:00
|
|
|
/* Shader describing the appearance of a Mesh, Light or Background.
|
|
|
|
*
|
2011-10-12 23:03:12 +00:00
|
|
|
* While there is only a single shader graph, it has three outputs: surface,
|
|
|
|
* volume and displacement, that the shader manager will compile and execute
|
2011-04-27 11:58:34 +00:00
|
|
|
* separately. */
|
|
|
|
|
2016-05-07 22:18:32 +00:00
|
|
|
class Shader : public Node {
|
2011-04-27 11:58:34 +00:00
|
|
|
public:
|
2017-03-06 13:16:45 +00:00
|
|
|
NODE_DECLARE
|
2016-05-07 22:18:32 +00:00
|
|
|
|
Cycles: Render Passes
Currently supported passes:
* Combined, Z, Normal, Object Index, Material Index, Emission, Environment,
Diffuse/Glossy/Transmission x Direct/Indirect/Color
Not supported yet:
* UV, Vector, Mist
Only enabled for CPU devices at the moment, will do GPU tweaks tommorrow,
also for environment importance sampling.
Documentation:
http://wiki.blender.org/index.php/Doc:2.6/Manual/Render/Cycles/Passes
2012-01-25 17:23:52 +00:00
|
|
|
int pass_id;
|
2011-04-27 11:58:34 +00:00
|
|
|
|
|
|
|
/* shader graph */
|
|
|
|
ShaderGraph *graph;
|
|
|
|
|
2011-09-27 20:37:24 +00:00
|
|
|
/* sampling */
|
2013-06-18 09:36:00 +00:00
|
|
|
bool use_mis;
|
|
|
|
bool use_transparent_shadow;
|
2013-12-29 21:19:38 +00:00
|
|
|
bool heterogeneous_volume;
|
2014-10-22 14:17:03 +00:00
|
|
|
VolumeSampling volume_sampling_method;
|
2014-10-22 13:23:45 +00:00
|
|
|
int volume_interpolation_method;
|
2011-09-27 20:37:24 +00:00
|
|
|
|
2011-04-27 11:58:34 +00:00
|
|
|
/* synchronization */
|
|
|
|
bool need_update;
|
2018-01-24 19:19:48 +00:00
|
|
|
bool need_update_mesh;
|
2011-04-27 11:58:34 +00:00
|
|
|
|
2017-05-19 02:59:35 +00:00
|
|
|
/* If the shader has only volume components, the surface is assumed to
|
|
|
|
* be transparent.
|
|
|
|
* However, graph optimization might remove the volume subgraph, but
|
|
|
|
* since the user connected something to the volume output the surface
|
|
|
|
* should still be transparent.
|
|
|
|
* Therefore, has_volume_connected stores whether some volume subtree
|
|
|
|
* was connected before optimization. */
|
|
|
|
bool has_volume_connected;
|
|
|
|
|
2011-04-27 11:58:34 +00:00
|
|
|
/* information about shader after compiling */
|
2011-10-12 23:03:12 +00:00
|
|
|
bool has_surface;
|
2011-04-27 11:58:34 +00:00
|
|
|
bool has_surface_emission;
|
2011-09-27 20:37:24 +00:00
|
|
|
bool has_surface_transparent;
|
2011-10-12 15:42:35 +00:00
|
|
|
bool has_volume;
|
2011-10-12 23:03:12 +00:00
|
|
|
bool has_displacement;
|
2013-04-01 20:26:52 +00:00
|
|
|
bool has_surface_bssrdf;
|
2017-08-20 12:02:16 +00:00
|
|
|
bool has_bump;
|
2013-08-18 14:15:57 +00:00
|
|
|
bool has_bssrdf_bump;
|
2016-02-05 21:13:51 +00:00
|
|
|
bool has_surface_spatial_varying;
|
2016-02-05 20:33:37 +00:00
|
|
|
bool has_volume_spatial_varying;
|
2015-01-21 17:19:31 +00:00
|
|
|
bool has_object_dependency;
|
2018-02-18 02:20:39 +00:00
|
|
|
bool has_attribute_dependency;
|
2015-11-20 13:18:27 +00:00
|
|
|
bool has_integrator_dependency;
|
2011-04-27 11:58:34 +00:00
|
|
|
|
2016-08-02 09:13:58 +00:00
|
|
|
/* displacement */
|
|
|
|
DisplacementMethod displacement_method;
|
|
|
|
|
2011-04-27 11:58:34 +00:00
|
|
|
/* requested mesh attributes */
|
|
|
|
AttributeRequestSet attributes;
|
|
|
|
|
2012-10-30 11:51:17 +00:00
|
|
|
/* determined before compiling */
|
2016-05-14 12:50:03 +00:00
|
|
|
uint id;
|
2012-10-30 11:51:17 +00:00
|
|
|
bool used;
|
|
|
|
|
2012-11-03 14:32:35 +00:00
|
|
|
#ifdef WITH_OSL
|
|
|
|
/* osl shading state references */
|
2016-01-07 08:15:30 +00:00
|
|
|
OSL::ShaderGroupRef osl_surface_ref;
|
|
|
|
OSL::ShaderGroupRef osl_surface_bump_ref;
|
|
|
|
OSL::ShaderGroupRef osl_volume_ref;
|
|
|
|
OSL::ShaderGroupRef osl_displacement_ref;
|
2012-11-03 14:32:35 +00:00
|
|
|
#endif
|
|
|
|
|
2011-04-27 11:58:34 +00:00
|
|
|
Shader();
|
|
|
|
~Shader();
|
|
|
|
|
2016-09-03 20:40:07 +00:00
|
|
|
/* Checks whether the shader consists of just a emission node with fixed inputs that's connected directly to the output.
|
|
|
|
* If yes, it sets the content of emission to the constant value (color * strength), which is then used for speeding up light evaluation. */
|
|
|
|
bool is_constant_emission(float3* emission);
|
|
|
|
|
2011-04-27 11:58:34 +00:00
|
|
|
void set_graph(ShaderGraph *graph);
|
|
|
|
void tag_update(Scene *scene);
|
2012-10-30 11:51:17 +00:00
|
|
|
void tag_used(Scene *scene);
|
2011-04-27 11:58:34 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
/* Shader Manager virtual base class
|
|
|
|
*
|
|
|
|
* From this the SVM and OSL shader managers are derived, that do the actual
|
|
|
|
* shader compiling and device updating. */
|
|
|
|
|
|
|
|
class ShaderManager {
|
|
|
|
public:
|
|
|
|
bool need_update;
|
|
|
|
|
2012-12-04 07:48:09 +00:00
|
|
|
static ShaderManager *create(Scene *scene, int shadingsystem);
|
2011-04-27 11:58:34 +00:00
|
|
|
virtual ~ShaderManager();
|
|
|
|
|
2013-02-14 16:11:47 +00:00
|
|
|
virtual void reset(Scene *scene) = 0;
|
|
|
|
|
2012-12-04 07:48:09 +00:00
|
|
|
virtual bool use_osl() { return false; }
|
|
|
|
|
2011-04-27 11:58:34 +00:00
|
|
|
/* device update */
|
|
|
|
virtual void device_update(Device *device, DeviceScene *dscene, Scene *scene, Progress& progress) = 0;
|
2013-04-01 20:26:52 +00:00
|
|
|
virtual void device_free(Device *device, DeviceScene *dscene, Scene *scene) = 0;
|
2011-04-27 11:58:34 +00:00
|
|
|
|
2012-10-30 11:51:17 +00:00
|
|
|
void device_update_shaders_used(Scene *scene);
|
2011-09-27 20:37:24 +00:00
|
|
|
void device_update_common(Device *device, DeviceScene *dscene, Scene *scene, Progress& progress);
|
2013-04-01 20:26:52 +00:00
|
|
|
void device_free_common(Device *device, DeviceScene *dscene, Scene *scene);
|
2011-09-27 20:37:24 +00:00
|
|
|
|
2011-04-27 11:58:34 +00:00
|
|
|
/* get globally unique id for a type of attribute */
|
|
|
|
uint get_attribute_id(ustring name);
|
2012-04-30 12:49:26 +00:00
|
|
|
uint get_attribute_id(AttributeStandard std);
|
2011-04-27 11:58:34 +00:00
|
|
|
|
|
|
|
/* get shader id for mesh faces */
|
2016-08-16 23:42:08 +00:00
|
|
|
int get_shader_id(Shader *shader, bool smooth = false);
|
2011-04-27 11:58:34 +00:00
|
|
|
|
|
|
|
/* add default shaders to scene, to use as default for things that don't
|
2012-06-09 17:22:52 +00:00
|
|
|
* have any shader assigned explicitly */
|
2011-04-27 11:58:34 +00:00
|
|
|
static void add_default(Scene *scene);
|
|
|
|
|
2015-05-09 14:22:16 +00:00
|
|
|
/* Selective nodes compilation. */
|
2015-06-01 10:52:00 +00:00
|
|
|
void get_requested_features(Scene *scene,
|
2015-11-21 17:31:58 +00:00
|
|
|
DeviceRequestedFeatures *requested_features);
|
2015-05-09 14:22:16 +00:00
|
|
|
|
2016-02-06 22:40:41 +00:00
|
|
|
static void free_memory();
|
|
|
|
|
2018-06-14 15:48:19 +00:00
|
|
|
float linear_rgb_to_gray(float3 c);
|
|
|
|
|
2011-04-27 11:58:34 +00:00
|
|
|
protected:
|
|
|
|
ShaderManager();
|
|
|
|
|
|
|
|
typedef unordered_map<ustring, uint, ustringHash> AttributeIDMap;
|
|
|
|
AttributeIDMap unique_attribute_id;
|
2013-04-01 20:26:52 +00:00
|
|
|
|
2017-10-06 16:06:15 +00:00
|
|
|
static thread_mutex lookup_table_mutex;
|
Cycles: Experiment with making previews more interactive
There were two major problems with the interactivity of material previews:
- Beckmann tables were re-generated on every material tweak.
This is because preview scene is not set to be persistent, so re-triggering
the render leads to the full scene re-sync.
- Images could take rather noticeable time to load with OIIO from the disk
on every tweak.
This patch addressed this two issues in the following way:
- Beckmann tables are now static on CPU memory.
They're couple of hundred kilobytes only, so wouldn't expect this to be
an issue. And they're needed for almost every render anyway.
This actually also makes blackbody table to be static, but it's even smaller
than beckmann table.
Not totally happy with this approach, but others seems to complicate things
quite a bit with all this render engine life time and so..
- For preview rendering all images are considered to be built-in. This means
instead of OIIO which re-loads images on every re-render they're coming
from ImBuf cache which is fully manageable from blender side and unused
images gets freed later.
This would make it impossible to have mipmapping with OSL for now, but we'll
be working on that later anyway and don't think mipmaps are really so crucial
for the material preview.
This seems to be a better alternative to making preview scene persistent,
because of much optimal memory control from blender side.
Reviewers: brecht, juicyfruit, campbellbarton, dingto
Subscribers: eyecandy, venomgfx
Differential Revision: https://developer.blender.org/D1132
2015-02-21 16:55:24 +00:00
|
|
|
static vector<float> beckmann_table;
|
2017-10-06 16:06:15 +00:00
|
|
|
static bool beckmann_table_ready;
|
2015-01-23 09:00:48 +00:00
|
|
|
|
2014-06-20 19:21:05 +00:00
|
|
|
size_t beckmann_table_offset;
|
2015-06-01 10:52:00 +00:00
|
|
|
|
|
|
|
void get_requested_graph_features(ShaderGraph *graph,
|
2015-11-21 17:31:58 +00:00
|
|
|
DeviceRequestedFeatures *requested_features);
|
2017-04-10 14:53:01 +00:00
|
|
|
|
|
|
|
thread_spin_lock attribute_lock_;
|
2018-06-14 15:48:19 +00:00
|
|
|
|
|
|
|
float3 xyz_to_r;
|
|
|
|
float3 xyz_to_g;
|
|
|
|
float3 xyz_to_b;
|
|
|
|
float3 rgb_to_y;
|
2011-04-27 11:58:34 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
CCL_NAMESPACE_END
|
|
|
|
|
|
|
|
#endif /* __SHADER_H__ */
|
|
|
|
|