Cycles: add roughness baking support, using squared roughness convention.
This commit is contained in:
parent
7613ffc944
commit
23ccf5767f
|
@ -571,6 +571,7 @@ class CyclesRenderSettings(bpy.types.PropertyGroup):
|
|||
('SHADOW', "Shadow", ""),
|
||||
('NORMAL', "Normal", ""),
|
||||
('UV', "UV", ""),
|
||||
('ROUGHNESS', "Roughness", ""),
|
||||
('EMIT', "Emit", ""),
|
||||
('ENVIRONMENT', "Environment", ""),
|
||||
('DIFFUSE', "Diffuse", ""),
|
||||
|
|
|
@ -252,6 +252,8 @@ static ShaderEvalType get_shader_type(const string& pass_type)
|
|||
return SHADER_EVAL_NORMAL;
|
||||
else if(strcmp(shader_type, "UV")==0)
|
||||
return SHADER_EVAL_UV;
|
||||
else if(strcmp(shader_type, "ROUGHNESS")==0)
|
||||
return SHADER_EVAL_ROUGHNESS;
|
||||
else if(strcmp(shader_type, "DIFFUSE_COLOR")==0)
|
||||
return SHADER_EVAL_DIFFUSE_COLOR;
|
||||
else if(strcmp(shader_type, "GLOSSY_COLOR")==0)
|
||||
|
|
|
@ -330,15 +330,30 @@ ccl_device void kernel_bake_evaluate(KernelGlobals *kg, ccl_global uint4 *input,
|
|||
switch(type) {
|
||||
/* data passes */
|
||||
case SHADER_EVAL_NORMAL:
|
||||
case SHADER_EVAL_ROUGHNESS:
|
||||
case SHADER_EVAL_EMISSION:
|
||||
{
|
||||
float3 N = sd.N;
|
||||
if((sd.flag & SD_HAS_BUMP)) {
|
||||
shader_eval_surface(kg, &sd, &state, 0);
|
||||
N = shader_bsdf_average_normal(kg, &sd);
|
||||
if(type != SHADER_EVAL_NORMAL || (sd.flag & SD_HAS_BUMP)) {
|
||||
int path_flag = (type == SHADER_EVAL_EMISSION) ? PATH_RAY_EMISSION : 0;
|
||||
shader_eval_surface(kg, &sd, &state, path_flag);
|
||||
}
|
||||
|
||||
/* encoding: normal = (2 * color) - 1 */
|
||||
out = N * 0.5f + make_float3(0.5f, 0.5f, 0.5f);
|
||||
if(type == SHADER_EVAL_NORMAL) {
|
||||
float3 N = sd.N;
|
||||
if(sd.flag & SD_HAS_BUMP) {
|
||||
N = shader_bsdf_average_normal(kg, &sd);
|
||||
}
|
||||
|
||||
/* encoding: normal = (2 * color) - 1 */
|
||||
out = N * 0.5f + make_float3(0.5f, 0.5f, 0.5f);
|
||||
}
|
||||
else if(type == SHADER_EVAL_ROUGHNESS) {
|
||||
float roughness = shader_bsdf_average_roughness(&sd);
|
||||
out = make_float3(roughness, roughness, roughness);
|
||||
}
|
||||
else {
|
||||
out = shader_emissive_eval(kg, &sd);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case SHADER_EVAL_UV:
|
||||
|
@ -346,13 +361,6 @@ ccl_device void kernel_bake_evaluate(KernelGlobals *kg, ccl_global uint4 *input,
|
|||
out = primitive_uv(kg, &sd);
|
||||
break;
|
||||
}
|
||||
case SHADER_EVAL_EMISSION:
|
||||
{
|
||||
shader_eval_surface(kg, &sd, &state, PATH_RAY_EMISSION);
|
||||
out = shader_emissive_eval(kg, &sd);
|
||||
break;
|
||||
}
|
||||
|
||||
#ifdef __PASSES__
|
||||
/* light passes */
|
||||
case SHADER_EVAL_AO:
|
||||
|
|
|
@ -763,6 +763,26 @@ ccl_device int shader_bsdf_sample_closure(KernelGlobals *kg, ShaderData *sd,
|
|||
return label;
|
||||
}
|
||||
|
||||
ccl_device float shader_bsdf_average_roughness(ShaderData *sd)
|
||||
{
|
||||
float roughness = 0.0f;
|
||||
float sum_weight = 0.0f;
|
||||
|
||||
for(int i = 0; i < sd->num_closure; i++) {
|
||||
ShaderClosure *sc = &sd->closure[i];
|
||||
|
||||
if(CLOSURE_IS_BSDF(sc->type)) {
|
||||
/* sqrt once to undo the squaring from multiplying roughness on the
|
||||
* two axes, and once for the squared roughness convention. */
|
||||
float weight = fabsf(average(sc->weight));
|
||||
roughness += weight * sqrtf(safe_sqrtf(bsdf_get_roughness_squared(sc)));
|
||||
sum_weight += weight;
|
||||
}
|
||||
}
|
||||
|
||||
return (sum_weight > 0.0f) ? roughness / sum_weight : 0.0f;
|
||||
}
|
||||
|
||||
ccl_device void shader_bsdf_blur(KernelGlobals *kg, ShaderData *sd, float roughness)
|
||||
{
|
||||
for(int i = 0; i < sd->num_closure; i++) {
|
||||
|
@ -875,7 +895,7 @@ ccl_device float3 shader_bsdf_average_normal(KernelGlobals *kg, ShaderData *sd)
|
|||
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);
|
||||
N += sc->N*fabsf(average(sc->weight));
|
||||
}
|
||||
|
||||
return (is_zero(N))? sd->N : normalize(N);
|
||||
|
@ -892,11 +912,11 @@ ccl_device float3 shader_bsdf_ao(KernelGlobals *kg, ShaderData *sd, float ao_fac
|
|||
if(CLOSURE_IS_BSDF_DIFFUSE(sc->type)) {
|
||||
const DiffuseBsdf *bsdf = (const DiffuseBsdf*)sc;
|
||||
eval += sc->weight*ao_factor;
|
||||
N += bsdf->N*average(sc->weight);
|
||||
N += bsdf->N*fabsf(average(sc->weight));
|
||||
}
|
||||
else if(CLOSURE_IS_AMBIENT_OCCLUSION(sc->type)) {
|
||||
eval += sc->weight;
|
||||
N += sd->N*average(sc->weight);
|
||||
N += sd->N*fabsf(average(sc->weight));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -263,6 +263,7 @@ typedef enum ShaderEvalType {
|
|||
/* data passes */
|
||||
SHADER_EVAL_NORMAL,
|
||||
SHADER_EVAL_UV,
|
||||
SHADER_EVAL_ROUGHNESS,
|
||||
SHADER_EVAL_DIFFUSE_COLOR,
|
||||
SHADER_EVAL_GLOSSY_COLOR,
|
||||
SHADER_EVAL_TRANSMISSION_COLOR,
|
||||
|
|
|
@ -247,7 +247,7 @@ void BakeManager::device_free(Device * /*device*/, DeviceScene * /*dscene*/)
|
|||
|
||||
int BakeManager::aa_samples(Scene *scene, BakeData *bake_data, ShaderEvalType type)
|
||||
{
|
||||
if(type == SHADER_EVAL_UV) {
|
||||
if(type == SHADER_EVAL_UV || type == SHADER_EVAL_ROUGHNESS) {
|
||||
return 1;
|
||||
}
|
||||
else if(type == SHADER_EVAL_NORMAL) {
|
||||
|
|
|
@ -251,6 +251,7 @@ typedef enum eScenePassType {
|
|||
SCE_PASS_SUBSURFACE_DIRECT = (1 << 28),
|
||||
SCE_PASS_SUBSURFACE_INDIRECT = (1 << 29),
|
||||
SCE_PASS_SUBSURFACE_COLOR = (1 << 30),
|
||||
SCE_PASS_ROUGHNESS = (1 << 31),
|
||||
} eScenePassType;
|
||||
|
||||
#define RE_PASSNAME_COMBINED "Combined"
|
||||
|
|
|
@ -89,6 +89,7 @@ const EnumPropertyItem rna_enum_bake_pass_type_items[] = {
|
|||
{SCE_PASS_SHADOW, "SHADOW", 0, "Shadow", ""},
|
||||
{SCE_PASS_NORMAL, "NORMAL", 0, "Normal", ""},
|
||||
{SCE_PASS_UV, "UV", 0, "UV", ""},
|
||||
{SCE_PASS_ROUGHNESS, "ROUGHNESS", 0, "ROUGHNESS", ""},
|
||||
{SCE_PASS_EMIT, "EMIT", 0, "Emit", ""},
|
||||
{SCE_PASS_ENVIRONMENT, "ENVIRONMENT", 0, "Environment", ""},
|
||||
{SCE_PASS_DIFFUSE_COLOR, "DIFFUSE", 0, "Diffuse", ""},
|
||||
|
|
Loading…
Reference in New Issue