Cycles: support baking normals plugged into BSDFs, averaged with closure weight.
This commit is contained in:
@@ -342,8 +342,8 @@ ccl_device void kernel_bake_evaluate(KernelGlobals *kg, ccl_global uint4 *input,
|
|||||||
shader_eval_surface(kg, &sd, &state, 0.f, 0, SHADER_CONTEXT_MAIN);
|
shader_eval_surface(kg, &sd, &state, 0.f, 0, SHADER_CONTEXT_MAIN);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* compression: normal = (2 * color) - 1 */
|
/* encoding: normal = (2 * color) - 1 */
|
||||||
out = sd.N * 0.5f + make_float3(0.5f, 0.5f, 0.5f);
|
out = shader_bsdf_average_normal(kg, &sd) * 0.5f + make_float3(0.5f, 0.5f, 0.5f);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case SHADER_EVAL_UV:
|
case SHADER_EVAL_UV:
|
||||||
|
@@ -260,7 +260,7 @@ ccl_device_inline void kernel_write_data_passes(KernelGlobals *kg, ccl_global fl
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(flag & PASS_NORMAL) {
|
if(flag & PASS_NORMAL) {
|
||||||
float3 normal = sd->N;
|
float3 normal = shader_bsdf_average_normal(kg, sd);
|
||||||
kernel_write_pass_float3(buffer + kernel_data.film.pass_normal, sample, normal);
|
kernel_write_pass_float3(buffer + kernel_data.film.pass_normal, sample, normal);
|
||||||
}
|
}
|
||||||
if(flag & PASS_UV) {
|
if(flag & PASS_UV) {
|
||||||
|
@@ -764,6 +764,19 @@ ccl_device float3 shader_bsdf_subsurface(KernelGlobals *kg, ShaderData *sd)
|
|||||||
return eval;
|
return eval;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ccl_device float3 shader_bsdf_average_normal(KernelGlobals *kg, ShaderData *sd)
|
||||||
|
{
|
||||||
|
float3 N = make_float3(0.0f, 0.0f, 0.0f);
|
||||||
|
|
||||||
|
for(int i = 0; i < sd->num_closure; i++) {
|
||||||
|
ShaderClosure *sc = &sd->closure[i];
|
||||||
|
if(CLOSURE_IS_BSDF_OR_BSSRDF(sc->type))
|
||||||
|
N += sc->N*average(sc->weight);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (is_zero(N))? sd->N : normalize(N);
|
||||||
|
}
|
||||||
|
|
||||||
ccl_device float3 shader_bsdf_ao(KernelGlobals *kg, ShaderData *sd, float ao_factor, float3 *N_)
|
ccl_device float3 shader_bsdf_ao(KernelGlobals *kg, ShaderData *sd, float ao_factor, float3 *N_)
|
||||||
{
|
{
|
||||||
float3 eval = make_float3(0.0f, 0.0f, 0.0f);
|
float3 eval = make_float3(0.0f, 0.0f, 0.0f);
|
||||||
@@ -783,12 +796,7 @@ ccl_device float3 shader_bsdf_ao(KernelGlobals *kg, ShaderData *sd, float ao_fac
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(is_zero(N))
|
*N_ = (is_zero(N))? sd->N : normalize(N);
|
||||||
N = sd->N;
|
|
||||||
else
|
|
||||||
N = normalize(N);
|
|
||||||
|
|
||||||
*N_ = N;
|
|
||||||
return eval;
|
return eval;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -878,7 +878,7 @@ enum ShaderDataFlag {
|
|||||||
SD_VOLUME_MIS = (1 << 23),
|
SD_VOLUME_MIS = (1 << 23),
|
||||||
/* Use cubic interpolation for voxels. */
|
/* Use cubic interpolation for voxels. */
|
||||||
SD_VOLUME_CUBIC = (1 << 24),
|
SD_VOLUME_CUBIC = (1 << 24),
|
||||||
/* Has data connected to the displacement input. */
|
/* Has data connected to the displacement input or uses bump map. */
|
||||||
SD_HAS_BUMP = (1 << 25),
|
SD_HAS_BUMP = (1 << 25),
|
||||||
/* Has true displacement. */
|
/* Has true displacement. */
|
||||||
SD_HAS_DISPLACEMENT = (1 << 26),
|
SD_HAS_DISPLACEMENT = (1 << 26),
|
||||||
|
@@ -151,6 +151,7 @@ public:
|
|||||||
virtual bool has_surface_emission() { return false; }
|
virtual bool has_surface_emission() { return false; }
|
||||||
virtual bool has_surface_transparent() { return false; }
|
virtual bool has_surface_transparent() { return false; }
|
||||||
virtual bool has_surface_bssrdf() { return false; }
|
virtual bool has_surface_bssrdf() { return false; }
|
||||||
|
virtual bool has_bump() { return false; }
|
||||||
virtual bool has_bssrdf_bump() { return false; }
|
virtual bool has_bssrdf_bump() { return false; }
|
||||||
virtual bool has_spatial_varying() { return false; }
|
virtual bool has_spatial_varying() { return false; }
|
||||||
virtual bool has_object_dependency() { return false; }
|
virtual bool has_object_dependency() { return false; }
|
||||||
|
@@ -1845,6 +1845,14 @@ void BsdfNode::compile(OSLCompiler& /*compiler*/)
|
|||||||
assert(0);
|
assert(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool BsdfNode::has_bump()
|
||||||
|
{
|
||||||
|
/* detect if anything is plugged into the normal input besides the default */
|
||||||
|
ShaderInput *normal_in = input("Normal");
|
||||||
|
return (normal_in && normal_in->link &&
|
||||||
|
normal_in->link->parent->special_type != SHADER_SPECIAL_TYPE_GEOMETRY);
|
||||||
|
}
|
||||||
|
|
||||||
/* Anisotropic BSDF Closure */
|
/* Anisotropic BSDF Closure */
|
||||||
|
|
||||||
NODE_DEFINE(AnisotropicBsdfNode)
|
NODE_DEFINE(AnisotropicBsdfNode)
|
||||||
@@ -2439,9 +2447,7 @@ void PrincipledBsdfNode::compile(OSLCompiler& compiler)
|
|||||||
|
|
||||||
bool PrincipledBsdfNode::has_bssrdf_bump()
|
bool PrincipledBsdfNode::has_bssrdf_bump()
|
||||||
{
|
{
|
||||||
/* detect if anything is plugged into the normal input besides the default */
|
return has_surface_bssrdf() && has_bump();
|
||||||
ShaderInput *normal_in = input("Normal");
|
|
||||||
return (normal_in->link && normal_in->link->parent->special_type != SHADER_SPECIAL_TYPE_GEOMETRY);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Translucent BSDF Closure */
|
/* Translucent BSDF Closure */
|
||||||
|
@@ -337,6 +337,7 @@ public:
|
|||||||
bool has_spatial_varying() { return true; }
|
bool has_spatial_varying() { return true; }
|
||||||
void compile(SVMCompiler& compiler, ShaderInput *param1, ShaderInput *param2, ShaderInput *param3 = NULL, ShaderInput *param4 = NULL);
|
void compile(SVMCompiler& compiler, ShaderInput *param1, ShaderInput *param2, ShaderInput *param3 = NULL, ShaderInput *param4 = NULL);
|
||||||
virtual ClosureType get_closure_type() { return closure; }
|
virtual ClosureType get_closure_type() { return closure; }
|
||||||
|
virtual bool has_bump();
|
||||||
|
|
||||||
float3 color;
|
float3 color;
|
||||||
float3 normal;
|
float3 normal;
|
||||||
|
@@ -721,6 +721,7 @@ void OSLCompiler::add(ShaderNode *node, const char *name, bool isfilepath)
|
|||||||
current_shader->has_surface_bssrdf = true;
|
current_shader->has_surface_bssrdf = true;
|
||||||
current_shader->has_bssrdf_bump = true; /* can't detect yet */
|
current_shader->has_bssrdf_bump = true; /* can't detect yet */
|
||||||
}
|
}
|
||||||
|
current_shader->has_bump = true; /* can't detect yet */
|
||||||
}
|
}
|
||||||
|
|
||||||
if(node->has_spatial_varying()) {
|
if(node->has_spatial_varying()) {
|
||||||
@@ -1029,6 +1030,9 @@ void OSLCompiler::generate_nodes(const ShaderNodeSet& nodes)
|
|||||||
if(node->has_bssrdf_bump())
|
if(node->has_bssrdf_bump())
|
||||||
current_shader->has_bssrdf_bump = true;
|
current_shader->has_bssrdf_bump = true;
|
||||||
}
|
}
|
||||||
|
if(node->has_bump()) {
|
||||||
|
current_shader->has_bump = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if(current_type == SHADER_TYPE_VOLUME) {
|
else if(current_type == SHADER_TYPE_VOLUME) {
|
||||||
if(node->has_spatial_varying())
|
if(node->has_spatial_varying())
|
||||||
|
@@ -521,6 +521,9 @@ void SVMCompiler::generate_closure_node(ShaderNode *node,
|
|||||||
if(node->has_bssrdf_bump())
|
if(node->has_bssrdf_bump())
|
||||||
current_shader->has_bssrdf_bump = true;
|
current_shader->has_bssrdf_bump = true;
|
||||||
}
|
}
|
||||||
|
if(node->has_bump()) {
|
||||||
|
current_shader->has_bump = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user