[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [60641] branches/soc-2013-dingto/intern/ cycles: Volume:

Thomas Dinges blender at dingto.org
Wed Oct 9 20:08:06 CEST 2013


Revision: 60641
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=60641
Author:   dingto
Date:     2013-10-09 18:08:05 +0000 (Wed, 09 Oct 2013)
Log Message:
-----------
Volume:
* Style and code cleanup for volume.h closure file.
* Revert rename of henyey-greenstein closure to isotropic, the actual node name is still unsure, but the closure name should be called what it is. 

Modified Paths:
--------------
    branches/soc-2013-dingto/intern/cycles/kernel/closure/volume.h
    branches/soc-2013-dingto/intern/cycles/kernel/osl/osl_closures.cpp
    branches/soc-2013-dingto/intern/cycles/kernel/osl/osl_closures.h
    branches/soc-2013-dingto/intern/cycles/kernel/shaders/CMakeLists.txt
    branches/soc-2013-dingto/intern/cycles/kernel/shaders/stdosl.h
    branches/soc-2013-dingto/intern/cycles/kernel/svm/svm_closure.h
    branches/soc-2013-dingto/intern/cycles/kernel/svm/svm_types.h
    branches/soc-2013-dingto/intern/cycles/render/nodes.cpp

Added Paths:
-----------
    branches/soc-2013-dingto/intern/cycles/kernel/shaders/node_henyey_greenstein_volume.osl

Removed Paths:
-------------
    branches/soc-2013-dingto/intern/cycles/kernel/shaders/node_isotropic_volume.osl

Modified: branches/soc-2013-dingto/intern/cycles/kernel/closure/volume.h
===================================================================
--- branches/soc-2013-dingto/intern/cycles/kernel/closure/volume.h	2013-10-09 18:05:06 UTC (rev 60640)
+++ branches/soc-2013-dingto/intern/cycles/kernel/closure/volume.h	2013-10-09 18:08:05 UTC (rev 60641)
@@ -19,28 +19,27 @@
 
 CCL_NAMESPACE_BEGIN
 
-/* ISOTROPIC VOLUME CLOSURE (Henyey-Greenstein) */
+/* HENYEY-GREENSTEIN CLOSURE */
 
-// given cosinus between rays, return probability density that photon bounce to that direction
-// F and g parameters controlling how far it difference from uniform sphere. g=0 uniform diffusion-like, g = 1 - very close to sharp single ray,
-// F = 0.5 - uniform, F = 0 - most backward reflect, F = 1 most transit
-// (F=0.5, g=0) - sphere, (F=0.5, g=1) -very polished half transparent mirror, (F=0 g=1) perfect mirror, (F=1 g=1) perfect transparent glass.
+/* Given cosine between rays, return probability density that photon bounce to that direction
+ * g parameter controls how far it difference from uniform sphere. g=0 uniform diffusion-like, g=1 - very close to sharp single ray. */
 
 __device float single_peaked_henyey_greenstein(float cos_theta, float m_g)
 {
-	float p = (1.0f-m_g*m_g)/pow(1.0f+m_g*m_g-2.0f*m_g*cos_theta,1.5f)/4.0f/M_PI_F;
+	float p = (1.0f - m_g * m_g) / pow(1.0f + m_g * m_g - 2.0f * m_g * cos_theta, 1.5f) / 4.0f / M_PI_F;
+
 	return p;
 };
 
-__device int volume_isotropic_setup(ShaderClosure *sc)
+__device int volume_henyey_greenstein_setup(ShaderClosure *sc)
 {
-	sc->type = CLOSURE_VOLUME_ISOTROPIC_ID;
+	sc->type = CLOSURE_VOLUME_HENYEY_GREENSTEIN_ID;
 
 	return SD_BSDF|SD_BSDF_HAS_EVAL;
 }
 
 // just return bsdf at input vector
-__device float3 volume_isotropic_eval_phase(const ShaderClosure *sc, const float3 I, float3 omega_in, float *pdf)
+__device float3 volume_henyey_greenstein_eval_phase(const ShaderClosure *sc, const float3 I, float3 omega_in, float *pdf)
 {
 	float m_g = sc->data1;
 	const float magic_eps = 0.001f;
@@ -49,60 +48,47 @@
 //	float cos_theta = dot(I, omega_in);
 	float cos_theta = dot(-I, omega_in);
 
-	if (fabsf(m_g) <  magic_eps)
+	if(fabsf(m_g) <  magic_eps)
 		*pdf = M_1_PI_F * 0.25f; // ?? double check it
 	else
 		*pdf = single_peaked_henyey_greenstein(cos_theta, m_g);
 
-	return make_float3( *pdf, *pdf, *pdf);
+	return make_float3(*pdf, *pdf, *pdf);
 }
 
-__device int volume_isotropic_sample(const ShaderClosure *sc, float3 Ng, float3 I, float3 dIdx, float3 dIdy, float randu, float randv,
+__device int volume_henyey_greenstein_sample(const ShaderClosure *sc, float3 Ng, float3 I, float3 dIdx, float3 dIdy, float randu, float randv,
 	float3 *eval, float3 *omega_in, float3 *domega_in_dx, float3 *domega_in_dy, float *pdf)
 {
 	float m_g = sc->data1;
 	const float magic_eps = 0.001f;
-#if 0
-	float4 tt4;
-	float3 tt3;
-	float4* ptt4 = &tt4;
-	float3* ptt3 = &tt3;
 
-	tt4.x = 3.3f;
-	tt3.x = 3.3f;
-	(*ptt4).x = 3.3f; 
-	(*ptt3).x = 3.3f; 
-#endif
 	// WARNING! I point in backward direction!
 
-	if ( fabsf(m_g) <  magic_eps)
-	{
-		*omega_in = sample_uniform_sphere( randu, randv);
+	if(fabsf(m_g) <  magic_eps) {
+		*omega_in = sample_uniform_sphere(randu, randv);
 		*pdf = M_1_PI_F * 0.25f; // ?? double check it
 	}
-	else
-	{
+	else {
 		float cos_phi, sin_phi, cos_theta;
 
-		if( fabsf(m_g) <  magic_eps)
+		if(fabsf(m_g) <  magic_eps)
 			cos_theta = (1.0f - 2.0f * randu);
-		else
-		{
+		else {
 			float k = (1.0f - m_g * m_g) / (1.0f - m_g + 2.0f * m_g * randu);
-	//		float cos_theta = 1.0f / (2.0f * m_g) * (1.0f + m_g * m_g - k*k);
-			cos_theta = (1.0f + m_g * m_g - k*k) / (2.0f * m_g);
-	//		float cos_theta = (1.0f - 2.0f * randu);
-	//		float cos_theta = randu;
+			cos_theta = (1.0f + m_g * m_g - k * k) / (2.0f * m_g);
+		//	float cos_theta = 1.0f / (2.0f * m_g) * (1.0f + m_g * m_g - k*k);
+		//	float cos_theta = (1.0f - 2.0f * randu);
+		//	float cos_theta = randu;
 		}
 		float sin_theta = sqrt(1 - cos_theta * cos_theta);
 		
 		float3 T, B;
 		make_orthonormals(-I, &T, &B);
-		float phi = 2.f * M_PI_F * randv;
-		cos_phi = cosf( phi);
-		sin_phi = sinf( phi);
+		float phi = M_2PI_F * randv;
+		cos_phi = cosf(phi);
+		sin_phi = sinf(phi);
 		*omega_in = sin_theta * cos_phi * T + sin_theta * sin_phi * B + cos_theta * (-I);
-		*pdf = single_peaked_henyey_greenstein( cos_theta, m_g);
+		*pdf = single_peaked_henyey_greenstein(cos_theta, m_g);
 	}
 
 	*eval = make_float3(*pdf, *pdf, *pdf); // perfect importance sampling
@@ -144,8 +130,8 @@
 	float3 eval;
 
 	switch(sc->type) {
-		case CLOSURE_VOLUME_ISOTROPIC_ID:
-			eval = volume_isotropic_eval_phase(sc, I, omega_in, pdf);
+		case CLOSURE_VOLUME_HENYEY_GREENSTEIN_ID:
+			eval = volume_henyey_greenstein_eval_phase(sc, I, omega_in, pdf);
 			break;
 		case CLOSURE_VOLUME_TRANSPARENT_ID:
 			eval = volume_transparent_eval_phase(sc, I, omega_in, pdf);
@@ -164,8 +150,8 @@
 	int label;
 
 	switch(sc->type) {
-		case CLOSURE_VOLUME_ISOTROPIC_ID:
-			label = volume_isotropic_sample(sc, sd->Ng, sd->I, sd->dI.dx, sd->dI.dy, randu, randv, eval, omega_in, &domega_in->dx, &domega_in->dy, pdf);
+		case CLOSURE_VOLUME_HENYEY_GREENSTEIN_ID:
+			label = volume_henyey_greenstein_sample(sc, sd->Ng, sd->I, sd->dI.dx, sd->dI.dy, randu, randv, eval, omega_in, &domega_in->dx, &domega_in->dy, pdf);
 			break;
 		case CLOSURE_VOLUME_TRANSPARENT_ID:
 			label = volume_transparent_sample(sc, sd->Ng, sd->I, sd->dI.dx, sd->dI.dy, randu, randv, eval, omega_in, &domega_in->dx, &domega_in->dy, pdf);

Modified: branches/soc-2013-dingto/intern/cycles/kernel/osl/osl_closures.cpp
===================================================================
--- branches/soc-2013-dingto/intern/cycles/kernel/osl/osl_closures.cpp	2013-10-09 18:05:06 UTC (rev 60640)
+++ branches/soc-2013-dingto/intern/cycles/kernel/osl/osl_closures.cpp	2013-10-09 18:08:05 UTC (rev 60641)
@@ -170,11 +170,11 @@
 #endif
 BSDF_CLOSURE_CLASS_END(HairTransmission, hair_transmission)
 
-VOLUME_CLOSURE_CLASS_BEGIN(VolumeIsotropic, isotropic, isotropic)
-	CLOSURE_FLOAT3_PARAM(VolumeIsotropicClosure, sc.N),
-	CLOSURE_FLOAT_PARAM(VolumeIsotropicClosure, sc.data0),
-	CLOSURE_FLOAT_PARAM(VolumeIsotropicClosure, sc.data1),
-VOLUME_CLOSURE_CLASS_END(VolumeIsotropic, isotropic)
+VOLUME_CLOSURE_CLASS_BEGIN(VolumeHenyeyGreenstein, henyey_greenstein, henyey_greenstein)
+	CLOSURE_FLOAT3_PARAM(VolumeHenyeyGreensteinClosure, sc.N),
+	CLOSURE_FLOAT_PARAM(VolumeHenyeyGreensteinClosure, sc.data0),
+	CLOSURE_FLOAT_PARAM(VolumeHenyeyGreensteinClosure, sc.data1),
+VOLUME_CLOSURE_CLASS_END(VolumeHenyeyGreenstein, henyey_greenstein)
 
 /* Registration */
 
@@ -265,8 +265,8 @@
 	register_closure(ss, "hair_transmission", id++,
 		bsdf_hair_transmission_params(), bsdf_hair_transmission_prepare);
 
-	register_closure(ss, "isotropic", id++,
-		volume_isotropic_params(), volume_isotropic_prepare);
+	register_closure(ss, "henyey_greenstein", id++,
+		volume_henyey_greenstein_params(), volume_henyey_greenstein_prepare);
 }
 
 CCL_NAMESPACE_END

Modified: branches/soc-2013-dingto/intern/cycles/kernel/osl/osl_closures.h
===================================================================
--- branches/soc-2013-dingto/intern/cycles/kernel/osl/osl_closures.h	2013-10-09 18:05:06 UTC (rev 60640)
+++ branches/soc-2013-dingto/intern/cycles/kernel/osl/osl_closures.h	2013-10-09 18:08:05 UTC (rev 60641)
@@ -54,7 +54,7 @@
 OSL::ClosureParam *closure_bssrdf_gaussian_params();
 OSL::ClosureParam *closure_bssrdf_cubic_extended_params();
 OSL::ClosureParam *closure_bssrdf_gaussian_extended_params();
-OSL::ClosureParam *closure_isotropic_volume_params();
+OSL::ClosureParam *closure_henyey_greenstein_volume_params();
 
 void closure_emission_prepare(OSL::RendererServices *, int id, void *data);
 void closure_background_prepare(OSL::RendererServices *, int id, void *data);
@@ -66,7 +66,7 @@
 void closure_westin_sheen_prepare(OSL::RendererServices *, int id, void *data);
 void closure_bssrdf_cubic_prepare(OSL::RendererServices *, int id, void *data);
 void closure_bssrdf_gaussian_prepare(OSL::RendererServices *, int id, void *data);
-void closure_isotropic_volume_prepare(OSL::RendererServices *, int id, void *data);
+void closure_henyey_greenstein_volume_prepare(OSL::RendererServices *, int id, void *data);
 
 enum {
 	AmbientOcclusion = 100

Modified: branches/soc-2013-dingto/intern/cycles/kernel/shaders/CMakeLists.txt
===================================================================
--- branches/soc-2013-dingto/intern/cycles/kernel/shaders/CMakeLists.txt	2013-10-09 18:05:06 UTC (rev 60640)
+++ branches/soc-2013-dingto/intern/cycles/kernel/shaders/CMakeLists.txt	2013-10-09 18:08:05 UTC (rev 60641)
@@ -29,11 +29,11 @@
 	node_glossy_bsdf.osl
 	node_gradient_texture.osl
 	node_hair_info.osl
+	node_henyey_greenstein_volume.osl
 	node_holdout.osl
 	node_hsv.osl
 	node_image_texture.osl
 	node_invert.osl
-	node_isotropic_volume.osl
 	node_layer_weight.osl
 	node_light_falloff.osl
 	node_light_path.osl

Copied: branches/soc-2013-dingto/intern/cycles/kernel/shaders/node_henyey_greenstein_volume.osl (from rev 60458, branches/soc-2013-dingto/intern/cycles/kernel/shaders/node_isotropic_volume.osl)
===================================================================
--- branches/soc-2013-dingto/intern/cycles/kernel/shaders/node_henyey_greenstein_volume.osl	                        (rev 0)
+++ branches/soc-2013-dingto/intern/cycles/kernel/shaders/node_henyey_greenstein_volume.osl	2013-10-09 18:08:05 UTC (rev 60641)
@@ -0,0 +1,27 @@
+/*
+ * Copyright 2011-2013 Blender Foundation
+ *
+ * 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
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * 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
+ * limitations under the License
+ */
+
+#include "stdosl.h"
+
+shader node_henyey_greenstein_volume(
+	color Color = color(0.8, 0.8, 0.8),
+	float Density = 1.0,
+	float g = 0.0,
+	normal Normal = N,
+	output closure color Volume = 0)
+{
+	Volume = Color * henyey_greenstein(Normal, Density, g);
+}


@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list