Fix T38439: allow IOR in range [0, inf] instead of [1, inf] in Cycles.
The same can be achieved by flipping normals on the mesh, but it can be convenient to do this in the shader.
This commit is contained in:
@@ -22,7 +22,7 @@ shader node_fresnel(
|
|||||||
normal Normal = N,
|
normal Normal = N,
|
||||||
output float Fac = 0.0)
|
output float Fac = 0.0)
|
||||||
{
|
{
|
||||||
float f = max(IOR, 1.0 + 1e-5);
|
float f = max(IOR, 1e-5);
|
||||||
float eta = backfacing() ? 1.0 / f: f;
|
float eta = backfacing() ? 1.0 / f: f;
|
||||||
float cosi = dot(I, Normal);
|
float cosi = dot(I, Normal);
|
||||||
Fac = fresnel_dielectric_cos(cosi, eta);
|
Fac = fresnel_dielectric_cos(cosi, eta);
|
||||||
|
@@ -25,7 +25,7 @@ shader node_glass_bsdf(
|
|||||||
normal Normal = N,
|
normal Normal = N,
|
||||||
output closure color BSDF = 0)
|
output closure color BSDF = 0)
|
||||||
{
|
{
|
||||||
float f = max(IOR, 1.0 + 1e-5);
|
float f = max(IOR, 1e-5);
|
||||||
float eta = backfacing() ? 1.0 / f: f;
|
float eta = backfacing() ? 1.0 / f: f;
|
||||||
float cosi = dot(I, Normal);
|
float cosi = dot(I, Normal);
|
||||||
float Fr = fresnel_dielectric_cos(cosi, eta);
|
float Fr = fresnel_dielectric_cos(cosi, eta);
|
||||||
|
@@ -24,7 +24,7 @@ shader node_refraction_bsdf(
|
|||||||
normal Normal = N,
|
normal Normal = N,
|
||||||
output closure color BSDF = 0)
|
output closure color BSDF = 0)
|
||||||
{
|
{
|
||||||
float f = max(IOR, 1.0 + 1e-5);
|
float f = max(IOR, 1e-5);
|
||||||
float eta = backfacing() ? 1.0 / f: f;
|
float eta = backfacing() ? 1.0 / f: f;
|
||||||
|
|
||||||
if (distribution == "Sharp")
|
if (distribution == "Sharp")
|
||||||
|
@@ -225,7 +225,7 @@ ccl_device void svm_node_closure_bsdf(KernelGlobals *kg, ShaderData *sd, float *
|
|||||||
sc->N = N;
|
sc->N = N;
|
||||||
sc->data0 = param1;
|
sc->data0 = param1;
|
||||||
|
|
||||||
float eta = fmaxf(param2, 1.0f + 1e-5f);
|
float eta = fmaxf(param2, 1e-5f);
|
||||||
sc->data1 = (sd->flag & SD_BACKFACING)? 1.0f/eta: eta;
|
sc->data1 = (sd->flag & SD_BACKFACING)? 1.0f/eta: eta;
|
||||||
|
|
||||||
/* setup bsdf */
|
/* setup bsdf */
|
||||||
@@ -247,7 +247,7 @@ ccl_device void svm_node_closure_bsdf(KernelGlobals *kg, ShaderData *sd, float *
|
|||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
/* index of refraction */
|
/* index of refraction */
|
||||||
float eta = fmaxf(param2, 1.0f + 1e-5f);
|
float eta = fmaxf(param2, 1e-5f);
|
||||||
eta = (sd->flag & SD_BACKFACING)? 1.0f/eta: eta;
|
eta = (sd->flag & SD_BACKFACING)? 1.0f/eta: eta;
|
||||||
|
|
||||||
/* fresnel */
|
/* fresnel */
|
||||||
|
@@ -25,7 +25,7 @@ ccl_device void svm_node_fresnel(ShaderData *sd, float *stack, uint ior_offset,
|
|||||||
float eta = (stack_valid(ior_offset))? stack_load_float(stack, ior_offset): __uint_as_float(ior_value);
|
float eta = (stack_valid(ior_offset))? stack_load_float(stack, ior_offset): __uint_as_float(ior_value);
|
||||||
float3 normal_in = stack_valid(normal_offset)? stack_load_float3(stack, normal_offset): sd->N;
|
float3 normal_in = stack_valid(normal_offset)? stack_load_float3(stack, normal_offset): sd->N;
|
||||||
|
|
||||||
eta = fmaxf(eta, 1.0f + 1e-5f);
|
eta = fmaxf(eta, 1e-5f);
|
||||||
eta = (sd->flag & SD_BACKFACING)? 1.0f/eta: eta;
|
eta = (sd->flag & SD_BACKFACING)? 1.0f/eta: eta;
|
||||||
|
|
||||||
float f = fresnel_dielectric_cos(dot(sd->I, normal_in), eta);
|
float f = fresnel_dielectric_cos(dot(sd->I, normal_in), eta);
|
||||||
|
@@ -32,7 +32,7 @@
|
|||||||
static bNodeSocketTemplate sh_node_bsdf_glass_in[] = {
|
static bNodeSocketTemplate sh_node_bsdf_glass_in[] = {
|
||||||
{ SOCK_RGBA, 1, N_("Color"), 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
|
{ SOCK_RGBA, 1, N_("Color"), 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
|
||||||
{ SOCK_FLOAT, 1, N_("Roughness"), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_FACTOR},
|
{ SOCK_FLOAT, 1, N_("Roughness"), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_FACTOR},
|
||||||
{ SOCK_FLOAT, 1, N_("IOR"), 1.45f, 0.0f, 0.0f, 0.0f, 1.0f, 1000.0f},
|
{ SOCK_FLOAT, 1, N_("IOR"), 1.45f, 0.0f, 0.0f, 0.0f, 0.0f, 1000.0f},
|
||||||
{ SOCK_VECTOR, 1, N_("Normal"), 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f, PROP_NONE, SOCK_HIDE_VALUE},
|
{ SOCK_VECTOR, 1, N_("Normal"), 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f, PROP_NONE, SOCK_HIDE_VALUE},
|
||||||
{ -1, 0, "" }
|
{ -1, 0, "" }
|
||||||
};
|
};
|
||||||
|
@@ -32,7 +32,7 @@
|
|||||||
static bNodeSocketTemplate sh_node_bsdf_refraction_in[] = {
|
static bNodeSocketTemplate sh_node_bsdf_refraction_in[] = {
|
||||||
{ SOCK_RGBA, 1, N_("Color"), 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
|
{ SOCK_RGBA, 1, N_("Color"), 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
|
||||||
{ SOCK_FLOAT, 1, N_("Roughness"), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_FACTOR},
|
{ SOCK_FLOAT, 1, N_("Roughness"), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_FACTOR},
|
||||||
{ SOCK_FLOAT, 1, N_("IOR"), 1.45f, 0.0f, 0.0f, 0.0f, 1.0f, 1000.0f},
|
{ SOCK_FLOAT, 1, N_("IOR"), 1.45f, 0.0f, 0.0f, 0.0f, 0.0f, 1000.0f},
|
||||||
{ SOCK_VECTOR, 1, N_("Normal"), 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f, PROP_NONE, SOCK_HIDE_VALUE},
|
{ SOCK_VECTOR, 1, N_("Normal"), 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f, PROP_NONE, SOCK_HIDE_VALUE},
|
||||||
{ -1, 0, "" }
|
{ -1, 0, "" }
|
||||||
};
|
};
|
||||||
|
@@ -29,7 +29,7 @@
|
|||||||
|
|
||||||
/* **************** Fresnel ******************** */
|
/* **************** Fresnel ******************** */
|
||||||
static bNodeSocketTemplate sh_node_fresnel_in[] = {
|
static bNodeSocketTemplate sh_node_fresnel_in[] = {
|
||||||
{ SOCK_FLOAT, 1, N_("IOR"), 1.45f, 0.0f, 0.0f, 0.0f, 1.0f, 1000.0f},
|
{ SOCK_FLOAT, 1, N_("IOR"), 1.45f, 0.0f, 0.0f, 0.0f, 0.0f, 1000.0f},
|
||||||
{ SOCK_VECTOR, 1, N_("Normal"), 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f, PROP_NONE, SOCK_HIDE_VALUE},
|
{ SOCK_VECTOR, 1, N_("Normal"), 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f, PROP_NONE, SOCK_HIDE_VALUE},
|
||||||
{ -1, 0, "" }
|
{ -1, 0, "" }
|
||||||
};
|
};
|
||||||
|
Reference in New Issue
Block a user