From 8fdd3aad9bd8bd463b9b792f0d9063c2330aadfa Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Tue, 17 May 2022 16:27:37 +0200 Subject: Fix T98163: Cycles OSL rendering normal maps differently Match SVM and ensure valid reflection when setting up BSDFs. --- intern/cycles/kernel/osl/bsdf_diffuse_ramp.cpp | 3 +++ intern/cycles/kernel/osl/bsdf_phong_ramp.cpp | 3 +++ intern/cycles/kernel/osl/bssrdf.cpp | 2 ++ intern/cycles/kernel/osl/closures.cpp | 23 +++++++++++++++++++++++ intern/cycles/kernel/osl/closures.h | 1 + 5 files changed, 32 insertions(+) (limited to 'intern/cycles/kernel') diff --git a/intern/cycles/kernel/osl/bsdf_diffuse_ramp.cpp b/intern/cycles/kernel/osl/bsdf_diffuse_ramp.cpp index dbbce655ef7..39fcee1ac0d 100644 --- a/intern/cycles/kernel/osl/bsdf_diffuse_ramp.cpp +++ b/intern/cycles/kernel/osl/bsdf_diffuse_ramp.cpp @@ -17,6 +17,7 @@ #include "kernel/types.h" #include "kernel/closure/alloc.h" #include "kernel/closure/bsdf_diffuse_ramp.h" +#include "kernel/closure/bsdf_util.h" // clang-format on CCL_NAMESPACE_BEGIN @@ -30,6 +31,8 @@ class DiffuseRampClosure : public CBSDFClosure { void setup(ShaderData *sd, uint32_t /* path_flag */, float3 weight) { + params.N = ensure_valid_reflection(sd->Ng, sd->I, params.N); + DiffuseRampBsdf *bsdf = (DiffuseRampBsdf *)bsdf_alloc_osl( sd, sizeof(DiffuseRampBsdf), weight, ¶ms); diff --git a/intern/cycles/kernel/osl/bsdf_phong_ramp.cpp b/intern/cycles/kernel/osl/bsdf_phong_ramp.cpp index fd602c8847e..972ed7e4a6d 100644 --- a/intern/cycles/kernel/osl/bsdf_phong_ramp.cpp +++ b/intern/cycles/kernel/osl/bsdf_phong_ramp.cpp @@ -17,6 +17,7 @@ #include "kernel/types.h" #include "kernel/closure/alloc.h" #include "kernel/closure/bsdf_phong_ramp.h" +#include "kernel/closure/bsdf_util.h" // clang-format on CCL_NAMESPACE_BEGIN @@ -30,6 +31,8 @@ class PhongRampClosure : public CBSDFClosure { void setup(ShaderData *sd, uint32_t /* path_flag */, float3 weight) { + params.N = ensure_valid_reflection(sd->Ng, sd->I, params.N); + PhongRampBsdf *bsdf = (PhongRampBsdf *)bsdf_alloc_osl( sd, sizeof(PhongRampBsdf), weight, ¶ms); diff --git a/intern/cycles/kernel/osl/bssrdf.cpp b/intern/cycles/kernel/osl/bssrdf.cpp index 29d2d93ce34..4b282fddad3 100644 --- a/intern/cycles/kernel/osl/bssrdf.cpp +++ b/intern/cycles/kernel/osl/bssrdf.cpp @@ -44,6 +44,8 @@ class CBSSRDFClosure : public CClosurePrimitive { void setup(ShaderData *sd, uint32_t path_flag, float3 weight) { + params.N = ensure_valid_reflection(sd->Ng, sd->I, params.N); + if (method == u_burley) { alloc(sd, path_flag, weight, CLOSURE_BSSRDF_BURLEY_ID); } diff --git a/intern/cycles/kernel/osl/closures.cpp b/intern/cycles/kernel/osl/closures.cpp index 06b91ab9bb7..7c6b48154e4 100644 --- a/intern/cycles/kernel/osl/closures.cpp +++ b/intern/cycles/kernel/osl/closures.cpp @@ -180,6 +180,8 @@ class PrincipledSheenClosure : public CBSDFClosure { void setup(ShaderData *sd, uint32_t path_flag, float3 weight) { if (!skip(sd, path_flag, LABEL_DIFFUSE)) { + params.N = ensure_valid_reflection(sd->Ng, sd->I, params.N); + PrincipledSheenBsdf *bsdf = (PrincipledSheenBsdf *)bsdf_alloc_osl( sd, sizeof(PrincipledSheenBsdf), weight, ¶ms); sd->flag |= (bsdf) ? bsdf_principled_sheen_setup(sd, bsdf) : 0; @@ -223,6 +225,8 @@ class PrincipledHairClosure : public CBSDFClosure { void setup(ShaderData *sd, uint32_t path_flag, float3 weight) { if (!skip(sd, path_flag, LABEL_GLOSSY)) { + params.N = ensure_valid_reflection(sd->Ng, sd->I, params.N); + PrincipledHairBSDF *bsdf = (PrincipledHairBSDF *)alloc(sd, path_flag, weight); if (!bsdf) { return; @@ -282,6 +286,7 @@ class PrincipledClearcoatClosure : public CBSDFClosure { void setup(ShaderData *sd, uint32_t path_flag, float3 weight) { + params.N = ensure_valid_reflection(sd->Ng, sd->I, params.N); MicrofacetBsdf *bsdf = alloc(sd, path_flag, weight); if (!bsdf) { return; @@ -503,6 +508,8 @@ class MicrofacetClosure : public CBSDFClosure { return; } + params.N = ensure_valid_reflection(sd->Ng, sd->I, params.N); + MicrofacetBsdf *bsdf = (MicrofacetBsdf *)bsdf_alloc_osl( sd, sizeof(MicrofacetBsdf), weight, ¶ms); @@ -601,6 +608,8 @@ class MicrofacetGGXFresnelClosure : public MicrofacetFresnelClosure { public: void setup(ShaderData *sd, uint32_t path_flag, float3 weight) { + params.N = ensure_valid_reflection(sd->Ng, sd->I, params.N); + MicrofacetBsdf *bsdf = alloc(sd, path_flag, weight); if (!bsdf) { return; @@ -630,6 +639,8 @@ class MicrofacetGGXAnisoFresnelClosure : public MicrofacetFresnelClosure { public: void setup(ShaderData *sd, uint32_t path_flag, float3 weight) { + params.N = ensure_valid_reflection(sd->Ng, sd->I, params.N); + MicrofacetBsdf *bsdf = alloc(sd, path_flag, weight); if (!bsdf) { return; @@ -695,6 +706,8 @@ class MicrofacetMultiGGXClosure : public MicrofacetMultiClosure { public: void setup(ShaderData *sd, uint32_t path_flag, float3 weight) { + params.N = ensure_valid_reflection(sd->Ng, sd->I, params.N); + MicrofacetBsdf *bsdf = alloc(sd, path_flag, weight); if (!bsdf) { return; @@ -723,6 +736,8 @@ class MicrofacetMultiGGXAnisoClosure : public MicrofacetMultiClosure { public: void setup(ShaderData *sd, uint32_t path_flag, float3 weight) { + params.N = ensure_valid_reflection(sd->Ng, sd->I, params.N); + MicrofacetBsdf *bsdf = alloc(sd, path_flag, weight); if (!bsdf) { return; @@ -755,6 +770,8 @@ class MicrofacetMultiGGXGlassClosure : public MicrofacetMultiClosure { void setup(ShaderData *sd, uint32_t path_flag, float3 weight) { + params.N = ensure_valid_reflection(sd->Ng, sd->I, params.N); + MicrofacetBsdf *bsdf = alloc(sd, path_flag, weight); if (!bsdf) { return; @@ -819,6 +836,8 @@ class MicrofacetMultiGGXFresnelClosure : public MicrofacetMultiFresnelClosure { public: void setup(ShaderData *sd, uint32_t path_flag, float3 weight) { + params.N = ensure_valid_reflection(sd->Ng, sd->I, params.N); + MicrofacetBsdf *bsdf = alloc(sd, path_flag, weight); if (!bsdf) { return; @@ -849,6 +868,8 @@ class MicrofacetMultiGGXAnisoFresnelClosure : public MicrofacetMultiFresnelClosu public: void setup(ShaderData *sd, uint32_t path_flag, float3 weight) { + params.N = ensure_valid_reflection(sd->Ng, sd->I, params.N); + MicrofacetBsdf *bsdf = alloc(sd, path_flag, weight); if (!bsdf) { return; @@ -883,6 +904,8 @@ class MicrofacetMultiGGXGlassFresnelClosure : public MicrofacetMultiFresnelClosu void setup(ShaderData *sd, uint32_t path_flag, float3 weight) { + params.N = ensure_valid_reflection(sd->Ng, sd->I, params.N); + MicrofacetBsdf *bsdf = alloc(sd, path_flag, weight); if (!bsdf) { return; diff --git a/intern/cycles/kernel/osl/closures.h b/intern/cycles/kernel/osl/closures.h index 6225644a8e6..e10a3d88a04 100644 --- a/intern/cycles/kernel/osl/closures.h +++ b/intern/cycles/kernel/osl/closures.h @@ -114,6 +114,7 @@ class CBSDFClosure : public CClosurePrimitive { void setup(ShaderData *sd, uint32_t path_flag, float3 weight) \ { \ if (!skip(sd, path_flag, TYPE)) { \ + params.N = ensure_valid_reflection(sd->Ng, sd->I, params.N); \ structname *bsdf = (structname *)bsdf_alloc_osl(sd, sizeof(structname), weight, ¶ms); \ sd->flag |= (bsdf) ? bsdf_##lower##_setup(bsdf) : 0; \ } \ -- cgit v1.2.3