added the disney brdf as a shader node

This commit is contained in:
2016-05-04 13:23:07 +02:00
parent 0630b742d7
commit 0ed0895914
14 changed files with 69 additions and 36 deletions

View File

@@ -527,9 +527,9 @@ static ShaderNode *add_node(Scene *scene,
}
node = hair;
}
/*else if(b_node.is_a(&RNA_ShaderNodeBsdfDisney)) {
else if(b_node.is_a(&RNA_ShaderNodeBsdfDisney)) {
node = new DisneyBsdfNode();
}*/
}
else if(b_node.is_a(&RNA_ShaderNodeBsdfTranslucent)) {
node = new TranslucentBsdfNode();
}

View File

@@ -74,11 +74,9 @@ public:
return bsdf_disney_diffuse_eval_transmit(&sc, omega_out, omega_in, &pdf);
}
int sample(const float3 &Ng,
const float3 &omega_out, const float3 &domega_out_dx, const float3 &domega_out_dy,
float randu, float randv,
float3 &omega_in, float3 &domega_in_dx, float3 &domega_in_dy,
float &pdf, float3 &eval) const
int sample(const float3 &Ng, const float3 &omega_out, const float3 &domega_out_dx,
const float3 &domega_out_dy, float randu, float randv, float3 &omega_in,
float3 &domega_in_dx, float3 &domega_in_dy, float &pdf, float3 &eval) const
{
return bsdf_disney_diffuse_sample(&sc, &dp, Ng, omega_out, domega_out_dx, domega_out_dy,
randu, randv, &eval, &omega_in, &domega_in_dx, &domega_in_dy, &pdf);

View File

@@ -74,11 +74,9 @@ public:
return bsdf_disney_specular_eval_transmit(&sc, omega_out, omega_in, &pdf);
}
int sample(const float3 &Ng,
const float3 &omega_out, const float3 &domega_out_dx, const float3 &domega_out_dy,
float randu, float randv,
float3 &omega_in, float3 &domega_in_dx, float3 &domega_in_dy,
float &pdf, float3 &eval) const
int sample(const float3 &Ng, const float3 &omega_out, const float3 &domega_out_dx,
const float3 &domega_out_dy, float randu, float randv, float3 &omega_in,
float3 &domega_in_dx, float3 &domega_in_dy, float &pdf, float3 &eval) const
{
return bsdf_disney_specular_sample(&sc, &dp, Ng, omega_out, domega_out_dx, domega_out_dy,
randu, randv, &eval, &omega_in, &domega_in_dx, &domega_in_dy, &pdf);

View File

@@ -81,7 +81,7 @@ set(SRC_OSL
node_wireframe.osl
node_hair_bsdf.osl
node_uv_map.osl
#node_disney_bsdf.osl
node_disney_bsdf.osl
)
set(SRC_OSL_HEADERS

View File

@@ -30,9 +30,23 @@ shader node_disney_bsdf(
float ClearcoatGloss = 1.0,
normal Normal = N,
normal Tangent = normalize(dPdu),
normal AnisotropicRotation = normal(0, 0, 0),
//normal AnisotropicRotation = normal(0, 0, 0),
output closure color BSDF = 0)
{
BSDF = disney_diffuse(Normal, BaseColor);
if (Metallic == 1.0) {
BSDF = disney_specular(Normal, Tangent, BaseColor, Metallic, Specular,
SpecularTint, Roughness, Anisotropic)
+ disney_clearcoat(Normal, Clearcoat, ClearcoatGloss);
} else if (Specular == 0.0) {
BSDF = disney_diffuse(Normal, BaseColor, Subsurface, Roughness,
Sheen, SheenTint) * (1.0 - Metallic)
+ disney_clearcoat(Normal, Clearcoat, ClearcoatGloss);
} else {
BSDF = disney_diffuse(Normal, BaseColor, Subsurface, Roughness,
Sheen, SheenTint) * (1.0 - Metallic)
+ disney_specular(Normal, Tangent, BaseColor, Metallic, Specular,
SpecularTint, Roughness, Anisotropic)
+ disney_clearcoat(Normal, Clearcoat, ClearcoatGloss);
}
}

View File

@@ -2068,10 +2068,32 @@ void DiffuseBsdfNode::compile(OSLCompiler& compiler)
}
/* Disney BSDF Closure */
/*DisneyBsdfNode::DisneyBsdfNode()
DisneyBsdfNode::DisneyBsdfNode()
{
closure = CLOSURE_BSDF_DISNEY_DIFFUSE_ID;
}*/
add_input("BaseColor", SHADER_SOCKET_COLOR, make_float3(0.646f, 0.415f, 0.017f));
add_input("Metallic", SHADER_SOCKET_FLOAT, 0.0f);
add_input("Subsurface", SHADER_SOCKET_FLOAT, 0.0f);
add_input("Specular", SHADER_SOCKET_FLOAT, 0.5f);
add_input("Roughness", SHADER_SOCKET_FLOAT, 0.5f);
add_input("SpecularTint", SHADER_SOCKET_FLOAT, 0.0f);
add_input("Anisotropic", SHADER_SOCKET_FLOAT, 0.0f);
add_input("Sheen", SHADER_SOCKET_FLOAT, 0.0f);
add_input("SheenTint", SHADER_SOCKET_FLOAT, 0.5f);
add_input("Clearcoat", SHADER_SOCKET_FLOAT, 0.0f);
add_input("ClearcoatGloss", SHADER_SOCKET_FLOAT, 1.0f);
add_input("Tangent", SHADER_SOCKET_VECTOR, ShaderInput::TANGENT);
}
void DisneyBsdfNode::compile(SVMCompiler& compiler)
{
}
void DisneyBsdfNode::compile(OSLCompiler& compiler)
{
compiler.add(this, "node_disney_bsdf");
}
/* Translucent BSDF Closure */

