[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [59968] branches/soc-2013-dingto/intern/ cycles: OSL implementation of the Henyey-Greenstein volume closure.

Lukas Toenne lukas.toenne at googlemail.com
Mon Sep 9 22:13:39 CEST 2013


Revision: 59968
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=59968
Author:   lukastoenne
Date:     2013-09-09 20:13:39 +0000 (Mon, 09 Sep 2013)
Log Message:
-----------
OSL implementation of the Henyey-Greenstein volume closure. A lot of cleanup included.

Modified Paths:
--------------
    branches/soc-2013-dingto/intern/cycles/kernel/closure/bsdf.h
    branches/soc-2013-dingto/intern/cycles/kernel/closure/volume.h
    branches/soc-2013-dingto/intern/cycles/kernel/kernel_shader.h
    branches/soc-2013-dingto/intern/cycles/kernel/kernel_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/osl/osl_shader.cpp
    branches/soc-2013-dingto/intern/cycles/kernel/osl/osl_shader.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

Modified: branches/soc-2013-dingto/intern/cycles/kernel/closure/bsdf.h
===================================================================
--- branches/soc-2013-dingto/intern/cycles/kernel/closure/bsdf.h	2013-09-09 19:49:07 UTC (rev 59967)
+++ branches/soc-2013-dingto/intern/cycles/kernel/closure/bsdf.h	2013-09-09 20:13:39 UTC (rev 59968)
@@ -139,7 +139,7 @@
 #ifdef __VOLUME__
 	// need this to keep logic in kernel_emission.h direct light in case of volume particle
 	if (sc->type == CLOSURE_BSDF_DOUBLE_PEAKED_HENYEY_GREENSTEIN_ID)
-		return bsdf_double_peaked_henyey_greenstein_eval(sd, sc, sd->I, omega_in, pdf);
+		return bsdf_double_peaked_henyey_greenstein_eval(sc, sd->I, omega_in, pdf);
 #endif
 
 	if(dot(sd->Ng, omega_in) >= 0.0f) {

Modified: branches/soc-2013-dingto/intern/cycles/kernel/closure/volume.h
===================================================================
--- branches/soc-2013-dingto/intern/cycles/kernel/closure/volume.h	2013-09-09 19:49:07 UTC (rev 59967)
+++ branches/soc-2013-dingto/intern/cycles/kernel/closure/volume.h	2013-09-09 20:13:39 UTC (rev 59968)
@@ -19,15 +19,15 @@
 
 CCL_NAMESPACE_BEGIN
 
+#if 0 /* XXX unused */
 /* note: the interfaces here are just as an example, need to figure
  * out the right functions and parameters to use */
 
 /* ISOTROPIC VOLUME CLOSURE */
 
-__device int volume_isotropic_setup(ShaderClosure *sc, float density)
+__device int volume_isotropic_setup(ShaderClosure *sc)
 {
 	sc->type = CLOSURE_VOLUME_ISOTROPIC_ID;
-	sc->data0 = density;
 
 	return SD_VOLUME;
 }
@@ -39,10 +39,9 @@
 
 /* TRANSPARENT VOLUME CLOSURE */
 
-__device int volume_transparent_setup(ShaderClosure *sc, float density)
+__device int volume_transparent_setup(ShaderClosure *sc)
 {
 	sc->type = CLOSURE_VOLUME_TRANSPARENT_ID;
-	sc->data0 = density;
 
 	return SD_VOLUME;
 }
@@ -77,17 +76,22 @@
 
 	return eval;
 }
+#endif
 
 /* HENYEY_GREENSTEIN CLOSURE */
 
-__device int volume_double_peaked_henyey_greeenstein_setup(ShaderClosure *sc, float density, float g)
+__device int volume_double_peaked_henyey_greeenstein_setup(ShaderClosure *sc)
 {
 	sc->type = CLOSURE_BSDF_DOUBLE_PEAKED_HENYEY_GREENSTEIN_ID;
-	sc->data0 = density;
-	sc->data1 = g;
 	return SD_BSDF|SD_BSDF_HAS_EVAL;
 }
 
+/* XXX wrapper for OSL closure macros + typo fix ... remove after cleanup */
+__device int bsdf_henyey_greenstein_setup(ShaderClosure *sc)
+{
+	return volume_double_peaked_henyey_greeenstein_setup(sc);
+}
+
 // 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
@@ -186,15 +190,15 @@
 // new optimized, importance sampled version, no difference when g = 0 but huge gain at other g values (less variance)
 
 // just return bsdf at input vector
-__device float3 bsdf_double_peaked_henyey_greenstein_eval(const ShaderData *sd, const ShaderClosure *sc, const float3 I, float3 omega_in, float *pdf)
+__device float3 bsdf_double_peaked_henyey_greenstein_eval(const ShaderClosure *sc, const float3 I, float3 omega_in, float *pdf)
 {
 //	float m_F = sc->data0;
 	float m_g = sc->data1;
 	const float magic_eps = 0.001f;
 
-	// WARNING! sd->I point in backward direction!
-//	float cos_theta = dot( sd->I, omega_in);
-	float cos_theta = dot( -sd->I, omega_in);
+	// WARNING! I point in backward direction!
+//	float cos_theta = dot( I, omega_in);
+	float cos_theta = dot( -I, omega_in);
 //	*pdf = double_peaked_henyey_greenstein( cos_theta, m_F, m_g);
 	if ( fabsf(m_g) <  magic_eps)
 		*pdf = M_1_PI_F * 0.25f; // ?? double check it
@@ -203,10 +207,16 @@
 //	*pdf = M_1_PI_F / 4;
 	return make_float3( *pdf, *pdf, *pdf);
 }
-__device int bsdf_double_peaked_henyey_greenstein_sample(const ShaderData *sd, const ShaderClosure *sc, float randu, float randv, float3 *eval, float3 *omega_in, float3 *domega_in_dx, float3 *domega_in_dy, float *pdf)
+
+/* XXX wrapper for OSL closure macros ... remove after cleanup */
+__device float3 bsdf_henyey_greenstein_eval(const ShaderClosure *sc, const float3 I, float3 omega_in, float *pdf)
 {
+	return bsdf_double_peaked_henyey_greenstein_eval(sc, I, omega_in, pdf);
+}
+
+__device int bsdf_double_peaked_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;
-	float3 m_N = sd->N;
 	const float magic_eps = 0.001f;
 #if 0
 	float4 tt4;
@@ -219,7 +229,7 @@
 	(*ptt4).x = 3.3f; 
 	(*ptt3).x = 3.3f; 
 #endif
-	// WARNING! sd->I point in backward direction!
+	// WARNING! I point in backward direction!
 
 	if ( fabsf(m_g) <  magic_eps)
 	{
@@ -243,25 +253,31 @@
 		float sin_theta = sqrt(1 - cos_theta * cos_theta);
 		
 		float3 T, B;
-		make_orthonormals(-sd->I, &T, &B);
+		make_orthonormals(-I, &T, &B);
 		float phi = 2.f * M_PI_F * randv;
 		cos_phi = cosf( phi);
 		sin_phi = sinf( phi);
-		*omega_in = sin_theta * cos_phi * T + sin_theta * sin_phi * B + cos_theta * (-sd->I);
+		*omega_in = sin_theta * cos_phi * T + sin_theta * sin_phi * B + cos_theta * (-I);
 		*pdf = single_peaked_henyey_greenstein( cos_theta, m_g);
 	}
 
 	*eval = make_float3(*pdf, *pdf, *pdf); // perfect importance sampling
 #ifdef __RAY_DIFFERENTIALS__
 		// TODO: find a better approximation for the diffuse bounce
-		*domega_in_dx = (2 * dot(m_N, sd->dI.dx)) * m_N - sd->dI.dx;
-		*domega_in_dy = (2 * dot(m_N, sd->dI.dy)) * m_N - sd->dI.dy;
+		*domega_in_dx = (2 * dot(Ng, dIdx)) * Ng - dIdx;
+		*domega_in_dy = (2 * dot(Ng, dIdy)) * Ng - dIdy;
 		*domega_in_dx *= 125.0f;
 		*domega_in_dy *= 125.0f;
 #endif
 	return LABEL_REFLECT|LABEL_DIFFUSE;
 }
 
