[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [58774] branches/soc-2013-dingto/intern/ cycles: Cycles / Blackbody Node:
Thomas Dinges
blender at dingto.org
Wed Jul 31 21:03:43 CEST 2013
Revision: 58774
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=58774
Author: dingto
Date: 2013-07-31 19:03:42 +0000 (Wed, 31 Jul 2013)
Log Message:
-----------
Cycles / Blackbody Node:
* Some optimizations to avoid divisions on runtime, avoid possible division by zero and code cleanup.
Thanks to Brecht for code review!
Modified Paths:
--------------
branches/soc-2013-dingto/intern/cycles/kernel/kernel_types.h
branches/soc-2013-dingto/intern/cycles/kernel/shaders/node_blackbody.osl
branches/soc-2013-dingto/intern/cycles/kernel/svm/svm_blackbody.h
branches/soc-2013-dingto/intern/cycles/render/shader.cpp
branches/soc-2013-dingto/intern/cycles/render/svm.cpp
Modified: branches/soc-2013-dingto/intern/cycles/kernel/kernel_types.h
===================================================================
--- branches/soc-2013-dingto/intern/cycles/kernel/kernel_types.h 2013-07-31 18:46:11 UTC (rev 58773)
+++ branches/soc-2013-dingto/intern/cycles/kernel/kernel_types.h 2013-07-31 19:03:42 UTC (rev 58774)
@@ -44,11 +44,11 @@
#define BSSRDF_MIN_RADIUS 1e-8f
#define BSSRDF_MAX_ATTEMPTS 8
-#define BB_DRAPPER 800.0
-#define BB_MAX_TABLE_RANGE 12000.0
-#define BB_TABLE_XPOWER 1.5
-#define BB_TABLE_YPOWER 5.0
-#define BB_TABLE_SPACING 2.0
+#define BB_DRAPPER 800.0
+#define BB_MAX_TABLE_RANGE 12000.0
+#define BB_TABLE_XPOWER 1.5
+#define BB_TABLE_YPOWER 5.0
+#define BB_TABLE_SPACING 2.0
#define TEX_NUM_FLOAT_IMAGES 5
@@ -828,7 +828,7 @@
int pad1, pad2;
} KernelBSSRDF;
-typedef struct KernelBLACKBODY {
+typedef struct KernelBlackbody {
int table_offset;
int pad1, pad2, pad3;
} KernelBLACKBODY;
@@ -843,7 +843,7 @@
KernelBVH bvh;
KernelCurves curve_kernel_data;
KernelBSSRDF bssrdf;
- KernelBLACKBODY blackbody;
+ KernelBlackbody blackbody;
} KernelData;
CCL_NAMESPACE_END
Modified: branches/soc-2013-dingto/intern/cycles/kernel/shaders/node_blackbody.osl
===================================================================
--- branches/soc-2013-dingto/intern/cycles/kernel/shaders/node_blackbody.osl 2013-07-31 18:46:11 UTC (rev 58773)
+++ branches/soc-2013-dingto/intern/cycles/kernel/shaders/node_blackbody.osl 2013-07-31 19:03:42 UTC (rev 58774)
@@ -26,6 +26,8 @@
/* Scale by luminance */
float l = luminance(rgb);
- Color = rgb /= l;
+ if (l != 0.0)
+ rgb /= l;
+ Color = rgb;
}
Modified: branches/soc-2013-dingto/intern/cycles/kernel/svm/svm_blackbody.h
===================================================================
--- branches/soc-2013-dingto/intern/cycles/kernel/svm/svm_blackbody.h 2013-07-31 18:46:11 UTC (rev 58773)
+++ branches/soc-2013-dingto/intern/cycles/kernel/svm/svm_blackbody.h 2013-07-31 19:03:42 UTC (rev 58774)
@@ -49,20 +49,20 @@
else if (temperature <= BB_MAX_TABLE_RANGE) {
/* This is the overall size of the table */
const int lookuptablesize = 956;
- const float lookuptablesizef = 956.0f;
+ const float lookuptablenormalize = 1.0f/956.0f;
/* reconstruct a proper index for the table lookup, compared to OSL we don't look up two colors
just one (the OSL-lerp is also automatically done for us by "lookup_table_read") */
- float t = powf ((temperature - BB_DRAPPER) / BB_TABLE_SPACING, 1.0f/BB_TABLE_XPOWER);
+ float t = powf((temperature - BB_DRAPPER) * (1.0f / BB_TABLE_SPACING), 1.0f/BB_TABLE_XPOWER);
int blackbody_table_offset = kernel_data.blackbody.table_offset;
/* Retrieve colors from the lookup table */
- float lutval = t/lookuptablesizef;
+ float lutval = t*lookuptablenormalize;
float R = lookup_table_read(kg, lutval, blackbody_table_offset, lookuptablesize);
- lutval = (t + 319.0f*1.0f)/lookuptablesizef;
+ lutval = (t + 319.0f*1.0f)*lookuptablenormalize;
float G = lookup_table_read(kg, lutval, blackbody_table_offset, lookuptablesize);
- lutval = (t + 319.0f*2.0f)/lookuptablesizef;
+ lutval = (t + 319.0f*2.0f)*lookuptablenormalize;
float B = lookup_table_read(kg, lutval, blackbody_table_offset, lookuptablesize);
R = powf(R, BB_TABLE_YPOWER);
@@ -71,10 +71,11 @@
color_rgb = make_float3(R, G, B);
}
-
+
/* Luminance */
float l = linear_rgb_to_gray(color_rgb);
- color_rgb /= l;
+ if (l != 0.0f)
+ color_rgb /= l;
if (stack_valid(col_offset))
stack_store_float3(stack, col_offset, color_rgb);
Modified: branches/soc-2013-dingto/intern/cycles/render/shader.cpp
===================================================================
--- branches/soc-2013-dingto/intern/cycles/render/shader.cpp 2013-07-31 18:46:11 UTC (rev 58773)
+++ branches/soc-2013-dingto/intern/cycles/render/shader.cpp 2013-07-31 19:03:42 UTC (rev 58774)
@@ -265,7 +265,7 @@
}
/* blackbody lookup table */
- KernelBLACKBODY *kblackbody = &dscene->data.blackbody;
+ KernelBlackbody *kblackbody = &dscene->data.blackbody;
if(has_converter_blackbody && blackbody_table_offset == TABLE_OFFSET_INVALID) {
vector<float> table = blackbody_table();
Modified: branches/soc-2013-dingto/intern/cycles/render/svm.cpp
===================================================================
--- branches/soc-2013-dingto/intern/cycles/render/svm.cpp 2013-07-31 18:46:11 UTC (rev 58773)
+++ branches/soc-2013-dingto/intern/cycles/render/svm.cpp 2013-07-31 19:03:42 UTC (rev 58774)
@@ -389,11 +389,6 @@
nodes_done = true;
foreach(ShaderNode *node, nodes) {
-
- /* Detect if we have a blackbody converter, to prepare lookup table */
- if(node->has_converter_blackbody())
- current_shader->has_converter_blackbody = true;
-
if(done.find(node) == done.end()) {
bool inputs_done = true;
@@ -403,6 +398,10 @@
inputs_done = false;
if(inputs_done) {
+ /* Detect if we have a blackbody converter, to prepare lookup table */
+ if(node->has_converter_blackbody())
+ current_shader->has_converter_blackbody = true;
+
node->compile(*this);
stack_clear_users(node, done);
stack_clear_temporary(node);
More information about the Bf-blender-cvs
mailing list