View File

@@ -410,10 +410,11 @@ public:
SHADER_NODE_CLASS(DiffuseBsdfNode)
};
/*class DisneyBsdfNode : public BsdfNode {
/* Disney BRDF */
class DisneyBsdfNode : public BsdfNode {
public:
SHADER_NODE_CLASS(DisneyBsdfNode)
};*/
};
class TranslucentBsdfNode : public BsdfNode {
public:

View File

@@ -218,7 +218,7 @@ shader_node_categories = [
NodeItem("ShaderNodeMixShader"),
NodeItem("ShaderNodeAddShader"),
NodeItem("ShaderNodeBsdfDiffuse", poll=object_shader_nodes_poll),
#NodeItem("ShaderNodeBsdfDisney", poll=object_shader_nodes_poll),
NodeItem("ShaderNodeBsdfDisney", poll=object_shader_nodes_poll),
NodeItem("ShaderNodeBsdfGlossy", poll=object_shader_nodes_poll),
NodeItem("ShaderNodeBsdfTransparent", poll=object_shader_nodes_poll),
NodeItem("ShaderNodeBsdfRefraction", poll=object_shader_nodes_poll),

View File

@@ -787,7 +787,7 @@ struct ShadeResult;
#define SH_NODE_OUTPUT_LINESTYLE 190
#define SH_NODE_UVALONGSTROKE 191
#define SH_NODE_TEX_POINTDENSITY 192
//#define SH_NODE_BSDF_DISNEY 193
#define SH_NODE_BSDF_DISNEY 193
/* custom defines options for Material node */
#define SH_NODE_MAT_DIFF 1

View File

@@ -3672,7 +3672,7 @@ static void registerShaderNodes(void)
register_node_type_sh_background();
register_node_type_sh_bsdf_anisotropic();
register_node_type_sh_bsdf_diffuse();
//register_node_type_sh_bsdf_disney();
register_node_type_sh_bsdf_disney();
register_node_type_sh_bsdf_glossy();
register_node_type_sh_bsdf_glass();
register_node_type_sh_bsdf_translucent();

View File

@@ -163,7 +163,7 @@ set(SRC
shader/nodes/node_shader_background.c
shader/nodes/node_shader_bsdf_anisotropic.c
shader/nodes/node_shader_bsdf_diffuse.c
#shader/nodes/node_shader_bsdf_disney.c
shader/nodes/node_shader_bsdf_disney.c
shader/nodes/node_shader_bsdf_glass.c
shader/nodes/node_shader_bsdf_glossy.c
shader/nodes/node_shader_bsdf_toon.c

View File

@@ -106,7 +106,7 @@ void register_node_type_sh_bsdf_transparent(void);
void register_node_type_sh_bsdf_velvet(void);
void register_node_type_sh_bsdf_toon(void);
void register_node_type_sh_bsdf_anisotropic(void);
//void register_node_type_sh_bsdf_disney(void);
void register_node_type_sh_bsdf_disney(void);
void register_node_type_sh_emission(void);
void register_node_type_sh_holdout(void);
void register_node_type_sh_volume_absorption(void);

View File

@@ -80,7 +80,7 @@ DefNode( ShaderNode, SH_NODE_BACKGROUND, 0, "BA
DefNode( ShaderNode, SH_NODE_HOLDOUT, 0, "HOLDOUT", Holdout, "Holdout", "" )
DefNode( ShaderNode, SH_NODE_BSDF_ANISOTROPIC, def_anisotropic, "BSDF_ANISOTROPIC", BsdfAnisotropic, "Anisotropic BSDF", "" )
DefNode( ShaderNode, SH_NODE_BSDF_DIFFUSE, 0, "BSDF_DIFFUSE", BsdfDiffuse, "Diffuse BSDF", "" )
//DefNode( ShaderNode, SH_NODE_BSDF_DISNEY, 0, "BSDF_DISNEY", BsdfDisney, "Disney BSDF", "" )
DefNode( ShaderNode, SH_NODE_BSDF_DISNEY, 0, "BSDF_DISNEY", BsdfDisney, "Disney BSDF", "" )
DefNode( ShaderNode, SH_NODE_BSDF_GLOSSY, def_glossy, "BSDF_GLOSSY", BsdfGlossy, "Glossy BSDF", "" )
DefNode( ShaderNode, SH_NODE_BSDF_GLASS, def_glass, "BSDF_GLASS", BsdfGlass, "Glass BSDF", "" )
DefNode( ShaderNode, SH_NODE_BSDF_REFRACTION, def_glass, "BSDF_REFRACTION", BsdfRefraction, "Refraction BSDF", "" )

View File

@@ -31,19 +31,19 @@
static bNodeSocketTemplate sh_node_bsdf_disney_in[] = {
{ SOCK_RGBA, 1, N_("BaseColor"), 0.64555527f, 0.41514809f, 0.01698805f, 1.0f, 0.0f, 1.0f},
{ SOCK_FLOAT, 1, N_("Metallic"), 0.2f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_FACTOR},
{ SOCK_FLOAT, 1, N_("Subsurface"), 0.2f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_FACTOR},
{ SOCK_FLOAT, 1, N_("Specular"), 0.2f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_FACTOR},
{ SOCK_FLOAT, 1, N_("Roughness"), 0.2f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_FACTOR},
{ SOCK_FLOAT, 1, N_("SpecularTint"), 0.2f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_FACTOR},
{ SOCK_FLOAT, 1, N_("Anisotropic"), 0.2f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_FACTOR},
{ SOCK_FLOAT, 1, N_("Sheen"), 0.2f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_FACTOR},
{ SOCK_FLOAT, 1, N_("SheenTint"), 0.2f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_FACTOR},
{ SOCK_FLOAT, 1, N_("Clearcoat"), 0.2f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_FACTOR},
{ SOCK_FLOAT, 1, N_("ClearcoatGloss"), 0.2f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_FACTOR},
{ SOCK_FLOAT, 1, N_("Metallic"), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_FACTOR},
{ SOCK_FLOAT, 1, N_("Subsurface"), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_FACTOR},
{ SOCK_FLOAT, 1, N_("Specular"), 0.5f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_FACTOR},
{ SOCK_FLOAT, 1, N_("Roughness"), 0.5f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_FACTOR},
{ SOCK_FLOAT, 1, N_("SpecularTint"), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_FACTOR},
{ SOCK_FLOAT, 1, N_("Anisotropic"), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_FACTOR},
{ SOCK_FLOAT, 1, N_("Sheen"), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_FACTOR},
{ SOCK_FLOAT, 1, N_("SheenTint"), 0.5f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_FACTOR},
{ SOCK_FLOAT, 1, N_("Clearcoat"), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_FACTOR},
{ SOCK_FLOAT, 1, N_("ClearcoatGloss"), 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, PROP_FACTOR},
{ 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_("Tangent"), 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f, PROP_NONE, SOCK_HIDE_VALUE},
{ SOCK_VECTOR, 1, N_("AnisotropicRotation"), 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f, PROP_NONE, SOCK_HIDE_VALUE},
//{ SOCK_VECTOR, 1, N_("AnisotropicRotation"), 0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f, PROP_NONE, SOCK_HIDE_VALUE},
{ -1, 0, "" }
};