+/* XXX wrapper for OSL closure macros ... remove after cleanup */
+__device int bsdf_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)
+{
+	return bsdf_double_peaked_henyey_greenstein_sample(sc, Ng, I, dIdx, dIdy, randu, randv, eval, omega_in, domega_in_dx, domega_in_dy, pdf);
+}
+
 #endif
 
 __device int volume_bsdf_sample(KernelGlobals *kg, const ShaderData *sd, const ShaderClosure *sc, float randu, float randv, float3 *eval, float3 *omega_in, differential3 *domega_in, float *pdf)
@@ -269,13 +285,13 @@
 	int label;
 
 #ifdef __OSL__
-        if(kg->osl && sc->prim)
-			return OSLShader::bsdf_sample(sd, sc, randu, randv, *eval, *omega_in, *domega_in, *pdf);
+//        if(kg->osl && sc->prim)
+//			return OSLShader::bsdf_sample(sd, sc, randu, randv, *eval, *omega_in, *domega_in, *pdf);
 #endif
 
 	switch(sc->type) {
 		case CLOSURE_BSDF_DOUBLE_PEAKED_HENYEY_GREENSTEIN_ID:
-			label = bsdf_double_peaked_henyey_greenstein_sample(sd, sc, randu, randv, eval, omega_in, &domega_in->dx, &domega_in->dy, pdf);
+			label = bsdf_double_peaked_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;
 		default:
 			*eval = make_float3(0.0f, 0.0f, 0.0f);

Modified: branches/soc-2013-dingto/intern/cycles/kernel/kernel_shader.h
===================================================================
--- branches/soc-2013-dingto/intern/cycles/kernel/kernel_shader.h	2013-09-09 19:49:07 UTC (rev 59967)
+++ branches/soc-2013-dingto/intern/cycles/kernel/kernel_shader.h	2013-09-09 20:13:39 UTC (rev 59968)
@@ -963,6 +963,7 @@
 
 /* Volume */
 
+#if 0 /* XXX unused */
 __device float3 shader_volume_eval_phase(KernelGlobals *kg, ShaderData *sd,
 	float3 omega_in, float3 omega_out)
 {
@@ -981,20 +982,23 @@
 	return volume_eval_phase(kg, &sd->closure, omega_in, omega_out);
 #endif
 }
+#endif
 
 /* Volume Evaluation */
 
 __device void shader_eval_volume(KernelGlobals *kg, ShaderData *sd,
 	float randb, int path_flag, ShaderContext ctx)
 {
-#ifdef __SVM__
 #ifdef __OSL__
 	if (kg->osl)
 		OSLShader::eval_volume(kg, sd, randb, path_flag, ctx);
 	else
 #endif
+	{
+#ifdef __SVM__
 		svm_eval_nodes(kg, sd, SHADER_TYPE_VOLUME, randb, path_flag);
 #endif
+	}
 }
 
 __device int shader_volume_bsdf_sample(KernelGlobals *kg, const ShaderData *sd,

Modified: branches/soc-2013-dingto/intern/cycles/kernel/kernel_volume.h
===================================================================
--- branches/soc-2013-dingto/intern/cycles/kernel/kernel_volume.h	2013-09-09 19:49:07 UTC (rev 59967)
+++ branches/soc-2013-dingto/intern/cycles/kernel/kernel_volume.h	2013-09-09 20:13:39 UTC (rev 59968)
@@ -595,23 +595,25 @@
 		 ShaderData *sd, Ray ray, float distance, float* particle_isect_t, int path_flag, float *pdf, float *eval, float3* throughput, float *omega_cache = NULL)
 {
 	/* sample point on volumetric ray (return false - no hit, true - hit : fill new hit t value on path [start,end] */
-       float distance_magic_eps = 1e-4f;
+	float distance_magic_eps = 1e-4f;
 
-       if((sd->flag & SD_HAS_VOLUME) == 0 || (distance < distance_magic_eps))
-               return 0; /* empty volume shader slot or escape from bottle when scattering in solid */
+	if((sd->flag & SD_HAS_VOLUME) == 0 || (distance < distance_magic_eps))
+		return 0; /* empty volume shader slot or escape from bottle when scattering in solid */
 
-       *pdf = 1.0f;
-       *eval = 1.0f;
+	*pdf = 1.0f;
+	*eval = 1.0f;
 	*particle_isect_t = 0.0f;
 
 	if( sd->flag & SD_HOMOGENEOUS_VOLUME)
 	{
 		/* homogeneous media */
 		if (kernel_data.integrator.volume_homogeneous_sampling == 1 && kernel_data.integrator.num_all_lights) {
-			return kernel_volumetric_equiangular_sampler( kg, rng, rng_offset, rng_congruential, pass, randv, randp, sd, ray, path_flag, distance, particle_isect_t, pdf, eval,  omega_cache);
+			bool ok = kernel_volumetric_equiangular_sampler( kg, rng, rng_offset, rng_congruential, pass, randv, randp, sd, ray, path_flag, distance, particle_isect_t, pdf, eval,  omega_cache);
+			return ok;
 		}
 		else {
-			return kernel_volumetric_homogeneous_sampler( kg, rng, rng_offset, pass, randv, randp, sd, ray, path_flag, distance, particle_isect_t, pdf, eval, omega_cache);
+			bool ok = kernel_volumetric_homogeneous_sampler( kg, rng, rng_offset, pass, randv, randp, sd, ray, path_flag, distance, particle_isect_t, pdf, eval, omega_cache);
+			return ok;
 		}
 	}
 	else
@@ -619,23 +621,27 @@

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list