[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