From be59c8f0c2cc9d50183ad3a44bb083fc5649ec1a Mon Sep 17 00:00:00 2001 From: hhhhkrx Date: Wed, 6 Nov 2024 15:13:21 +0800 Subject: [PATCH 01/37] feat: support iridescence in ShaderLab PBR --- packages/shaderlab/src/shaders/PBR.gs | 9 ++ .../src/shaders/shadingPBR/BRDF.glsl | 110 ++++++++++++++++++ .../src/shaders/shadingPBR/FragmentPBR.glsl | 31 +++++ .../shaders/shadingPBR/LightDirectPBR.glsl | 7 +- .../shaders/shadingPBR/LightIndirectPBR.glsl | 19 ++- .../shaders/shadingPBR/ReflectionLobe.glsl | 8 ++ 6 files changed, 182 insertions(+), 2 deletions(-) diff --git a/packages/shaderlab/src/shaders/PBR.gs b/packages/shaderlab/src/shaders/PBR.gs index f53f7e5c..500ffe0d 100644 --- a/packages/shaderlab/src/shaders/PBR.gs +++ b/packages/shaderlab/src/shaders/PBR.gs @@ -41,6 +41,12 @@ Shader "PBR.gs" { material_ClearCoatNormalTexture("ClearCoatNormalTexture", Texture2D); } + Header("Thin Film Iridescence"){ + material_IridescenceInfo("Iridescence", Vector4) = (0, 0, 0, 0); + material_IridescenceThicknessTexture("IridescenceThicknessTexture", Texture2D); + material_IridescenceTexture("IridescenceTexture", Texture2D); + } + Header("Common") { material_AlphaCutoff( "AlphaCutoff", Range(0, 1, 0.01) ) = 0; material_TilingOffset("TilingOffset", Vector4) = (1, 1, 0, 0); @@ -60,6 +66,9 @@ Shader "PBR.gs" { MATERIAL_HAS_CLEAR_COAT_TEXTURE("HAS_CLEAR_COAT_TEXTURE"); MATERIAL_HAS_CLEAR_COAT_ROUGHNESS_TEXTURE("HAS_CLEAR_COAT_ROUGHNESS_TEXTURE"); MATERIAL_HAS_CLEAR_COAT_NORMAL_TEXTURE("HAS_CLEAR_COAT_NORMAL_TEXTURE"); + MATERIAL_ENABLE_IRIDESCENCE("ENABLE_IRIDESCENCE"); + MATERIAL_HAS_IRIDESCENCE_THICKNESS_TEXTURE("HAS_IRIDESCENCE_THICKNESS_TEXTURE"); + MATERIAL_HAS_IRIDESCENCE_TEXTURE("HAS_IRIDESCENCE_TEXTURE"); MATERIAL_IS_TRANSPARENT("IS_TRANSPARENT"); MATERIAL_IS_ALPHA_CUTOFF("IS_ALPHA_CUTOFF"); } diff --git a/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl b/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl index dbfb122c..bf89b260 100644 --- a/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl +++ b/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl @@ -49,6 +49,12 @@ struct SurfaceData{ vec3 clearCoatNormal; float clearCoatDotNV; #endif + + #ifdef MATERIAL_ENABLE_IRIDESCENCE + float iridesceceIor; + float iridesceceFactor; + float iridescenceThickness; + #endif }; @@ -61,6 +67,10 @@ struct BRDFData{ vec3 clearCoatSpecularColor; float clearCoatRoughness; #endif + + #ifdef MATERIAL_ENABLE_IRIDESCENCE + vec3 iridescenceSpecularColor; + #endif }; @@ -202,6 +212,100 @@ vec3 BRDF_Diffuse_Lambert(vec3 diffuseColor) { return RECIPROCAL_PI * diffuseColor; } +#ifdef MATERIAL_ENABLE_IRIDESCENCE + float sqr(float x) { + return x * x; + } + + // Conversion f0/ior + vec3 iorToFresnel(vec3 transmittedIor, float incidentIor) { + return pow((transmittedIor - incidentIor) / (transmittedIor + incidentIor),vec3(2.0)); + } + + float iorToFresnel(float transmittedIor, float incidentIor) { + return pow((transmittedIor - incidentIor) / (transmittedIor + incidentIor),2.0); + } + + // Assume air interface for top + // Note: We don't handle the case fresnel0 == 1 + vec3 fresnelToIor(vec3 F0){ + vec3 sqrtF0 = sqrt(F0); + return (vec3(1.0) + sqrtF0) / (vec3(1.0) - sqrtF0); + } + + // Fresnel equations for dielectric/dielectric interfaces. + // Ref: https://belcour.github.io/blog/research/publication/2017/05/01/brdf-thin-film.html + // Evaluation XYZ sensitivity curves in Fourier space + vec3 evalSensitivity(float opd, vec3 shift){ + // Use Gaussian fits, given by 3 parameters: val, pos and var + float phase = 2.0 * PI * opd * 1.0e-9; + const vec3 val = vec3(5.4856e-13, 4.4201e-13, 5.2481e-13); + const vec3 pos = vec3(1.6810e+06, 1.7953e+06, 2.2084e+06); + const vec3 var = vec3(4.3278e+09, 9.3046e+09, 6.6121e+09); + vec3 xyz = val * sqrt(2.0 * PI * var) * cos(pos * phase + shift) * exp(-var * sqr(phase)); + xyz.x += 9.7470e-14 * sqrt(2.0 * PI * 4.5282e+09) * cos(2.2399e+06 * phase + shift[0]) * exp(-4.5282e+09 * sqr(phase)); + xyz /= 1.0685e-7; + // XYZ to RGB color space + const mat3 XYZ_TO_RGB = mat3( 3.2404542, -0.9692660, 0.0556434, + -1.5371385, 1.8760108, -0.2040259, + -0.4985314, 0.0415560, 1.0572252); + vec3 rgb = XYZ_TO_RGB * xyz; + return rgb; + } + + vec3 EvalIridescence(float outsideIOR, float cosTheta1, float eta2, vec3 baseF0,float iridescenceThickness){ + vec3 iridescence = vec3(1.0); + // Force iridescenceIOR -> outsideIOR when thinFilmThickness -> 0.0 + float iridescenceIOR = mix( outsideIOR, eta2, smoothstep( 0.0, 0.03, iridescenceThickness ) ); + // Evaluate the cosTheta on the base layer (Snell law) + float sinTheta2Sq = pow( outsideIOR / iridescenceIOR, 2.0) * (1.0 - pow( cosTheta1, 2.0)); + float cosTheta2Sq = 1.0 - sinTheta2Sq; + // Handle total internal reflection + if (cosTheta2Sq < 0.0) { + return iridescence; + } + float cosTheta2 = sqrt(cosTheta2Sq); + + // First interface + float R0 = iorToFresnel(iridescenceIOR, outsideIOR); + float R12 = F_Schlick(R0, cosTheta1); + float R21 = R12; + float T121 = 1.0 - R12; + float phi12 = 0.0; + if (iridescenceIOR < outsideIOR) {phi12 = PI;} + float phi21 = PI - phi12; + + // Second interface + vec3 baseIor = fresnelToIor(clamp(baseF0, 0.0, 0.9999)); // guard against 1.0 + vec3 R1 =iorToFresnel(baseIor, iridescenceIOR); + vec3 R23 = F_Schlick(R1, cosTheta2); + vec3 phi23 =vec3(0.0); + if (baseIor[0] < iridescenceIOR) {phi23[0] = PI;} + if (baseIor[1] < iridescenceIOR) {phi23[1] = PI;} + if (baseIor[2] < iridescenceIOR) {phi23[2] = PI;} + + // Phase shift + float OPD = 2.0 * iridescenceIOR * iridescenceThickness * cosTheta2; + vec3 phi = vec3(phi21) + phi23; + + // Compound terms + vec3 R123 = clamp(R12 * R23, 1e-5, 0.9999); + vec3 r123 = sqrt(R123); + vec3 Rs = sqr(T121) * R23 / (vec3(1.0) - R123); + // Reflectance term for m = 0 (DC term amplitude) + vec3 C0 = R12 + Rs; + iridescence = C0; + // Reflectance term for m > 0 (pairs of diracs) + vec3 Cm = Rs - T121; + for (int m = 1; m <= 2; ++m) { + Cm *= r123; + vec3 Sm = 2.0 * evalSensitivity(float(m) * OPD, float(m) * phi); + iridescence += Cm * Sm; + } + iridescence = max(iridescence, vec3(0.0)); + return iridescence; + } +#endif void initBRDFData(SurfaceData surfaceData, out BRDFData brdfData){ vec3 albedoColor = surfaceData.albedoColor; @@ -225,6 +329,12 @@ void initBRDFData(SurfaceData surfaceData, out BRDFData brdfData){ brdfData.clearCoatRoughness = max(MIN_PERCEPTUAL_ROUGHNESS, min(surfaceData.clearCoatRoughness + getAARoughnessFactor(surfaceData.clearCoatNormal), 1.0)); brdfData.clearCoatSpecularColor = vec3(0.04); #endif + + #ifdef MATERIAL_ENABLE_IRIDESCENCE + float topIor = 1.0; + float NdotV = saturate(dot(surfaceData.normal, surfaceData.viewDir ) ); + brdfData.iridescenceSpecularColor = EvalIridescence(topIor, NdotV, surfaceData.iridesceceIor, brdfData.specularColor, surfaceData.iridescenceThickness); + #endif } #endif \ No newline at end of file diff --git a/packages/shaderlab/src/shaders/shadingPBR/FragmentPBR.glsl b/packages/shaderlab/src/shaders/shadingPBR/FragmentPBR.glsl index 86286f81..3f630fc0 100644 --- a/packages/shaderlab/src/shaders/shadingPBR/FragmentPBR.glsl +++ b/packages/shaderlab/src/shaders/shadingPBR/FragmentPBR.glsl @@ -39,6 +39,17 @@ float material_OcclusionTextureCoord; #endif #endif +#ifdef MATERIAL_ENABLE_IRIDESCENCE + vec4 material_IridescenceInfo; + #ifdef MATERIAL_HAS_IRIDESCENCE_THICKNESS_TEXTURE + sampler2D material_IridescenceThicknessTexture; + #endif + + #ifdef MATERIAL_HAS_IRIDESCENCE_TEXTURE + sampler2D material_IridescenceTexture; + #endif +#endif + // Texture #ifdef MATERIAL_HAS_BASETEXTURE sampler2D material_BaseTexture; @@ -235,6 +246,26 @@ SurfaceData getSurfaceData(Varyings v, vec2 aoUV, bool isFrontFacing){ surfaceData.anisotropicN = getAnisotropicBentNormal(surfaceData); #endif + //Iridescence + #ifdef MATERIAL_ENABLE_IRIDESCENCE + surfaceData.iridesceceFactor = material_IridescenceInfo.x; + surfaceData.iridesceceIor = material_IridescenceInfo.y; + + float iridesceceThicknessMin = material_IridescenceInfo.z; + float iridesceceThicknessMax = material_IridescenceInfo.w; + #ifdef MATERIAL_HAS_IRIDESCENCE_THICKNESS_TEXTURE + vec3 iridescenceThicknessInfo = (texture2D( material_IridescenceThicknessTexture, uv)).rgb; + surfaceData.iridescenceThickness = mix(iridesceceThicknessMin, iridesceceThicknessMax, iridescenceThicknessInfo.g); + #else + surfaceData.iridescenceThickness = iridesceceThicknessMax; + #endif + + #ifdef MATERIAL_HAS_IRIDESCENCE_TEXTURE + vec3 iridecenceIntensity = (texture2D( material_IridescenceTexture, uv)).rgb; + surfaceData.iridesceceFactor *= iridecenceIntensity.x; + #endif + #endif + // AO float diffuseAO = 1.0; float specularAO = 1.0; diff --git a/packages/shaderlab/src/shaders/shadingPBR/LightDirectPBR.glsl b/packages/shaderlab/src/shaders/shadingPBR/LightDirectPBR.glsl index 053b3b51..4fa3d201 100644 --- a/packages/shaderlab/src/shaders/shadingPBR/LightDirectPBR.glsl +++ b/packages/shaderlab/src/shaders/shadingPBR/LightDirectPBR.glsl @@ -14,6 +14,9 @@ #ifndef FUNCTION_CLEAR_COAT_LOBE #define FUNCTION_CLEAR_COAT_LOBE clearCoatLobe #endif +#ifndef FUNCTION_IRIDESCENCE_LOBE + #define FUNCTION_IRIDESCENCE_LOBE iridescenceLobe +#endif #include "BRDF.glsl" #include "Light.glsl" @@ -34,7 +37,9 @@ void surfaceShading(Varyings varyings, SurfaceData surfaceData, BRDFData brdfDat FUNCTION_DIFFUSE_LOBE(varyings, surfaceData, brdfData, attenuationIrradiance, diffuseColor); // Specular Lobe FUNCTION_SPECULAR_LOBE(varyings, surfaceData, brdfData, incidentDirection, attenuationIrradiance, specularColor); - + // Iridescence Lobe + FUNCTION_IRIDESCENCE_LOBE(varyings, surfaceData, brdfData, incidentDirection, attenuationIrradiance, specularColor); + color += diffuseColor + specularColor; } diff --git a/packages/shaderlab/src/shaders/shadingPBR/LightIndirectPBR.glsl b/packages/shaderlab/src/shaders/shadingPBR/LightIndirectPBR.glsl index 1cd46f1c..a9fe3e23 100644 --- a/packages/shaderlab/src/shaders/shadingPBR/LightIndirectPBR.glsl +++ b/packages/shaderlab/src/shaders/shadingPBR/LightIndirectPBR.glsl @@ -11,7 +11,9 @@ #ifndef FUNCTION_CLEAR_COAT_IBL #define FUNCTION_CLEAR_COAT_IBL evaluateClearCoatIBL #endif - +#ifndef FUNCTION_IRIDESCENCE_IBL + #define FUNCTION_IRIDESCENCE_IBL evaluateIridescenceIBL +#endif #include "BRDF.glsl" #include "Light.glsl" @@ -66,6 +68,18 @@ float evaluateClearCoatIBL(Varyings varyings, SurfaceData surfaceData, BRDFData return radianceAttenuation; } +void evaluateIridescenceIBL(Varyings varyings, SurfaceData surfaceData, BRDFData brdfData, float radianceAttenuation, inout vec3 specularColor){ + vec3 radiance = getLightProbeRadiance(surfaceData, surfaceData.normal, brdfData.roughness); + vec3 envBRDF = envBRDFApprox(brdfData.specularColor, brdfData.roughness, surfaceData.dotNV); + + #ifdef MATERIAL_ENABLE_IRIDESCENCE + envBRDF = mix(envBRDF, brdfData.iridescenceSpecularColor, surfaceData.iridesceceFactor); + #endif + + specularColor += surfaceData.specularAO * radianceAttenuation * radiance * envBRDF; + +} + void evaluateSpecularIBL(Varyings varyings, SurfaceData surfaceData, BRDFData brdfData, float radianceAttenuation, inout vec3 specularColor){ vec3 radiance = getLightProbeRadiance(surfaceData, surfaceData.normal, brdfData.roughness); specularColor += surfaceData.specularAO * radianceAttenuation * radiance * envBRDFApprox(brdfData.specularColor, brdfData.roughness, surfaceData.dotNV ); @@ -85,6 +99,9 @@ void evaluateIBL(Varyings varyings, SurfaceData surfaceData, BRDFData brdfData, // IBL specular FUNCTION_SPECULAR_IBL(varyings, surfaceData, brdfData, radianceAttenuation, specularColor); + // IBL Iridescence + FUNCTION_IRIDESCENCE_IBL(varyings, surfaceData, brdfData, radianceAttenuation, specularColor); + color += diffuseColor + specularColor; } diff --git a/packages/shaderlab/src/shaders/shadingPBR/ReflectionLobe.glsl b/packages/shaderlab/src/shaders/shadingPBR/ReflectionLobe.glsl index 31e448a4..d007a8f3 100644 --- a/packages/shaderlab/src/shaders/shadingPBR/ReflectionLobe.glsl +++ b/packages/shaderlab/src/shaders/shadingPBR/ReflectionLobe.glsl @@ -23,6 +23,14 @@ float clearCoatLobe(Varyings varyings, SurfaceData surfaceData, BRDFData brdfDat return attenuation; } +void iridescenceLobe(Varyings varyings, SurfaceData surfaceData, BRDFData brdfData, vec3 incidentDirection, vec3 attenuationIrradiance, inout vec3 specularColor){ + vec3 BRDF_Specular = BRDF_Specular_GGX( incidentDirection, surfaceData, surfaceData.normal, brdfData.specularColor, brdfData.roughness); + + #ifdef MATERIAL_ENABLE_IRIDESCENCE + BRDF_Specular = mix(BRDF_Specular, brdfData.iridescenceSpecularColor, surfaceData.iridesceceFactor); + #endif + specularColor += attenuationIrradiance * BRDF_Specular; +} #endif \ No newline at end of file From 2f0e91ab43cddc60225b1a5de9a18c197b206e54 Mon Sep 17 00:00:00 2001 From: hhhhkrx Date: Wed, 6 Nov 2024 17:23:01 +0800 Subject: [PATCH 02/37] fix: merge --- packages/shaderlab/src/index.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/packages/shaderlab/src/index.ts b/packages/shaderlab/src/index.ts index df47aed1..d144ddf4 100644 --- a/packages/shaderlab/src/index.ts +++ b/packages/shaderlab/src/index.ts @@ -21,3 +21,8 @@ export function registerShader() { shaderRegistered = true; } + +/** + * @internal + */ +export { fragmentList }; From e15d3e83131e71d38593ae29518907c8b1a7ca61 Mon Sep 17 00:00:00 2001 From: hhhhkrx Date: Mon, 11 Nov 2024 11:24:40 +0800 Subject: [PATCH 03/37] fix: iridescnence shader --- packages/shaderlab/src/shaders/PBR.gs | 2 +- .../src/shaders/shadingPBR/BRDF.glsl | 28 +++++++++++++++++-- .../src/shaders/shadingPBR/FragmentPBR.glsl | 23 +++++++++++---- .../shaders/shadingPBR/LightDirectPBR.glsl | 5 ---- .../shaders/shadingPBR/LightIndirectPBR.glsl | 22 ++++----------- .../shaders/shadingPBR/ReflectionLobe.glsl | 18 +++++------- 6 files changed, 55 insertions(+), 43 deletions(-) diff --git a/packages/shaderlab/src/shaders/PBR.gs b/packages/shaderlab/src/shaders/PBR.gs index 500ffe0d..07c26683 100644 --- a/packages/shaderlab/src/shaders/PBR.gs +++ b/packages/shaderlab/src/shaders/PBR.gs @@ -42,7 +42,7 @@ Shader "PBR.gs" { } Header("Thin Film Iridescence"){ - material_IridescenceInfo("Iridescence", Vector4) = (0, 0, 0, 0); + material_IridescenceInfo("Iridescence", Vector4) = (0, 1.3, 100, 400); material_IridescenceThicknessTexture("IridescenceThicknessTexture", Texture2D); material_IridescenceTexture("IridescenceTexture", Texture2D); } diff --git a/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl b/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl index bf89b260..0b4aa425 100644 --- a/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl +++ b/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl @@ -55,6 +55,14 @@ struct SurfaceData{ float iridesceceFactor; float iridescenceThickness; #endif + + //sheen + #ifdef MATERIAL_ENABLE_SHEEN + float sheenIntensity; + vec3 sheenColor; + float sheenRoughness; + #endif + }; @@ -253,7 +261,7 @@ vec3 BRDF_Diffuse_Lambert(vec3 diffuseColor) { return rgb; } - vec3 EvalIridescence(float outsideIOR, float cosTheta1, float eta2, vec3 baseF0,float iridescenceThickness){ + vec3 evalIridescence(float outsideIOR, float cosTheta1, float eta2, vec3 baseF0,float iridescenceThickness){ vec3 iridescence = vec3(1.0); // Force iridescenceIOR -> outsideIOR when thinFilmThickness -> 0.0 float iridescenceIOR = mix( outsideIOR, eta2, smoothstep( 0.0, 0.03, iridescenceThickness ) ); @@ -307,6 +315,21 @@ vec3 BRDF_Diffuse_Lambert(vec3 diffuseColor) { } #endif +#ifdef MATERIAL_ENABLE_SHEEN + //http://www.aconty.com/pdf/s2017_pbs_imageworks_sheen.pdf + float D_Charlie(float roughness, float dotNH) { + float invAlpha = 1.0 / roughness; + float cos2h = dotNH * dotNH; + float sin2h = max(1.0 - cos2h, 0.0078125); // 2^(-14/2), so sin2h^2 > 0 in fp16 + return (2.0 + invAlpha) * pow(sin2h, invAlpha * 0.5) / (2.0 * PI); + } + + //https://blog.selfshadow.com/publications/s2013-shading-course/#course_content + float V_Neubelt(float dotNV, float dotNL) { + return 1.0 / (4.0 * (dotNL + dotNV - dotNL * dotNV)); + } +#endif + void initBRDFData(SurfaceData surfaceData, out BRDFData brdfData){ vec3 albedoColor = surfaceData.albedoColor; vec3 specularColor = surfaceData.specularColor; @@ -332,8 +355,7 @@ void initBRDFData(SurfaceData surfaceData, out BRDFData brdfData){ #ifdef MATERIAL_ENABLE_IRIDESCENCE float topIor = 1.0; - float NdotV = saturate(dot(surfaceData.normal, surfaceData.viewDir ) ); - brdfData.iridescenceSpecularColor = EvalIridescence(topIor, NdotV, surfaceData.iridesceceIor, brdfData.specularColor, surfaceData.iridescenceThickness); + brdfData.iridescenceSpecularColor = evalIridescence(topIor, surfaceData.dotNV, surfaceData.iridesceceIor, brdfData.specularColor, surfaceData.iridescenceThickness); #endif } diff --git a/packages/shaderlab/src/shaders/shadingPBR/FragmentPBR.glsl b/packages/shaderlab/src/shaders/shadingPBR/FragmentPBR.glsl index 3f630fc0..d5420f55 100644 --- a/packages/shaderlab/src/shaders/shadingPBR/FragmentPBR.glsl +++ b/packages/shaderlab/src/shaders/shadingPBR/FragmentPBR.glsl @@ -50,6 +50,17 @@ float material_OcclusionTextureCoord; #endif #endif +#ifdef MATERIAL_ENABLE_SHEEN + vec3 material_SheenColor; + float material_SheenRoughness; + #ifdef MATERIAL_HAS_SHEENCOLOR_TEXTURE + sampler2D material_SheenColorTexture; + #endif + #ifdef MATERIAL_HAS_SHEENROUGHNESS_TEXTURE + sampler2D material_SheenRoughnessTexture; + #endif +#endif + // Texture #ifdef MATERIAL_HAS_BASETEXTURE sampler2D material_BaseTexture; @@ -254,15 +265,15 @@ SurfaceData getSurfaceData(Varyings v, vec2 aoUV, bool isFrontFacing){ float iridesceceThicknessMin = material_IridescenceInfo.z; float iridesceceThicknessMax = material_IridescenceInfo.w; #ifdef MATERIAL_HAS_IRIDESCENCE_THICKNESS_TEXTURE - vec3 iridescenceThicknessInfo = (texture2D( material_IridescenceThicknessTexture, uv)).rgb; - surfaceData.iridescenceThickness = mix(iridesceceThicknessMin, iridesceceThicknessMax, iridescenceThicknessInfo.g); + float iridescenceThicknessWeight = texture2D( material_IridescenceThicknessTexture, uv).g; #else - surfaceData.iridescenceThickness = iridesceceThicknessMax; + float iridescenceThicknessWeight = 1.0; #endif - + surfaceData.iridescenceThickness = mix(iridesceceThicknessMin, iridesceceThicknessMax, iridescenceThicknessWeight); + #ifdef MATERIAL_HAS_IRIDESCENCE_TEXTURE - vec3 iridecenceIntensity = (texture2D( material_IridescenceTexture, uv)).rgb; - surfaceData.iridesceceFactor *= iridecenceIntensity.x; + float iridecenceIntensity = (texture2D( material_IridescenceTexture, uv)).r; + surfaceData.iridesceceFactor *= iridecenceIntensity; #endif #endif diff --git a/packages/shaderlab/src/shaders/shadingPBR/LightDirectPBR.glsl b/packages/shaderlab/src/shaders/shadingPBR/LightDirectPBR.glsl index 4fa3d201..1da64831 100644 --- a/packages/shaderlab/src/shaders/shadingPBR/LightDirectPBR.glsl +++ b/packages/shaderlab/src/shaders/shadingPBR/LightDirectPBR.glsl @@ -14,9 +14,6 @@ #ifndef FUNCTION_CLEAR_COAT_LOBE #define FUNCTION_CLEAR_COAT_LOBE clearCoatLobe #endif -#ifndef FUNCTION_IRIDESCENCE_LOBE - #define FUNCTION_IRIDESCENCE_LOBE iridescenceLobe -#endif #include "BRDF.glsl" #include "Light.glsl" @@ -37,8 +34,6 @@ void surfaceShading(Varyings varyings, SurfaceData surfaceData, BRDFData brdfDat FUNCTION_DIFFUSE_LOBE(varyings, surfaceData, brdfData, attenuationIrradiance, diffuseColor); // Specular Lobe FUNCTION_SPECULAR_LOBE(varyings, surfaceData, brdfData, incidentDirection, attenuationIrradiance, specularColor); - // Iridescence Lobe - FUNCTION_IRIDESCENCE_LOBE(varyings, surfaceData, brdfData, incidentDirection, attenuationIrradiance, specularColor); color += diffuseColor + specularColor; diff --git a/packages/shaderlab/src/shaders/shadingPBR/LightIndirectPBR.glsl b/packages/shaderlab/src/shaders/shadingPBR/LightIndirectPBR.glsl index a9fe3e23..82cb92b3 100644 --- a/packages/shaderlab/src/shaders/shadingPBR/LightIndirectPBR.glsl +++ b/packages/shaderlab/src/shaders/shadingPBR/LightIndirectPBR.glsl @@ -11,9 +11,6 @@ #ifndef FUNCTION_CLEAR_COAT_IBL #define FUNCTION_CLEAR_COAT_IBL evaluateClearCoatIBL #endif -#ifndef FUNCTION_IRIDESCENCE_IBL - #define FUNCTION_IRIDESCENCE_IBL evaluateIridescenceIBL -#endif #include "BRDF.glsl" #include "Light.glsl" @@ -68,21 +65,15 @@ float evaluateClearCoatIBL(Varyings varyings, SurfaceData surfaceData, BRDFData return radianceAttenuation; } -void evaluateIridescenceIBL(Varyings varyings, SurfaceData surfaceData, BRDFData brdfData, float radianceAttenuation, inout vec3 specularColor){ +void evaluateSpecularIBL(Varyings varyings, SurfaceData surfaceData, BRDFData brdfData, float radianceAttenuation, inout vec3 specularColor){ vec3 radiance = getLightProbeRadiance(surfaceData, surfaceData.normal, brdfData.roughness); - vec3 envBRDF = envBRDFApprox(brdfData.specularColor, brdfData.roughness, surfaceData.dotNV); - + vec3 envBRDFApprox = envBRDFApprox(brdfData.specularColor, brdfData.roughness, surfaceData.dotNV); + #ifdef MATERIAL_ENABLE_IRIDESCENCE - envBRDF = mix(envBRDF, brdfData.iridescenceSpecularColor, surfaceData.iridesceceFactor); + envBRDFApprox = mix(envBRDFApprox, brdfData.iridescenceSpecularColor, surfaceData.iridesceceFactor); #endif - specularColor += surfaceData.specularAO * radianceAttenuation * radiance * envBRDF; - -} - -void evaluateSpecularIBL(Varyings varyings, SurfaceData surfaceData, BRDFData brdfData, float radianceAttenuation, inout vec3 specularColor){ - vec3 radiance = getLightProbeRadiance(surfaceData, surfaceData.normal, brdfData.roughness); - specularColor += surfaceData.specularAO * radianceAttenuation * radiance * envBRDFApprox(brdfData.specularColor, brdfData.roughness, surfaceData.dotNV ); + specularColor += surfaceData.specularAO * radianceAttenuation * radiance * envBRDFApprox; } @@ -99,9 +90,6 @@ void evaluateIBL(Varyings varyings, SurfaceData surfaceData, BRDFData brdfData, // IBL specular FUNCTION_SPECULAR_IBL(varyings, surfaceData, brdfData, radianceAttenuation, specularColor); - // IBL Iridescence - FUNCTION_IRIDESCENCE_IBL(varyings, surfaceData, brdfData, radianceAttenuation, specularColor); - color += diffuseColor + specularColor; } diff --git a/packages/shaderlab/src/shaders/shadingPBR/ReflectionLobe.glsl b/packages/shaderlab/src/shaders/shadingPBR/ReflectionLobe.glsl index d007a8f3..f92a0372 100644 --- a/packages/shaderlab/src/shaders/shadingPBR/ReflectionLobe.glsl +++ b/packages/shaderlab/src/shaders/shadingPBR/ReflectionLobe.glsl @@ -6,7 +6,13 @@ void diffuseLobe(Varyings varyings, SurfaceData surfaceData, BRDFData brdfData, } void specularLobe(Varyings varyings, SurfaceData surfaceData, BRDFData brdfData, vec3 incidentDirection, vec3 attenuationIrradiance, inout vec3 specularColor){ - specularColor += attenuationIrradiance * BRDF_Specular_GGX( incidentDirection, surfaceData, surfaceData.normal, brdfData.specularColor, brdfData.roughness); + vec3 BRDF_Specular_GGX = BRDF_Specular_GGX( incidentDirection, surfaceData, surfaceData.normal, brdfData.specularColor, brdfData.roughness); + + #ifdef MATERIAL_ENABLE_IRIDESCENCE + BRDF_Specular_GGX = mix(BRDF_Specular_GGX, brdfData.iridescenceSpecularColor, surfaceData.iridesceceFactor); + #endif + + specularColor += attenuationIrradiance * BRDF_Specular_GGX; } float clearCoatLobe(Varyings varyings, SurfaceData surfaceData, BRDFData brdfData, vec3 incidentDirection, vec3 color, inout vec3 specularColor){ @@ -23,14 +29,4 @@ float clearCoatLobe(Varyings varyings, SurfaceData surfaceData, BRDFData brdfDat return attenuation; } -void iridescenceLobe(Varyings varyings, SurfaceData surfaceData, BRDFData brdfData, vec3 incidentDirection, vec3 attenuationIrradiance, inout vec3 specularColor){ - vec3 BRDF_Specular = BRDF_Specular_GGX( incidentDirection, surfaceData, surfaceData.normal, brdfData.specularColor, brdfData.roughness); - - #ifdef MATERIAL_ENABLE_IRIDESCENCE - BRDF_Specular = mix(BRDF_Specular, brdfData.iridescenceSpecularColor, surfaceData.iridesceceFactor); - #endif - - specularColor += attenuationIrradiance * BRDF_Specular; -} - #endif \ No newline at end of file From dd0e023342b9de30bde80ad0f0c6d8de310895b7 Mon Sep 17 00:00:00 2001 From: hhhhkrx Date: Mon, 11 Nov 2024 14:05:22 +0800 Subject: [PATCH 04/37] fix: delate sheen --- .../src/shaders/shadingPBR/BRDF.glsl | 22 ------------------- .../src/shaders/shadingPBR/FragmentPBR.glsl | 11 ---------- 2 files changed, 33 deletions(-) diff --git a/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl b/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl index 0b4aa425..db0ade51 100644 --- a/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl +++ b/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl @@ -56,13 +56,6 @@ struct SurfaceData{ float iridescenceThickness; #endif - //sheen - #ifdef MATERIAL_ENABLE_SHEEN - float sheenIntensity; - vec3 sheenColor; - float sheenRoughness; - #endif - }; @@ -315,21 +308,6 @@ vec3 BRDF_Diffuse_Lambert(vec3 diffuseColor) { } #endif -#ifdef MATERIAL_ENABLE_SHEEN - //http://www.aconty.com/pdf/s2017_pbs_imageworks_sheen.pdf - float D_Charlie(float roughness, float dotNH) { - float invAlpha = 1.0 / roughness; - float cos2h = dotNH * dotNH; - float sin2h = max(1.0 - cos2h, 0.0078125); // 2^(-14/2), so sin2h^2 > 0 in fp16 - return (2.0 + invAlpha) * pow(sin2h, invAlpha * 0.5) / (2.0 * PI); - } - - //https://blog.selfshadow.com/publications/s2013-shading-course/#course_content - float V_Neubelt(float dotNV, float dotNL) { - return 1.0 / (4.0 * (dotNL + dotNV - dotNL * dotNV)); - } -#endif - void initBRDFData(SurfaceData surfaceData, out BRDFData brdfData){ vec3 albedoColor = surfaceData.albedoColor; vec3 specularColor = surfaceData.specularColor; diff --git a/packages/shaderlab/src/shaders/shadingPBR/FragmentPBR.glsl b/packages/shaderlab/src/shaders/shadingPBR/FragmentPBR.glsl index d5420f55..2b6b4727 100644 --- a/packages/shaderlab/src/shaders/shadingPBR/FragmentPBR.glsl +++ b/packages/shaderlab/src/shaders/shadingPBR/FragmentPBR.glsl @@ -50,17 +50,6 @@ float material_OcclusionTextureCoord; #endif #endif -#ifdef MATERIAL_ENABLE_SHEEN - vec3 material_SheenColor; - float material_SheenRoughness; - #ifdef MATERIAL_HAS_SHEENCOLOR_TEXTURE - sampler2D material_SheenColorTexture; - #endif - #ifdef MATERIAL_HAS_SHEENROUGHNESS_TEXTURE - sampler2D material_SheenRoughnessTexture; - #endif -#endif - // Texture #ifdef MATERIAL_HAS_BASETEXTURE sampler2D material_BaseTexture; From 329e0f8848a27832dcfc2940aa48ebeff2cfd4f6 Mon Sep 17 00:00:00 2001 From: hhhhkrx Date: Mon, 11 Nov 2024 15:41:14 +0800 Subject: [PATCH 05/37] fix: Iridescnence name --- packages/shaderlab/src/shaders/PBR.gs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/shaderlab/src/shaders/PBR.gs b/packages/shaderlab/src/shaders/PBR.gs index 07c26683..7bb7c4c8 100644 --- a/packages/shaderlab/src/shaders/PBR.gs +++ b/packages/shaderlab/src/shaders/PBR.gs @@ -42,7 +42,7 @@ Shader "PBR.gs" { } Header("Thin Film Iridescence"){ - material_IridescenceInfo("Iridescence", Vector4) = (0, 1.3, 100, 400); + material_IridescenceInfo("IridescenceInfo", Vector4) = (0, 1.3, 100, 400); material_IridescenceThicknessTexture("IridescenceThicknessTexture", Texture2D); material_IridescenceTexture("IridescenceTexture", Texture2D); } From 451b976e419f3f11d7547bcb391e488f859380c5 Mon Sep 17 00:00:00 2001 From: hhhhkrx Date: Thu, 14 Nov 2024 11:03:00 +0800 Subject: [PATCH 06/37] fix: pow2 --- packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl b/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl index db0ade51..8325bb62 100644 --- a/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl +++ b/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl @@ -214,10 +214,6 @@ vec3 BRDF_Diffuse_Lambert(vec3 diffuseColor) { } #ifdef MATERIAL_ENABLE_IRIDESCENCE - float sqr(float x) { - return x * x; - } - // Conversion f0/ior vec3 iorToFresnel(vec3 transmittedIor, float incidentIor) { return pow((transmittedIor - incidentIor) / (transmittedIor + incidentIor),vec3(2.0)); @@ -243,8 +239,8 @@ vec3 BRDF_Diffuse_Lambert(vec3 diffuseColor) { const vec3 val = vec3(5.4856e-13, 4.4201e-13, 5.2481e-13); const vec3 pos = vec3(1.6810e+06, 1.7953e+06, 2.2084e+06); const vec3 var = vec3(4.3278e+09, 9.3046e+09, 6.6121e+09); - vec3 xyz = val * sqrt(2.0 * PI * var) * cos(pos * phase + shift) * exp(-var * sqr(phase)); - xyz.x += 9.7470e-14 * sqrt(2.0 * PI * 4.5282e+09) * cos(2.2399e+06 * phase + shift[0]) * exp(-4.5282e+09 * sqr(phase)); + vec3 xyz = val * sqrt(2.0 * PI * var) * cos(pos * phase + shift) * exp(-var * pow2(phase)); + xyz.x += 9.7470e-14 * sqrt(2.0 * PI * 4.5282e+09) * cos(2.2399e+06 * phase + shift[0]) * exp(-4.5282e+09 * pow2(phase)); xyz /= 1.0685e-7; // XYZ to RGB color space const mat3 XYZ_TO_RGB = mat3( 3.2404542, -0.9692660, 0.0556434, @@ -292,7 +288,7 @@ vec3 BRDF_Diffuse_Lambert(vec3 diffuseColor) { // Compound terms vec3 R123 = clamp(R12 * R23, 1e-5, 0.9999); vec3 r123 = sqrt(R123); - vec3 Rs = sqr(T121) * R23 / (vec3(1.0) - R123); + vec3 Rs = pow2(T121) * R23 / (vec3(1.0) - R123); // Reflectance term for m = 0 (DC term amplitude) vec3 C0 = R12 + Rs; iridescence = C0; From 6d8921878c2d93ea5ab47ea975d0b67adc6b4ddf Mon Sep 17 00:00:00 2001 From: hhhhkrx Date: Tue, 19 Nov 2024 19:16:58 +0800 Subject: [PATCH 07/37] fix: iridescence name --- .../src/shaders/shadingPBR/BRDF.glsl | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl b/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl index 8325bb62..9981e682 100644 --- a/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl +++ b/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl @@ -250,12 +250,12 @@ vec3 BRDF_Diffuse_Lambert(vec3 diffuseColor) { return rgb; } - vec3 evalIridescence(float outsideIOR, float cosTheta1, float eta2, vec3 baseF0,float iridescenceThickness){ + vec3 evalIridescence(float outsideIOR, float dotNV, float eta2, vec3 baseF0,float iridescenceThickness){ vec3 iridescence = vec3(1.0); // Force iridescenceIOR -> outsideIOR when thinFilmThickness -> 0.0 float iridescenceIOR = mix( outsideIOR, eta2, smoothstep( 0.0, 0.03, iridescenceThickness ) ); // Evaluate the cosTheta on the base layer (Snell law) - float sinTheta2Sq = pow( outsideIOR / iridescenceIOR, 2.0) * (1.0 - pow( cosTheta1, 2.0)); + float sinTheta2Sq = pow( outsideIOR / iridescenceIOR, 2.0) * (1.0 - pow( dotNV, 2.0)); float cosTheta2Sq = 1.0 - sinTheta2Sq; // Handle total internal reflection if (cosTheta2Sq < 0.0) { @@ -264,22 +264,22 @@ vec3 BRDF_Diffuse_Lambert(vec3 diffuseColor) { float cosTheta2 = sqrt(cosTheta2Sq); // First interface - float R0 = iorToFresnel(iridescenceIOR, outsideIOR); - float R12 = F_Schlick(R0, cosTheta1); - float R21 = R12; - float T121 = 1.0 - R12; + float F0 = iorToFresnel(iridescenceIOR, outsideIOR); + float reflectance = F_Schlick(F0, dotNV); + float T121 = 1.0 - reflectance; float phi12 = 0.0; - if (iridescenceIOR < outsideIOR) {phi12 = PI;} + // iridescenceIOR has limited greater than 1.0. + // if (iridescenceIOR < outsideIOR) {phi12 = PI;} float phi21 = PI - phi12; // Second interface - vec3 baseIor = fresnelToIor(clamp(baseF0, 0.0, 0.9999)); // guard against 1.0 - vec3 R1 =iorToFresnel(baseIor, iridescenceIOR); + vec3 baseIOR = fresnelToIor(clamp(baseF0, 0.0, 0.9999)); // guard against 1.0 + vec3 R1 = iorToFresnel(baseIOR, iridescenceIOR); vec3 R23 = F_Schlick(R1, cosTheta2); vec3 phi23 =vec3(0.0); - if (baseIor[0] < iridescenceIOR) {phi23[0] = PI;} - if (baseIor[1] < iridescenceIOR) {phi23[1] = PI;} - if (baseIor[2] < iridescenceIOR) {phi23[2] = PI;} + if (baseIOR[0] < iridescenceIOR) {phi23[0] = PI;} + if (baseIOR[1] < iridescenceIOR) {phi23[1] = PI;} + if (baseIOR[2] < iridescenceIOR) {phi23[2] = PI;} // Phase shift float OPD = 2.0 * iridescenceIOR * iridescenceThickness * cosTheta2; From 6c6e710a7e3fd3e0bb609e95e6018fc2d0ee8697 Mon Sep 17 00:00:00 2001 From: hhhhkrx Date: Tue, 19 Nov 2024 19:19:28 +0800 Subject: [PATCH 08/37] fix: iridesceceIOR name --- packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl | 4 ++-- packages/shaderlab/src/shaders/shadingPBR/FragmentPBR.glsl | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl b/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl index 9981e682..47d8209b 100644 --- a/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl +++ b/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl @@ -51,7 +51,7 @@ struct SurfaceData{ #endif #ifdef MATERIAL_ENABLE_IRIDESCENCE - float iridesceceIor; + float iridesceceIOR; float iridesceceFactor; float iridescenceThickness; #endif @@ -329,7 +329,7 @@ void initBRDFData(SurfaceData surfaceData, out BRDFData brdfData){ #ifdef MATERIAL_ENABLE_IRIDESCENCE float topIor = 1.0; - brdfData.iridescenceSpecularColor = evalIridescence(topIor, surfaceData.dotNV, surfaceData.iridesceceIor, brdfData.specularColor, surfaceData.iridescenceThickness); + brdfData.iridescenceSpecularColor = evalIridescence(topIor, surfaceData.dotNV, surfaceData.iridesceceIOR, brdfData.specularColor, surfaceData.iridescenceThickness); #endif } diff --git a/packages/shaderlab/src/shaders/shadingPBR/FragmentPBR.glsl b/packages/shaderlab/src/shaders/shadingPBR/FragmentPBR.glsl index 2b6b4727..443c7575 100644 --- a/packages/shaderlab/src/shaders/shadingPBR/FragmentPBR.glsl +++ b/packages/shaderlab/src/shaders/shadingPBR/FragmentPBR.glsl @@ -249,7 +249,7 @@ SurfaceData getSurfaceData(Varyings v, vec2 aoUV, bool isFrontFacing){ //Iridescence #ifdef MATERIAL_ENABLE_IRIDESCENCE surfaceData.iridesceceFactor = material_IridescenceInfo.x; - surfaceData.iridesceceIor = material_IridescenceInfo.y; + surfaceData.iridesceceIOR = material_IridescenceInfo.y; float iridesceceThicknessMin = material_IridescenceInfo.z; float iridesceceThicknessMax = material_IridescenceInfo.w; From 128094cb31ab9b991d032f1b022a4f3710da0df0 Mon Sep 17 00:00:00 2001 From: hhhhkrx Date: Tue, 19 Nov 2024 19:20:57 +0800 Subject: [PATCH 09/37] fix: topIOR name --- packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl b/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl index 47d8209b..b23f7967 100644 --- a/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl +++ b/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl @@ -328,8 +328,8 @@ void initBRDFData(SurfaceData surfaceData, out BRDFData brdfData){ #endif #ifdef MATERIAL_ENABLE_IRIDESCENCE - float topIor = 1.0; - brdfData.iridescenceSpecularColor = evalIridescence(topIor, surfaceData.dotNV, surfaceData.iridesceceIOR, brdfData.specularColor, surfaceData.iridescenceThickness); + float topIOR = 1.0; + brdfData.iridescenceSpecularColor = evalIridescence(topIOR, surfaceData.dotNV, surfaceData.iridesceceIOR, brdfData.specularColor, surfaceData.iridescenceThickness); #endif } From 8efd6172a734cb69e1ee8163478d919b08f725f2 Mon Sep 17 00:00:00 2001 From: hhhhkrx Date: Tue, 19 Nov 2024 19:23:16 +0800 Subject: [PATCH 10/37] fix: ior name --- packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl b/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl index b23f7967..a094c07f 100644 --- a/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl +++ b/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl @@ -215,17 +215,17 @@ vec3 BRDF_Diffuse_Lambert(vec3 diffuseColor) { #ifdef MATERIAL_ENABLE_IRIDESCENCE // Conversion f0/ior - vec3 iorToFresnel(vec3 transmittedIor, float incidentIor) { - return pow((transmittedIor - incidentIor) / (transmittedIor + incidentIor),vec3(2.0)); + vec3 iorToFresnel(vec3 transmittedIOR, float incidentIOR) { + return pow((transmittedIOR - incidentIOR) / (transmittedIOR + incidentIOR),vec3(2.0)); } - float iorToFresnel(float transmittedIor, float incidentIor) { - return pow((transmittedIor - incidentIor) / (transmittedIor + incidentIor),2.0); + float iorToFresnel(float transmittedIOR, float incidentIOR) { + return pow((transmittedIOR - incidentIOR) / (transmittedIOR + incidentIOR),2.0); } // Assume air interface for top // Note: We don't handle the case fresnel0 == 1 - vec3 fresnelToIor(vec3 F0){ + vec3 fresnelToIOR(vec3 F0){ vec3 sqrtF0 = sqrt(F0); return (vec3(1.0) + sqrtF0) / (vec3(1.0) - sqrtF0); } @@ -273,7 +273,7 @@ vec3 BRDF_Diffuse_Lambert(vec3 diffuseColor) { float phi21 = PI - phi12; // Second interface - vec3 baseIOR = fresnelToIor(clamp(baseF0, 0.0, 0.9999)); // guard against 1.0 + vec3 baseIOR = fresnelToIOR(clamp(baseF0, 0.0, 0.9999)); // guard against 1.0 vec3 R1 = iorToFresnel(baseIOR, iridescenceIOR); vec3 R23 = F_Schlick(R1, cosTheta2); vec3 phi23 =vec3(0.0); From 59b4ca594d2adf1582b7e0be5419c4f7dc474816 Mon Sep 17 00:00:00 2001 From: hhhhkrx Date: Tue, 19 Nov 2024 19:32:32 +0800 Subject: [PATCH 11/37] fix: name of hump --- .../src/shaders/shadingPBR/BRDF.glsl | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl b/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl index a094c07f..52c3dae6 100644 --- a/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl +++ b/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl @@ -215,11 +215,11 @@ vec3 BRDF_Diffuse_Lambert(vec3 diffuseColor) { #ifdef MATERIAL_ENABLE_IRIDESCENCE // Conversion f0/ior - vec3 iorToFresnel(vec3 transmittedIOR, float incidentIOR) { + vec3 iorToFresnel0(vec3 transmittedIOR, float incidentIOR) { return pow((transmittedIOR - incidentIOR) / (transmittedIOR + incidentIOR),vec3(2.0)); } - float iorToFresnel(float transmittedIOR, float incidentIOR) { + float iorToFresnel0(float transmittedIOR, float incidentIOR) { return pow((transmittedIOR - incidentIOR) / (transmittedIOR + incidentIOR),2.0); } @@ -264,9 +264,9 @@ vec3 BRDF_Diffuse_Lambert(vec3 diffuseColor) { float cosTheta2 = sqrt(cosTheta2Sq); // First interface - float F0 = iorToFresnel(iridescenceIOR, outsideIOR); - float reflectance = F_Schlick(F0, dotNV); - float T121 = 1.0 - reflectance; + float f0 = iorToFresnel0(iridescenceIOR, outsideIOR); + float reflectance = F_Schlick(f0, dotNV); + float t121 = 1.0 - reflectance; float phi12 = 0.0; // iridescenceIOR has limited greater than 1.0. // if (iridescenceIOR < outsideIOR) {phi12 = PI;} @@ -274,8 +274,8 @@ vec3 BRDF_Diffuse_Lambert(vec3 diffuseColor) { // Second interface vec3 baseIOR = fresnelToIOR(clamp(baseF0, 0.0, 0.9999)); // guard against 1.0 - vec3 R1 = iorToFresnel(baseIOR, iridescenceIOR); - vec3 R23 = F_Schlick(R1, cosTheta2); + vec3 r1 = iorToFresnel0(baseIOR, iridescenceIOR); + vec3 r23 = F_Schlick(r1, cosTheta2); vec3 phi23 =vec3(0.0); if (baseIOR[0] < iridescenceIOR) {phi23[0] = PI;} if (baseIOR[1] < iridescenceIOR) {phi23[1] = PI;} @@ -286,18 +286,18 @@ vec3 BRDF_Diffuse_Lambert(vec3 diffuseColor) { vec3 phi = vec3(phi21) + phi23; // Compound terms - vec3 R123 = clamp(R12 * R23, 1e-5, 0.9999); - vec3 r123 = sqrt(R123); - vec3 Rs = pow2(T121) * R23 / (vec3(1.0) - R123); + vec3 r123 = clamp(r12 * r23, 1e-5, 0.9999); + vec3 r123 = sqrt(r123); + vec3 rs = pow2(t121) * r23 / (vec3(1.0) - r123); // Reflectance term for m = 0 (DC term amplitude) - vec3 C0 = R12 + Rs; - iridescence = C0; + vec3 c0 = r12 + rs; + iridescence = c0; // Reflectance term for m > 0 (pairs of diracs) - vec3 Cm = Rs - T121; + vec3 cm = rs - t121; for (int m = 1; m <= 2; ++m) { - Cm *= r123; + cm *= r123; vec3 Sm = 2.0 * evalSensitivity(float(m) * OPD, float(m) * phi); - iridescence += Cm * Sm; + iridescence += cm * Sm; } iridescence = max(iridescence, vec3(0.0)); return iridescence; From 09a5ebb2dab4295929c96a2e6b2065adc69abfd9 Mon Sep 17 00:00:00 2001 From: hhhhkrx Date: Tue, 19 Nov 2024 19:34:15 +0800 Subject: [PATCH 12/37] fix: name --- packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl b/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl index 52c3dae6..eb2c9ffc 100644 --- a/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl +++ b/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl @@ -214,7 +214,6 @@ vec3 BRDF_Diffuse_Lambert(vec3 diffuseColor) { } #ifdef MATERIAL_ENABLE_IRIDESCENCE - // Conversion f0/ior vec3 iorToFresnel0(vec3 transmittedIOR, float incidentIOR) { return pow((transmittedIOR - incidentIOR) / (transmittedIOR + incidentIOR),vec3(2.0)); } @@ -225,8 +224,8 @@ vec3 BRDF_Diffuse_Lambert(vec3 diffuseColor) { // Assume air interface for top // Note: We don't handle the case fresnel0 == 1 - vec3 fresnelToIOR(vec3 F0){ - vec3 sqrtF0 = sqrt(F0); + vec3 fresnelToIOR(vec3 f0){ + vec3 sqrtF0 = sqrt(f0); return (vec3(1.0) + sqrtF0) / (vec3(1.0) - sqrtF0); } @@ -282,7 +281,7 @@ vec3 BRDF_Diffuse_Lambert(vec3 diffuseColor) { if (baseIOR[2] < iridescenceIOR) {phi23[2] = PI;} // Phase shift - float OPD = 2.0 * iridescenceIOR * iridescenceThickness * cosTheta2; + float opd = 2.0 * iridescenceIOR * iridescenceThickness * cosTheta2; vec3 phi = vec3(phi21) + phi23; // Compound terms @@ -296,7 +295,7 @@ vec3 BRDF_Diffuse_Lambert(vec3 diffuseColor) { vec3 cm = rs - t121; for (int m = 1; m <= 2; ++m) { cm *= r123; - vec3 Sm = 2.0 * evalSensitivity(float(m) * OPD, float(m) * phi); + vec3 Sm = 2.0 * evalSensitivity(float(m) * opd, float(m) * phi); iridescence += cm * Sm; } iridescence = max(iridescence, vec3(0.0)); From 3c0a0d6b4130b427c07f4733065e526080ce1c07 Mon Sep 17 00:00:00 2001 From: hhhhkrx Date: Tue, 19 Nov 2024 19:35:19 +0800 Subject: [PATCH 13/37] fix: name --- packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl b/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl index eb2c9ffc..9a8e8357 100644 --- a/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl +++ b/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl @@ -295,8 +295,8 @@ vec3 BRDF_Diffuse_Lambert(vec3 diffuseColor) { vec3 cm = rs - t121; for (int m = 1; m <= 2; ++m) { cm *= r123; - vec3 Sm = 2.0 * evalSensitivity(float(m) * opd, float(m) * phi); - iridescence += cm * Sm; + vec3 sm = 2.0 * evalSensitivity(float(m) * opd, float(m) * phi); + iridescence += cm * sm; } iridescence = max(iridescence, vec3(0.0)); return iridescence; From ba667083f0fafae2ba2446d9e46ea53c35f87575 Mon Sep 17 00:00:00 2001 From: hhhhkrx Date: Tue, 19 Nov 2024 22:57:32 +0800 Subject: [PATCH 14/37] fix: iridescence --- .../src/shaders/shadingPBR/BRDF.glsl | 36 ++++++++++--------- .../shaders/shadingPBR/LightIndirectPBR.glsl | 11 +++--- .../shaders/shadingPBR/ReflectionLobe.glsl | 8 +---- 3 files changed, 26 insertions(+), 29 deletions(-) diff --git a/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl b/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl index 9a8e8357..7d9ae779 100644 --- a/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl +++ b/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl @@ -154,16 +154,14 @@ float D_GGX(float alpha, float dotNH ) { } #endif -vec3 isotropicLobe(vec3 specularColor, float alpha, float dotNV, float dotNL, float dotNH, float dotLH) { - vec3 F = F_Schlick( specularColor, dotLH ); +float isotropicLobe(float alpha, float dotNV, float dotNL, float dotNH) { float D = D_GGX( alpha, dotNH ); float G = G_GGX_SmithCorrelated( alpha, dotNL, dotNV ); - - return F * ( G * D ); + return G * D; } #ifdef MATERIAL_ENABLE_ANISOTROPY - vec3 anisotropicLobe(vec3 h, vec3 l, SurfaceData surfaceData, vec3 specularColor, float alpha, float dotNV, float dotNL, float dotNH, float dotLH) { + float anisotropicLobe(vec3 h, vec3 l, SurfaceData surfaceData, float alpha, float dotNV, float dotNL, float dotNH) { vec3 t = surfaceData.anisotropicT; vec3 b = surfaceData.anisotropicB; vec3 v = surfaceData.viewDir; @@ -181,16 +179,15 @@ vec3 isotropicLobe(vec3 specularColor, float alpha, float dotNV, float dotNL, fl float ab = max(alpha * (1.0 - surfaceData.anisotropy), MIN_ROUGHNESS); // specular anisotropic BRDF - vec3 F = F_Schlick( specularColor, dotLH ); float D = D_GGX_Anisotropic(at, ab, dotTH, dotBH, dotNH); float G = G_GGX_SmithCorrelated_Anisotropic(at, ab, dotTV, dotBV, dotTL, dotBL, dotNV, dotNL); - return F * ( G * D ); + return G * D; } #endif // GGX Distribution, Schlick Fresnel, GGX-Smith Visibility -vec3 BRDF_Specular_GGX(vec3 incidentDirection, SurfaceData surfaceData, vec3 normal, vec3 specularColor, float roughness ) { +vec3 BRDF_Specular_GGX(vec3 incidentDirection, SurfaceData surfaceData, BRDFData brdfData, vec3 normal, vec3 specularColor, float roughness ) { float alpha = pow2( roughness ); // UE4's roughness @@ -201,12 +198,18 @@ vec3 BRDF_Specular_GGX(vec3 incidentDirection, SurfaceData surfaceData, vec3 nor float dotNH = saturate( dot( normal, halfDir ) ); float dotLH = saturate( dot( incidentDirection, halfDir ) ); + vec3 F = F_Schlick( specularColor, dotLH ); + #ifdef MATERIAL_ENABLE_IRIDESCENCE + F = mix(F, brdfData.iridescenceSpecularColor, surfaceData.iridesceceFactor); + #endif + + #ifdef MATERIAL_ENABLE_ANISOTROPY - return anisotropicLobe(halfDir, incidentDirection, surfaceData, specularColor, alpha, dotNV, dotNL, dotNH, dotLH); + float GD = anisotropicLobe(halfDir, incidentDirection, surfaceData, alpha, dotNV, dotNL, dotNH); #else - return isotropicLobe(specularColor, alpha, dotNV, dotNL, dotNH, dotLH); + float GD = isotropicLobe(alpha, dotNV, dotNL, dotNH); #endif - + return F * GD; } vec3 BRDF_Diffuse_Lambert(vec3 diffuseColor) { @@ -285,11 +288,11 @@ vec3 BRDF_Diffuse_Lambert(vec3 diffuseColor) { vec3 phi = vec3(phi21) + phi23; // Compound terms - vec3 r123 = clamp(r12 * r23, 1e-5, 0.9999); - vec3 r123 = sqrt(r123); - vec3 rs = pow2(t121) * r23 / (vec3(1.0) - r123); + vec3 R123 = clamp(reflectance * r23, 1e-5, 0.9999); + vec3 r123 = sqrt(R123); + vec3 rs = pow2(t121) * r23 / (vec3(1.0) - R123); // Reflectance term for m = 0 (DC term amplitude) - vec3 c0 = r12 + rs; + vec3 c0 = reflectance + rs; iridescence = c0; // Reflectance term for m > 0 (pairs of diracs) vec3 cm = rs - t121; @@ -298,8 +301,7 @@ vec3 BRDF_Diffuse_Lambert(vec3 diffuseColor) { vec3 sm = 2.0 * evalSensitivity(float(m) * opd, float(m) * phi); iridescence += cm * sm; } - iridescence = max(iridescence, vec3(0.0)); - return iridescence; + return iridescence = max(iridescence, vec3(0.0)); } #endif diff --git a/packages/shaderlab/src/shaders/shadingPBR/LightIndirectPBR.glsl b/packages/shaderlab/src/shaders/shadingPBR/LightIndirectPBR.glsl index 82cb92b3..7a48795a 100644 --- a/packages/shaderlab/src/shaders/shadingPBR/LightIndirectPBR.glsl +++ b/packages/shaderlab/src/shaders/shadingPBR/LightIndirectPBR.glsl @@ -65,15 +65,16 @@ float evaluateClearCoatIBL(Varyings varyings, SurfaceData surfaceData, BRDFData return radianceAttenuation; } -void evaluateSpecularIBL(Varyings varyings, SurfaceData surfaceData, BRDFData brdfData, float radianceAttenuation, inout vec3 specularColor){ +void evaluateSpecularIBL(Varyings varyings, SurfaceData surfaceData, BRDFData brdfData, float radianceAttenuation, inout vec3 outSpecularColor){ vec3 radiance = getLightProbeRadiance(surfaceData, surfaceData.normal, brdfData.roughness); - vec3 envBRDFApprox = envBRDFApprox(brdfData.specularColor, brdfData.roughness, surfaceData.dotNV); - + #ifdef MATERIAL_ENABLE_IRIDESCENCE - envBRDFApprox = mix(envBRDFApprox, brdfData.iridescenceSpecularColor, surfaceData.iridesceceFactor); + vec3 speculaColor = mix(brdfData.specularColor, brdfData.iridescenceSpecularColor, surfaceData.iridesceceFactor); + #else + vec3 speculaColor = brdfData.specularColor; #endif - specularColor += surfaceData.specularAO * radianceAttenuation * radiance * envBRDFApprox; + outSpecularColor += surfaceData.specularAO * radianceAttenuation * radiance * envBRDFApprox(speculaColor, brdfData.roughness, surfaceData.dotNV); } diff --git a/packages/shaderlab/src/shaders/shadingPBR/ReflectionLobe.glsl b/packages/shaderlab/src/shaders/shadingPBR/ReflectionLobe.glsl index f92a0372..ee2ab891 100644 --- a/packages/shaderlab/src/shaders/shadingPBR/ReflectionLobe.glsl +++ b/packages/shaderlab/src/shaders/shadingPBR/ReflectionLobe.glsl @@ -6,13 +6,7 @@ void diffuseLobe(Varyings varyings, SurfaceData surfaceData, BRDFData brdfData, } void specularLobe(Varyings varyings, SurfaceData surfaceData, BRDFData brdfData, vec3 incidentDirection, vec3 attenuationIrradiance, inout vec3 specularColor){ - vec3 BRDF_Specular_GGX = BRDF_Specular_GGX( incidentDirection, surfaceData, surfaceData.normal, brdfData.specularColor, brdfData.roughness); - - #ifdef MATERIAL_ENABLE_IRIDESCENCE - BRDF_Specular_GGX = mix(BRDF_Specular_GGX, brdfData.iridescenceSpecularColor, surfaceData.iridesceceFactor); - #endif - - specularColor += attenuationIrradiance * BRDF_Specular_GGX; + specularColor += attenuationIrradiance * BRDF_Specular_GGX( incidentDirection, surfaceData, brdfData, surfaceData.normal, brdfData.specularColor, brdfData.roughness); } float clearCoatLobe(Varyings varyings, SurfaceData surfaceData, BRDFData brdfData, vec3 incidentDirection, vec3 color, inout vec3 specularColor){ From adb8bdeec7c37eef0080bec8ddbe427e55c655f6 Mon Sep 17 00:00:00 2001 From: hhhhkrx Date: Tue, 19 Nov 2024 23:27:17 +0800 Subject: [PATCH 15/37] fix: iridescence --- .../shaderlab/src/shaders/shadingPBR/BRDF.glsl | 18 +++++++++--------- .../src/shaders/shadingPBR/FragmentPBR.glsl | 9 +++------ 2 files changed, 12 insertions(+), 15 deletions(-) diff --git a/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl b/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl index 7d9ae779..8bdbc04f 100644 --- a/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl +++ b/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl @@ -154,14 +154,14 @@ float D_GGX(float alpha, float dotNH ) { } #endif -float isotropicLobe(float alpha, float dotNV, float dotNL, float dotNH) { +float DG_GGX(float alpha, float dotNV, float dotNL, float dotNH) { float D = D_GGX( alpha, dotNH ); float G = G_GGX_SmithCorrelated( alpha, dotNL, dotNV ); return G * D; } #ifdef MATERIAL_ENABLE_ANISOTROPY - float anisotropicLobe(vec3 h, vec3 l, SurfaceData surfaceData, float alpha, float dotNV, float dotNL, float dotNH) { + float DG_GGX_anisotropic(vec3 h, vec3 l, SurfaceData surfaceData, float alpha, float dotNV, float dotNL, float dotNH) { vec3 t = surfaceData.anisotropicT; vec3 b = surfaceData.anisotropicB; vec3 v = surfaceData.viewDir; @@ -205,9 +205,9 @@ vec3 BRDF_Specular_GGX(vec3 incidentDirection, SurfaceData surfaceData, BRDFData #ifdef MATERIAL_ENABLE_ANISOTROPY - float GD = anisotropicLobe(halfDir, incidentDirection, surfaceData, alpha, dotNV, dotNL, dotNH); + float GD = DG_GGX_anisotropic(halfDir, incidentDirection, surfaceData, alpha, dotNV, dotNL, dotNH); #else - float GD = isotropicLobe(alpha, dotNV, dotNL, dotNH); + float GD = DG_GGX(alpha, dotNV, dotNL, dotNH); #endif return F * GD; } @@ -270,7 +270,7 @@ vec3 BRDF_Diffuse_Lambert(vec3 diffuseColor) { float reflectance = F_Schlick(f0, dotNV); float t121 = 1.0 - reflectance; float phi12 = 0.0; - // iridescenceIOR has limited greater than 1.0. + // iridescenceIOR has limited greater than 1.0 // if (iridescenceIOR < outsideIOR) {phi12 = PI;} float phi21 = PI - phi12; @@ -288,16 +288,16 @@ vec3 BRDF_Diffuse_Lambert(vec3 diffuseColor) { vec3 phi = vec3(phi21) + phi23; // Compound terms - vec3 R123 = clamp(reflectance * r23, 1e-5, 0.9999); - vec3 r123 = sqrt(R123); - vec3 rs = pow2(t121) * r23 / (vec3(1.0) - R123); + vec3 r123 = clamp(reflectance * r23, 1e-5, 0.9999); + vec3 sr123 = sqrt(r123); + vec3 rs = pow2(t121) * r23 / (vec3(1.0) - r123); // Reflectance term for m = 0 (DC term amplitude) vec3 c0 = reflectance + rs; iridescence = c0; // Reflectance term for m > 0 (pairs of diracs) vec3 cm = rs - t121; for (int m = 1; m <= 2; ++m) { - cm *= r123; + cm *= sr123; vec3 sm = 2.0 * evalSensitivity(float(m) * opd, float(m) * phi); iridescence += cm * sm; } diff --git a/packages/shaderlab/src/shaders/shadingPBR/FragmentPBR.glsl b/packages/shaderlab/src/shaders/shadingPBR/FragmentPBR.glsl index 443c7575..f0e5f9c3 100644 --- a/packages/shaderlab/src/shaders/shadingPBR/FragmentPBR.glsl +++ b/packages/shaderlab/src/shaders/shadingPBR/FragmentPBR.glsl @@ -251,18 +251,15 @@ SurfaceData getSurfaceData(Varyings v, vec2 aoUV, bool isFrontFacing){ surfaceData.iridesceceFactor = material_IridescenceInfo.x; surfaceData.iridesceceIOR = material_IridescenceInfo.y; - float iridesceceThicknessMin = material_IridescenceInfo.z; - float iridesceceThicknessMax = material_IridescenceInfo.w; #ifdef MATERIAL_HAS_IRIDESCENCE_THICKNESS_TEXTURE float iridescenceThicknessWeight = texture2D( material_IridescenceThicknessTexture, uv).g; + surfaceData.iridescenceThickness = mix(material_IridescenceInfo.z, material_IridescenceInfo.w, iridescenceThicknessWeight); #else - float iridescenceThicknessWeight = 1.0; + surfaceData.iridescenceThickness = aterial_IridescenceInfo.w; #endif - surfaceData.iridescenceThickness = mix(iridesceceThicknessMin, iridesceceThicknessMax, iridescenceThicknessWeight); #ifdef MATERIAL_HAS_IRIDESCENCE_TEXTURE - float iridecenceIntensity = (texture2D( material_IridescenceTexture, uv)).r; - surfaceData.iridesceceFactor *= iridecenceIntensity; + surfaceData.iridesceceFactor *= texture2D( material_IridescenceTexture, uv).r; #endif #endif From 99a6d8e35e9e1ff66a8e41ac335b0ab766bb6227 Mon Sep 17 00:00:00 2001 From: hhhhkrx Date: Tue, 3 Dec 2024 15:36:27 +0800 Subject: [PATCH 16/37] feat: shaderlab PBR support sheen --- packages/shaderlab/src/shaders/PBR.gs | 11 ++++ .../src/shaders/shadingPBR/BRDF.glsl | 57 +++++++++++++++++++ .../src/shaders/shadingPBR/FragmentPBR.glsl | 32 +++++++++++ .../shaders/shadingPBR/LightIndirectPBR.glsl | 13 ++++- .../shaders/shadingPBR/ReflectionLobe.glsl | 13 ++++- 5 files changed, 123 insertions(+), 3 deletions(-) diff --git a/packages/shaderlab/src/shaders/PBR.gs b/packages/shaderlab/src/shaders/PBR.gs index 7bb7c4c8..a934ef31 100644 --- a/packages/shaderlab/src/shaders/PBR.gs +++ b/packages/shaderlab/src/shaders/PBR.gs @@ -47,6 +47,14 @@ Shader "PBR.gs" { material_IridescenceTexture("IridescenceTexture", Texture2D); } + Header("Sheen"){ + material_Sheen("Sheen", Range(0, 1, 0.01)) = 0; + material_SheenColor("SheenColor", Color ) = (0, 0, 0, 1); + material_SheenRoughness("SheenRoughness", Range(0, 1, 0.01)) = 0; + material_SheenTexture("SheenTexture", Texture2D); + material_SheenRoughnessTexture("SheenRoughnessTexture", Texture2D); + } + Header("Common") { material_AlphaCutoff( "AlphaCutoff", Range(0, 1, 0.01) ) = 0; material_TilingOffset("TilingOffset", Vector4) = (1, 1, 0, 0); @@ -69,6 +77,9 @@ Shader "PBR.gs" { MATERIAL_ENABLE_IRIDESCENCE("ENABLE_IRIDESCENCE"); MATERIAL_HAS_IRIDESCENCE_THICKNESS_TEXTURE("HAS_IRIDESCENCE_THICKNESS_TEXTURE"); MATERIAL_HAS_IRIDESCENCE_TEXTURE("HAS_IRIDESCENCE_TEXTURE"); + MATERIAL_ENABLE_SHEEN("ENABLE_SHEEN"); + MATERIAL_HAS_SHEEN_TEXTURE("HAS_SHEEN_TEXTURE"); + MATERIAL_HAS_SHEEN_ROUGHNESS_TEXTURE("HAS_SHEEN_ROUGHNESS_TEXTURE"); MATERIAL_IS_TRANSPARENT("IS_TRANSPARENT"); MATERIAL_IS_ALPHA_CUTOFF("IS_ALPHA_CUTOFF"); } diff --git a/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl b/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl index 92680b99..d62826af 100644 --- a/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl +++ b/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl @@ -56,6 +56,11 @@ struct SurfaceData{ float iridescenceThickness; #endif + #ifdef MATERIAL_ENABLE_SHEEN + float sheenRoughness; + vec3 sheenColor; + #endif + }; @@ -72,6 +77,13 @@ struct BRDFData{ #ifdef MATERIAL_ENABLE_IRIDESCENCE vec3 iridescenceSpecularColor; #endif + + #ifdef MATERIAL_ENABLE_SHEEN + float sheenRoughness; + float sheenScaling; + float sheenDFG; + #endif + }; @@ -305,6 +317,43 @@ vec3 BRDF_Diffuse_Lambert(vec3 diffuseColor) { } #endif +#ifdef MATERIAL_ENABLE_SHEEN + // http://www.aconty.com/pdf/s2017_pbs_imageworks_sheen.pdf + float D_Charlie(float roughness, float dotNH) { + float invAlpha = 1.0 / roughness; + float cos2h = dotNH * dotNH; + float sin2h = max(1.0 - cos2h, 0.0078125); // 2^(-14/2), so sin2h^2 > 0 in fp16 + return (2.0 + invAlpha) * pow(sin2h, invAlpha * 0.5) / (2.0 * PI); + } + + // Neubelt and Pettineo 2013, "Crafting a Next-gen Material Pipeline for The Order: 1886". + float V_Neubelt(float NoV, float NoL) { + return saturate(1.0 / (4.0 * (NoL + NoV - NoL * NoV))); + } + + vec3 BRDF_Sheen(vec3 incidentDirection, SurfaceData surfaceData, vec3 sheenColor, float sheenRoughness) { + vec3 halfDir = normalize(incidentDirection + surfaceData.viewDir); + float dotNL = saturate(dot(surfaceData.normal, incidentDirection)); + float dotNH = saturate(dot(surfaceData.normal, halfDir)); + float D = D_Charlie(sheenRoughness, dotNH); + float V = V_Neubelt(surfaceData.dotNV, dotNL); + vec3 F = sheenColor; + return D * V * F; + } + + // This is a curve-fit approxmation to the "Charlie sheen" BRDF integrated over the hemisphere from + // Estevez and Kulla 2017, "Production Friendly Microfacet Sheen BRDF". The analysis can be found + // in the Sheen section of https://drive.google.com/file/d/1T0D1VSyR4AllqIJTQAraEIzjlb5h4FKH/view?usp=sharing + float IBLSheenBRDF(SurfaceData surfaceData, float roughness) { + float dotNV = surfaceData.dotNV; + float r2 = roughness * roughness; + float a = roughness < 0.25 ? -339.2 * r2 + 161.4 * roughness - 25.9 : -8.48 * r2 + 14.3 * roughness - 9.95; + float b = roughness < 0.25 ? 44.0 * r2 - 23.7 * roughness + 3.26 : 1.97 * r2 - 3.27 * roughness + 0.72; + float DG = exp( a * dotNV + b ) + ( roughness < 0.25 ? 0.0 : 0.1 * ( roughness - 0.25 ) ); + return saturate( DG * RECIPROCAL_PI ); + } +#endif + void initBRDFData(SurfaceData surfaceData, out BRDFData brdfData){ vec3 albedoColor = surfaceData.albedoColor; vec3 specularColor = surfaceData.specularColor; @@ -332,6 +381,14 @@ void initBRDFData(SurfaceData surfaceData, out BRDFData brdfData){ float topIOR = 1.0; brdfData.iridescenceSpecularColor = evalIridescenceSpecular(topIOR, surfaceData.dotNV, surfaceData.iridesceceIOR, brdfData.specularColor, surfaceData.iridescenceThickness); #endif + + #ifdef MATERIAL_ENABLE_SHEEN + brdfData.sheenRoughness = max(MIN_PERCEPTUAL_ROUGHNESS, min(surfaceData.sheenRoughness + getAARoughnessFactor(surfaceData.normal), 1.0)); + brdfData.sheenDFG = IBLSheenBRDF(surfaceData, brdfData.sheenRoughness); + // sheen energy compensation approximation calculation in ‘Sheen DFG LUT integrated over diffuse IBL’ + // https://drive.google.com/file/d/1T0D1VSyR4AllqIJTQAraEIzjlb5h4FKH/view?usp=sharing + brdfData.sheenScaling = 1.0 - 0.157 * max(max(surfaceData.sheenColor.r, surfaceData.sheenColor.g), surfaceData.sheenColor.b); + #endif } #endif \ No newline at end of file diff --git a/packages/shaderlab/src/shaders/shadingPBR/FragmentPBR.glsl b/packages/shaderlab/src/shaders/shadingPBR/FragmentPBR.glsl index 22c1b34e..535ff938 100644 --- a/packages/shaderlab/src/shaders/shadingPBR/FragmentPBR.glsl +++ b/packages/shaderlab/src/shaders/shadingPBR/FragmentPBR.glsl @@ -50,6 +50,19 @@ float material_OcclusionTextureCoord; #endif #endif +#ifdef MATERIAL_ENABLE_SHEEN + float material_Sheen; + float material_SheenRoughness; + vec3 material_SheenColor; + #ifdef MATERIAL_HAS_SHEEN_TEXTURE + sampler2D material_SheenTexture; + #endif + + #ifdef MATERIAL_HAS_SHEEN_ROUGHNESS_TEXTURE + sampler2D material_SheenRoughnessTexture; + #endif +#endif + // Texture #ifdef MATERIAL_HAS_BASETEXTURE sampler2D material_BaseTexture; @@ -263,6 +276,25 @@ SurfaceData getSurfaceData(Varyings v, vec2 aoUV, bool isFrontFacing){ #endif #endif + #ifdef MATERIAL_ENABLE_SHEEN + vec3 sheencolor = material_SheenColor * material_Sheen; + #ifdef MATERIAL_HAS_SHEEN_TEXTURE + vec4 sheenTexturecolor = texture2D(material_SheenTexture, uv); + #ifndef ENGINE_IS_COLORSPACE_GAMMA + sheenTexturecolor = gammaToLinear(sheenTexturecolor); + #endif + sheencolor *= sheenTexturecolor.rgb; + #endif + surfaceData.sheenColor = sheencolor; + + float sheenRoughness = clamp(material_SheenRoughness, 0.01, 1.0); + #ifdef MATERIAL_HAS_SHEEN_ROUGHNESS_TEXTURE + vec4 sheenRoughnessTexture = (texture2D(material_SheenRoughnessTexture, uv)); + sheenRoughness *= sheenRoughnessTexture.a; + #endif + surfaceData.sheenRoughness = sheenRoughness; + #endif + // AO float diffuseAO = 1.0; float specularAO = 1.0; diff --git a/packages/shaderlab/src/shaders/shadingPBR/LightIndirectPBR.glsl b/packages/shaderlab/src/shaders/shadingPBR/LightIndirectPBR.glsl index 7a48795a..a60018ed 100644 --- a/packages/shaderlab/src/shaders/shadingPBR/LightIndirectPBR.glsl +++ b/packages/shaderlab/src/shaders/shadingPBR/LightIndirectPBR.glsl @@ -50,6 +50,10 @@ void evaluateDiffuseIBL(Varyings varyings, SurfaceData surfaceData, BRDFData brd irradiance *= PI; #endif + #ifdef MATERIAL_ENABLE_SHEEN + diffuseColor *= brdfData.sheenScaling; + #endif + diffuseColor += surfaceData.diffuseAO * irradiance * BRDF_Diffuse_Lambert( brdfData.diffuseColor ); } @@ -74,7 +78,14 @@ void evaluateSpecularIBL(Varyings varyings, SurfaceData surfaceData, BRDFData br vec3 speculaColor = brdfData.specularColor; #endif - outSpecularColor += surfaceData.specularAO * radianceAttenuation * radiance * envBRDFApprox(speculaColor, brdfData.roughness, surfaceData.dotNV); + #ifdef MATERIAL_ENABLE_SHEEN + outSpecularColor *= brdfData.sheenScaling; + vec3 environmentBRDF = brdfData.sheenDFG * surfaceData.sheenColor; + #else + vec3 environmentBRDF = envBRDFApprox(speculaColor, brdfData.roughness, surfaceData.dotNV); + #endif + + outSpecularColor += surfaceData.specularAO * radianceAttenuation * radiance * environmentBRDF; } diff --git a/packages/shaderlab/src/shaders/shadingPBR/ReflectionLobe.glsl b/packages/shaderlab/src/shaders/shadingPBR/ReflectionLobe.glsl index ee2ab891..3e4feb1e 100644 --- a/packages/shaderlab/src/shaders/shadingPBR/ReflectionLobe.glsl +++ b/packages/shaderlab/src/shaders/shadingPBR/ReflectionLobe.glsl @@ -2,11 +2,20 @@ #define REFLECTION_LOBE_INCLUDED void diffuseLobe(Varyings varyings, SurfaceData surfaceData, BRDFData brdfData, vec3 attenuationIrradiance, inout vec3 diffuseColor){ + #ifdef MATERIAL_ENABLE_SHEEN + diffuseColor *= brdfData.sheenScaling; + #endif diffuseColor += attenuationIrradiance * BRDF_Diffuse_Lambert( brdfData.diffuseColor ); } void specularLobe(Varyings varyings, SurfaceData surfaceData, BRDFData brdfData, vec3 incidentDirection, vec3 attenuationIrradiance, inout vec3 specularColor){ - specularColor += attenuationIrradiance * BRDF_Specular_GGX( incidentDirection, surfaceData, brdfData, surfaceData.normal, brdfData.specularColor, brdfData.roughness); + #ifdef MATERIAL_ENABLE_SHEEN + specularColor *= brdfData.sheenScaling; + vec3 BRDF_sheen = BRDF_Sheen(incidentDirection, surfaceData, surfaceData.sheenColor, brdfData.sheenRoughness); + specularColor += attenuationIrradiance * BRDF_sheen; + #else + specularColor += attenuationIrradiance * BRDF_Specular_GGX( incidentDirection, surfaceData, brdfData, surfaceData.normal, brdfData.specularColor, brdfData.roughness); + #endif } float clearCoatLobe(Varyings varyings, SurfaceData surfaceData, BRDFData brdfData, vec3 incidentDirection, vec3 color, inout vec3 specularColor){ @@ -16,7 +25,7 @@ float clearCoatLobe(Varyings varyings, SurfaceData surfaceData, BRDFData brdfDat float clearCoatDotNL = saturate( dot( surfaceData.clearCoatNormal, incidentDirection ) ); vec3 clearCoatIrradiance = clearCoatDotNL * color; - specularColor += surfaceData.clearCoat * clearCoatIrradiance * BRDF_Specular_GGX( incidentDirection, surfaceData, surfaceData.clearCoatNormal, brdfData.clearCoatSpecularColor, brdfData.clearCoatRoughness ); + specularColor += surfaceData.clearCoat * clearCoatIrradiance * BRDF_Specular_GGX( incidentDirection, surfaceData, brdfData, surfaceData.clearCoatNormal, brdfData.clearCoatSpecularColor, brdfData.clearCoatRoughness ); attenuation -= surfaceData.clearCoat * F_Schlick(0.04, surfaceData.clearCoatDotNV); #endif From f550f37c87ec323e4cbe5f0fd1dd33bca39e5491 Mon Sep 17 00:00:00 2001 From: hhhhkrx Date: Tue, 10 Dec 2024 20:26:49 +0800 Subject: [PATCH 17/37] fix: sheen layer --- packages/shaderlab/src/shaders/PBR.gs | 4 +-- .../src/shaders/shadingPBR/BRDF.glsl | 22 +++----------- .../src/shaders/shadingPBR/FragmentPBR.glsl | 13 ++++---- .../shaders/shadingPBR/LightDirectPBR.glsl | 5 ++++ .../shaders/shadingPBR/LightIndirectPBR.glsl | 30 +++++++++++-------- .../src/shaders/shadingPBR/LightProbe.glsl | 12 ++++++++ .../shaders/shadingPBR/ReflectionLobe.glsl | 16 +++++----- 7 files changed, 54 insertions(+), 48 deletions(-) diff --git a/packages/shaderlab/src/shaders/PBR.gs b/packages/shaderlab/src/shaders/PBR.gs index a934ef31..3975a4eb 100644 --- a/packages/shaderlab/src/shaders/PBR.gs +++ b/packages/shaderlab/src/shaders/PBR.gs @@ -48,8 +48,8 @@ Shader "PBR.gs" { } Header("Sheen"){ - material_Sheen("Sheen", Range(0, 1, 0.01)) = 0; - material_SheenColor("SheenColor", Color ) = (0, 0, 0, 1); + material_Sheen("SheenIntensity", Range(0, 1, 0.01)) = 0; + material_SheenColor("SheenColor", Color ) = (0, 0, 0, 0); material_SheenRoughness("SheenRoughness", Range(0, 1, 0.01)) = 0; material_SheenTexture("SheenTexture", Texture2D); material_SheenRoughnessTexture("SheenRoughnessTexture", Texture2D); diff --git a/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl b/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl index d62826af..52e6a0cf 100644 --- a/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl +++ b/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl @@ -80,8 +80,7 @@ struct BRDFData{ #ifdef MATERIAL_ENABLE_SHEEN float sheenRoughness; - float sheenScaling; - float sheenDFG; + float sheenEnergy; #endif }; @@ -331,27 +330,15 @@ vec3 BRDF_Diffuse_Lambert(vec3 diffuseColor) { return saturate(1.0 / (4.0 * (NoL + NoV - NoL * NoV))); } - vec3 BRDF_Sheen(vec3 incidentDirection, SurfaceData surfaceData, vec3 sheenColor, float sheenRoughness) { + vec3 sheenBRDF(vec3 incidentDirection, SurfaceData surfaceData, vec3 sheenColor, float sheenRoughness) { vec3 halfDir = normalize(incidentDirection + surfaceData.viewDir); float dotNL = saturate(dot(surfaceData.normal, incidentDirection)); float dotNH = saturate(dot(surfaceData.normal, halfDir)); float D = D_Charlie(sheenRoughness, dotNH); float V = V_Neubelt(surfaceData.dotNV, dotNL); - vec3 F = sheenColor; + vec3 F = sheenColor.rgb; return D * V * F; } - - // This is a curve-fit approxmation to the "Charlie sheen" BRDF integrated over the hemisphere from - // Estevez and Kulla 2017, "Production Friendly Microfacet Sheen BRDF". The analysis can be found - // in the Sheen section of https://drive.google.com/file/d/1T0D1VSyR4AllqIJTQAraEIzjlb5h4FKH/view?usp=sharing - float IBLSheenBRDF(SurfaceData surfaceData, float roughness) { - float dotNV = surfaceData.dotNV; - float r2 = roughness * roughness; - float a = roughness < 0.25 ? -339.2 * r2 + 161.4 * roughness - 25.9 : -8.48 * r2 + 14.3 * roughness - 9.95; - float b = roughness < 0.25 ? 44.0 * r2 - 23.7 * roughness + 3.26 : 1.97 * r2 - 3.27 * roughness + 0.72; - float DG = exp( a * dotNV + b ) + ( roughness < 0.25 ? 0.0 : 0.1 * ( roughness - 0.25 ) ); - return saturate( DG * RECIPROCAL_PI ); - } #endif void initBRDFData(SurfaceData surfaceData, out BRDFData brdfData){ @@ -384,10 +371,9 @@ void initBRDFData(SurfaceData surfaceData, out BRDFData brdfData){ #ifdef MATERIAL_ENABLE_SHEEN brdfData.sheenRoughness = max(MIN_PERCEPTUAL_ROUGHNESS, min(surfaceData.sheenRoughness + getAARoughnessFactor(surfaceData.normal), 1.0)); - brdfData.sheenDFG = IBLSheenBRDF(surfaceData, brdfData.sheenRoughness); // sheen energy compensation approximation calculation in ‘Sheen DFG LUT integrated over diffuse IBL’ // https://drive.google.com/file/d/1T0D1VSyR4AllqIJTQAraEIzjlb5h4FKH/view?usp=sharing - brdfData.sheenScaling = 1.0 - 0.157 * max(max(surfaceData.sheenColor.r, surfaceData.sheenColor.g), surfaceData.sheenColor.b); + brdfData.sheenEnergy = 1.0 - 0.157 * max(max(surfaceData.sheenColor.r, surfaceData.sheenColor.g), surfaceData.sheenColor.b); #endif } diff --git a/packages/shaderlab/src/shaders/shadingPBR/FragmentPBR.glsl b/packages/shaderlab/src/shaders/shadingPBR/FragmentPBR.glsl index 535ff938..46637ee4 100644 --- a/packages/shaderlab/src/shaders/shadingPBR/FragmentPBR.glsl +++ b/packages/shaderlab/src/shaders/shadingPBR/FragmentPBR.glsl @@ -51,9 +51,8 @@ float material_OcclusionTextureCoord; #endif #ifdef MATERIAL_ENABLE_SHEEN - float material_Sheen; float material_SheenRoughness; - vec3 material_SheenColor; + vec4 material_SheenColor; #ifdef MATERIAL_HAS_SHEEN_TEXTURE sampler2D material_SheenTexture; #endif @@ -277,7 +276,8 @@ SurfaceData getSurfaceData(Varyings v, vec2 aoUV, bool isFrontFacing){ #endif #ifdef MATERIAL_ENABLE_SHEEN - vec3 sheencolor = material_SheenColor * material_Sheen; + float sheen = material_SheenColor.a; + vec3 sheencolor = material_SheenColor.rgb * sheen; #ifdef MATERIAL_HAS_SHEEN_TEXTURE vec4 sheenTexturecolor = texture2D(material_SheenTexture, uv); #ifndef ENGINE_IS_COLORSPACE_GAMMA @@ -287,12 +287,11 @@ SurfaceData getSurfaceData(Varyings v, vec2 aoUV, bool isFrontFacing){ #endif surfaceData.sheenColor = sheencolor; - float sheenRoughness = clamp(material_SheenRoughness, 0.01, 1.0); + surfaceData.sheenRoughness = material_SheenRoughness; #ifdef MATERIAL_HAS_SHEEN_ROUGHNESS_TEXTURE - vec4 sheenRoughnessTexture = (texture2D(material_SheenRoughnessTexture, uv)); - sheenRoughness *= sheenRoughnessTexture.a; + vec4 sheenRoughnessTexture = texture2D(material_SheenRoughnessTexture, uv); + surfaceData.sheenRoughness *= sheenRoughnessTexture.a; #endif - surfaceData.sheenRoughness = sheenRoughness; #endif // AO diff --git a/packages/shaderlab/src/shaders/shadingPBR/LightDirectPBR.glsl b/packages/shaderlab/src/shaders/shadingPBR/LightDirectPBR.glsl index 1da64831..2ffe3ec4 100644 --- a/packages/shaderlab/src/shaders/shadingPBR/LightDirectPBR.glsl +++ b/packages/shaderlab/src/shaders/shadingPBR/LightDirectPBR.glsl @@ -14,6 +14,9 @@ #ifndef FUNCTION_CLEAR_COAT_LOBE #define FUNCTION_CLEAR_COAT_LOBE clearCoatLobe #endif +#ifndef FUNCTION_SHEEN_LOBE + #define FUNCTION_SHEEN_LOBE SheenLobe +#endif #include "BRDF.glsl" #include "Light.glsl" @@ -34,6 +37,8 @@ void surfaceShading(Varyings varyings, SurfaceData surfaceData, BRDFData brdfDat FUNCTION_DIFFUSE_LOBE(varyings, surfaceData, brdfData, attenuationIrradiance, diffuseColor); // Specular Lobe FUNCTION_SPECULAR_LOBE(varyings, surfaceData, brdfData, incidentDirection, attenuationIrradiance, specularColor); + // Sheen Lobe + FUNCTION_SHEEN_LOBE(varyings, surfaceData, brdfData, incidentDirection, diffuseColor, specularColor); color += diffuseColor + specularColor; diff --git a/packages/shaderlab/src/shaders/shadingPBR/LightIndirectPBR.glsl b/packages/shaderlab/src/shaders/shadingPBR/LightIndirectPBR.glsl index a60018ed..2a16ca39 100644 --- a/packages/shaderlab/src/shaders/shadingPBR/LightIndirectPBR.glsl +++ b/packages/shaderlab/src/shaders/shadingPBR/LightIndirectPBR.glsl @@ -11,7 +11,9 @@ #ifndef FUNCTION_CLEAR_COAT_IBL #define FUNCTION_CLEAR_COAT_IBL evaluateClearCoatIBL #endif - +#ifndef FUNCTION_SHEEN_IBL + #define FUNCTION_SHEEN_IBL evaluateSheenIBL +#endif #include "BRDF.glsl" #include "Light.glsl" #include "LightProbe.glsl" @@ -50,10 +52,6 @@ void evaluateDiffuseIBL(Varyings varyings, SurfaceData surfaceData, BRDFData brd irradiance *= PI; #endif - #ifdef MATERIAL_ENABLE_SHEEN - diffuseColor *= brdfData.sheenScaling; - #endif - diffuseColor += surfaceData.diffuseAO * irradiance * BRDF_Diffuse_Lambert( brdfData.diffuseColor ); } @@ -78,17 +76,19 @@ void evaluateSpecularIBL(Varyings varyings, SurfaceData surfaceData, BRDFData br vec3 speculaColor = brdfData.specularColor; #endif + outSpecularColor += surfaceData.specularAO * radianceAttenuation * radiance * envBRDFApprox(speculaColor, brdfData.roughness, surfaceData.dotNV); +} + +void evaluateSheenIBL(Varyings varyings, SurfaceData surfaceData, BRDFData brdfData, inout vec3 diffuseColor, inout vec3 SpecularColor){ #ifdef MATERIAL_ENABLE_SHEEN - outSpecularColor *= brdfData.sheenScaling; - vec3 environmentBRDF = brdfData.sheenDFG * surfaceData.sheenColor; - #else - vec3 environmentBRDF = envBRDFApprox(speculaColor, brdfData.roughness, surfaceData.dotNV); + diffuseColor *= brdfData.sheenEnergy; + SpecularColor *= brdfData.sheenEnergy; + + vec3 reflectance = IBLSheenDFG(surfaceData, brdfData.sheenRoughness) * surfaceData.sheenColor; + SpecularColor += reflectance; #endif - - outSpecularColor += surfaceData.specularAO * radianceAttenuation * radiance * environmentBRDF; } - void evaluateIBL(Varyings varyings, SurfaceData surfaceData, BRDFData brdfData, inout vec3 color){ vec3 diffuseColor = vec3(0); vec3 specularColor = vec3(0); @@ -101,8 +101,12 @@ void evaluateIBL(Varyings varyings, SurfaceData surfaceData, BRDFData brdfData, // IBL specular FUNCTION_SPECULAR_IBL(varyings, surfaceData, brdfData, radianceAttenuation, specularColor); - + + // IBL sheen + FUNCTION_SHEEN_IBL(varyings, surfaceData, brdfData, diffuseColor, specularColor); + color += diffuseColor + specularColor; + } diff --git a/packages/shaderlab/src/shaders/shadingPBR/LightProbe.glsl b/packages/shaderlab/src/shaders/shadingPBR/LightProbe.glsl index f45ece00..ab8efc5a 100644 --- a/packages/shaderlab/src/shaders/shadingPBR/LightProbe.glsl +++ b/packages/shaderlab/src/shaders/shadingPBR/LightProbe.glsl @@ -68,4 +68,16 @@ vec3 getLightProbeRadiance(SurfaceData surfaceData, vec3 normal, float roughness #endif } +// This is a curve-fit approxmation to the "Charlie sheen" BRDF integrated over the hemisphere from +// Estevez and Kulla 2017, "Production Friendly Microfacet Sheen BRDF". The analysis can be found +// in the Sheen section of https://drive.google.com/file/d/1T0D1VSyR4AllqIJTQAraEIzjlb5h4FKH/view?usp=sharing +float IBLSheenDFG(SurfaceData surfaceData, float roughness) { + float dotNV = surfaceData.dotNV; + float r2 = roughness * roughness; + float a = roughness < 0.25 ? -339.2 * r2 + 161.4 * roughness - 25.9 : -8.48 * r2 + 14.3 * roughness - 9.95; + float b = roughness < 0.25 ? 44.0 * r2 - 23.7 * roughness + 3.26 : 1.97 * r2 - 3.27 * roughness + 0.72; + float DG = exp( a * dotNV + b ) + ( roughness < 0.25 ? 0.0 : 0.1 * ( roughness - 0.25 ) ); + return saturate( DG * RECIPROCAL_PI ); +} + #endif \ No newline at end of file diff --git a/packages/shaderlab/src/shaders/shadingPBR/ReflectionLobe.glsl b/packages/shaderlab/src/shaders/shadingPBR/ReflectionLobe.glsl index 3e4feb1e..00dc4e37 100644 --- a/packages/shaderlab/src/shaders/shadingPBR/ReflectionLobe.glsl +++ b/packages/shaderlab/src/shaders/shadingPBR/ReflectionLobe.glsl @@ -2,19 +2,19 @@ #define REFLECTION_LOBE_INCLUDED void diffuseLobe(Varyings varyings, SurfaceData surfaceData, BRDFData brdfData, vec3 attenuationIrradiance, inout vec3 diffuseColor){ - #ifdef MATERIAL_ENABLE_SHEEN - diffuseColor *= brdfData.sheenScaling; - #endif diffuseColor += attenuationIrradiance * BRDF_Diffuse_Lambert( brdfData.diffuseColor ); } void specularLobe(Varyings varyings, SurfaceData surfaceData, BRDFData brdfData, vec3 incidentDirection, vec3 attenuationIrradiance, inout vec3 specularColor){ - #ifdef MATERIAL_ENABLE_SHEEN - specularColor *= brdfData.sheenScaling; - vec3 BRDF_sheen = BRDF_Sheen(incidentDirection, surfaceData, surfaceData.sheenColor, brdfData.sheenRoughness); - specularColor += attenuationIrradiance * BRDF_sheen; - #else specularColor += attenuationIrradiance * BRDF_Specular_GGX( incidentDirection, surfaceData, brdfData, surfaceData.normal, brdfData.specularColor, brdfData.roughness); +} + +void SheenLobe(Varyings varyings, SurfaceData surfaceData, BRDFData brdfData, vec3 incidentDirection, inout vec3 diffuseColor, inout vec3 specularColor){ + #ifdef MATERIAL_ENABLE_SHEEN + diffuseColor *= brdfData.sheenEnergy; + diffuseColor += sheenBRDF(incidentDirection, surfaceData, surfaceData.sheenColor, brdfData.sheenRoughness); + specularColor *= brdfData.sheenEnergy; + specularColor += sheenBRDF(incidentDirection, surfaceData, surfaceData.sheenColor, brdfData.sheenRoughness); #endif } From 1e7603362a4a0cf0eae0b31a4de6c92da4052083 Mon Sep 17 00:00:00 2001 From: hhhhkrx Date: Wed, 11 Dec 2024 15:01:32 +0800 Subject: [PATCH 18/37] fix: shader name --- packages/shaderlab/src/shaders/PBR.gs | 10 +++++----- .../src/shaders/shadingPBR/FragmentPBR.glsl | 13 ++++++------- 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/packages/shaderlab/src/shaders/PBR.gs b/packages/shaderlab/src/shaders/PBR.gs index 3975a4eb..112451fc 100644 --- a/packages/shaderlab/src/shaders/PBR.gs +++ b/packages/shaderlab/src/shaders/PBR.gs @@ -48,11 +48,11 @@ Shader "PBR.gs" { } Header("Sheen"){ - material_Sheen("SheenIntensity", Range(0, 1, 0.01)) = 0; - material_SheenColor("SheenColor", Color ) = (0, 0, 0, 0); - material_SheenRoughness("SheenRoughness", Range(0, 1, 0.01)) = 0; - material_SheenTexture("SheenTexture", Texture2D); - material_SheenRoughnessTexture("SheenRoughnessTexture", Texture2D); + UI_SheenIntensity("Intensity", Range(0, 1, 0.01)) = 0; + UI_SheenColor("Color", Color ) = (0, 0, 0, 0); + material_SheenRoughness("Roughness", Range(0, 1, 0.01)) = 0; + material_SheenTexture("ColorTexture", Texture2D); + material_SheenRoughnessTexture("RoughnessTexture", Texture2D); } Header("Common") { diff --git a/packages/shaderlab/src/shaders/shadingPBR/FragmentPBR.glsl b/packages/shaderlab/src/shaders/shadingPBR/FragmentPBR.glsl index 46637ee4..4c3786f8 100644 --- a/packages/shaderlab/src/shaders/shadingPBR/FragmentPBR.glsl +++ b/packages/shaderlab/src/shaders/shadingPBR/FragmentPBR.glsl @@ -52,7 +52,7 @@ float material_OcclusionTextureCoord; #ifdef MATERIAL_ENABLE_SHEEN float material_SheenRoughness; - vec4 material_SheenColor; + vec3 material_SheenColor; #ifdef MATERIAL_HAS_SHEEN_TEXTURE sampler2D material_SheenTexture; #endif @@ -276,16 +276,15 @@ SurfaceData getSurfaceData(Varyings v, vec2 aoUV, bool isFrontFacing){ #endif #ifdef MATERIAL_ENABLE_SHEEN - float sheen = material_SheenColor.a; - vec3 sheencolor = material_SheenColor.rgb * sheen; + vec3 sheenColor = material_SheenColor.rgb; #ifdef MATERIAL_HAS_SHEEN_TEXTURE - vec4 sheenTexturecolor = texture2D(material_SheenTexture, uv); + vec4 sheenTextureColor = texture2D(material_SheenTexture, uv); #ifndef ENGINE_IS_COLORSPACE_GAMMA - sheenTexturecolor = gammaToLinear(sheenTexturecolor); + sheenTextureColor = gammaToLinear(sheenTextureColor); #endif - sheencolor *= sheenTexturecolor.rgb; + sheenColor *= sheenTextureColor.rgb; #endif - surfaceData.sheenColor = sheencolor; + surfaceData.sheenColor = sheenColor; surfaceData.sheenRoughness = material_SheenRoughness; #ifdef MATERIAL_HAS_SHEEN_ROUGHNESS_TEXTURE From 58131a76469fa4f9c0f689540112441c553f5430 Mon Sep 17 00:00:00 2001 From: hhhhkrx Date: Wed, 11 Dec 2024 16:51:00 +0800 Subject: [PATCH 19/37] fix: sheen --- .../thinfilm/IridescenceIndirectLight.glsl | 2 +- packages/shaderlab/src/shaders/PBR.gs | 26 +------------------ .../src/shaders/shadingPBR/BRDF.glsl | 6 +++-- .../src/shaders/shadingPBR/FragmentPBR.glsl | 5 ++-- .../shaders/shadingPBR/LightDirectPBR.glsl | 4 +-- ...Probe.glsl => LightIndirectFunctions.glsl} | 7 +++-- .../shaders/shadingPBR/LightIndirectPBR.glsl | 14 +++++----- .../shaders/shadingPBR/ReflectionLobe.glsl | 10 +++---- .../shaderlab/src/shaders/shadingPBR/index.ts | 4 +-- 9 files changed, 27 insertions(+), 51 deletions(-) rename packages/shaderlab/src/shaders/shadingPBR/{LightProbe.glsl => LightIndirectFunctions.glsl} (96%) diff --git a/packages/custom-material/src/advanced-shader/thinfilm/IridescenceIndirectLight.glsl b/packages/custom-material/src/advanced-shader/thinfilm/IridescenceIndirectLight.glsl index 34610ca9..919da1b4 100644 --- a/packages/custom-material/src/advanced-shader/thinfilm/IridescenceIndirectLight.glsl +++ b/packages/custom-material/src/advanced-shader/thinfilm/IridescenceIndirectLight.glsl @@ -1,7 +1,7 @@ #define FUNCTION_SPECULAR_IBL evaluateSpecularIBLIridescence #include "BRDF.glsl" #include "./IridescenceFunction.glsl" -#include "LightProbe.glsl" +#include "LightIndirectFunctions.glsl" void evaluateSpecularIBLIridescence(Varyings varyings, SurfaceData surfaceData, BRDFData brdfData, float radianceAttenuation, inout vec3 specularColor){ diff --git a/packages/shaderlab/src/shaders/PBR.gs b/packages/shaderlab/src/shaders/PBR.gs index 112451fc..0fc0267f 100644 --- a/packages/shaderlab/src/shaders/PBR.gs +++ b/packages/shaderlab/src/shaders/PBR.gs @@ -60,31 +60,7 @@ Shader "PBR.gs" { material_TilingOffset("TilingOffset", Vector4) = (1, 1, 0, 0); } } - - EditorMacros { - Header("Conditional Macors") { - MATERIAL_HAS_BASETEXTURE("HAS_BASETEXTURE"); - MATERIAL_HAS_ROUGHNESS_METALLIC_TEXTURE("HAS_ROUGHNESS_METALLIC_TEXTURE"); - MATERIAL_ENABLE_ANISOTROPY("ENABLE_ANISOTROPY"); - MATERIAL_HAS_ANISOTROPY_TEXTURE("HAS_ANISOTROPY_TEXTURE") - MATERIAL_HAS_NORMALTEXTURE("HAS_NORMALTEXTURE"); - MATERIAL_HAS_EMISSIVETEXTURE("HAS_EMISSIVETEXTURE"); - MATERIAL_HAS_OCCLUSION_TEXTURE("HAS_OCCLUSION_TEXTURE"); - MATERIAL_ENABLE_CLEAR_COAT("ENABLE_CLEAR_COAT"); - MATERIAL_HAS_CLEAR_COAT_TEXTURE("HAS_CLEAR_COAT_TEXTURE"); - MATERIAL_HAS_CLEAR_COAT_ROUGHNESS_TEXTURE("HAS_CLEAR_COAT_ROUGHNESS_TEXTURE"); - MATERIAL_HAS_CLEAR_COAT_NORMAL_TEXTURE("HAS_CLEAR_COAT_NORMAL_TEXTURE"); - MATERIAL_ENABLE_IRIDESCENCE("ENABLE_IRIDESCENCE"); - MATERIAL_HAS_IRIDESCENCE_THICKNESS_TEXTURE("HAS_IRIDESCENCE_THICKNESS_TEXTURE"); - MATERIAL_HAS_IRIDESCENCE_TEXTURE("HAS_IRIDESCENCE_TEXTURE"); - MATERIAL_ENABLE_SHEEN("ENABLE_SHEEN"); - MATERIAL_HAS_SHEEN_TEXTURE("HAS_SHEEN_TEXTURE"); - MATERIAL_HAS_SHEEN_ROUGHNESS_TEXTURE("HAS_SHEEN_ROUGHNESS_TEXTURE"); - MATERIAL_IS_TRANSPARENT("IS_TRANSPARENT"); - MATERIAL_IS_ALPHA_CUTOFF("IS_ALPHA_CUTOFF"); - } - } - + SubShader "Default" { UsePass "pbr/Default/ShadowCaster" diff --git a/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl b/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl index 52e6a0cf..6b3bac86 100644 --- a/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl +++ b/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl @@ -85,6 +85,7 @@ struct BRDFData{ }; +#include "LightIndirectFunctions.glsl" float getAARoughnessFactor(vec3 normal) { // Kaplanyan 2016, "Stable specular highlights" @@ -336,7 +337,7 @@ vec3 BRDF_Diffuse_Lambert(vec3 diffuseColor) { float dotNH = saturate(dot(surfaceData.normal, halfDir)); float D = D_Charlie(sheenRoughness, dotNH); float V = V_Neubelt(surfaceData.dotNV, dotNL); - vec3 F = sheenColor.rgb; + vec3 F = sheenColor; return D * V * F; } #endif @@ -373,7 +374,8 @@ void initBRDFData(SurfaceData surfaceData, out BRDFData brdfData){ brdfData.sheenRoughness = max(MIN_PERCEPTUAL_ROUGHNESS, min(surfaceData.sheenRoughness + getAARoughnessFactor(surfaceData.normal), 1.0)); // sheen energy compensation approximation calculation in ‘Sheen DFG LUT integrated over diffuse IBL’ // https://drive.google.com/file/d/1T0D1VSyR4AllqIJTQAraEIzjlb5h4FKH/view?usp=sharing - brdfData.sheenEnergy = 1.0 - 0.157 * max(max(surfaceData.sheenColor.r, surfaceData.sheenColor.g), surfaceData.sheenColor.b); + float IBLSheenDFG = IBLSheenDFG(surfaceData, brdfData.sheenRoughness); + brdfData.sheenScaling = 1.0 - IBLSheenDFG * max(max(surfaceData.sheenColor.r, surfaceData.sheenColor.g), surfaceData.sheenColor.b); #endif } diff --git a/packages/shaderlab/src/shaders/shadingPBR/FragmentPBR.glsl b/packages/shaderlab/src/shaders/shadingPBR/FragmentPBR.glsl index 4c3786f8..0ec9afe4 100644 --- a/packages/shaderlab/src/shaders/shadingPBR/FragmentPBR.glsl +++ b/packages/shaderlab/src/shaders/shadingPBR/FragmentPBR.glsl @@ -276,7 +276,7 @@ SurfaceData getSurfaceData(Varyings v, vec2 aoUV, bool isFrontFacing){ #endif #ifdef MATERIAL_ENABLE_SHEEN - vec3 sheenColor = material_SheenColor.rgb; + vec3 sheenColor = material_SheenColor; #ifdef MATERIAL_HAS_SHEEN_TEXTURE vec4 sheenTextureColor = texture2D(material_SheenTexture, uv); #ifndef ENGINE_IS_COLORSPACE_GAMMA @@ -288,8 +288,7 @@ SurfaceData getSurfaceData(Varyings v, vec2 aoUV, bool isFrontFacing){ surfaceData.sheenRoughness = material_SheenRoughness; #ifdef MATERIAL_HAS_SHEEN_ROUGHNESS_TEXTURE - vec4 sheenRoughnessTexture = texture2D(material_SheenRoughnessTexture, uv); - surfaceData.sheenRoughness *= sheenRoughnessTexture.a; + surfaceData.sheenRoughness *= texture2D(material_SheenRoughnessTexture, uv).a; #endif #endif diff --git a/packages/shaderlab/src/shaders/shadingPBR/LightDirectPBR.glsl b/packages/shaderlab/src/shaders/shadingPBR/LightDirectPBR.glsl index 2ffe3ec4..44a3d5f2 100644 --- a/packages/shaderlab/src/shaders/shadingPBR/LightDirectPBR.glsl +++ b/packages/shaderlab/src/shaders/shadingPBR/LightDirectPBR.glsl @@ -37,8 +37,8 @@ void surfaceShading(Varyings varyings, SurfaceData surfaceData, BRDFData brdfDat FUNCTION_DIFFUSE_LOBE(varyings, surfaceData, brdfData, attenuationIrradiance, diffuseColor); // Specular Lobe FUNCTION_SPECULAR_LOBE(varyings, surfaceData, brdfData, incidentDirection, attenuationIrradiance, specularColor); - // Sheen Lobe - FUNCTION_SHEEN_LOBE(varyings, surfaceData, brdfData, incidentDirection, diffuseColor, specularColor); + // Lobe + FUNCTION_SHEEN_LOBE(varyings, surfaceData, brdfData, incidentDirection, attenuationIrradiance, diffuseColor, specularColor); color += diffuseColor + specularColor; diff --git a/packages/shaderlab/src/shaders/shadingPBR/LightProbe.glsl b/packages/shaderlab/src/shaders/shadingPBR/LightIndirectFunctions.glsl similarity index 96% rename from packages/shaderlab/src/shaders/shadingPBR/LightProbe.glsl rename to packages/shaderlab/src/shaders/shadingPBR/LightIndirectFunctions.glsl index ab8efc5a..57b5ec33 100644 --- a/packages/shaderlab/src/shaders/shadingPBR/LightProbe.glsl +++ b/packages/shaderlab/src/shaders/shadingPBR/LightIndirectFunctions.glsl @@ -1,8 +1,7 @@ -#ifndef LIGHT_PROBE -#define LIGHT_PROBE - +#ifndef LIGHT_INDIRECT_FUNCTIONS_INCLUDED +#define LIGHT_INDIRECT_FUNCTIONS_INCLUDED +#include "Light.glsl" // ------------------------Specular------------------------ - // ref: https://www.unrealengine.com/blog/physically-based-shading-on-mobile - environmentBRDF for GGX on mobile vec3 envBRDFApprox(vec3 specularColor, float roughness, float dotNV ) { diff --git a/packages/shaderlab/src/shaders/shadingPBR/LightIndirectPBR.glsl b/packages/shaderlab/src/shaders/shadingPBR/LightIndirectPBR.glsl index 2a16ca39..f741b9b8 100644 --- a/packages/shaderlab/src/shaders/shadingPBR/LightIndirectPBR.glsl +++ b/packages/shaderlab/src/shaders/shadingPBR/LightIndirectPBR.glsl @@ -16,7 +16,7 @@ #endif #include "BRDF.glsl" #include "Light.glsl" -#include "LightProbe.glsl" +#include "LightIndirectFunctions.glsl" // ------------------------Diffuse------------------------ @@ -79,13 +79,13 @@ void evaluateSpecularIBL(Varyings varyings, SurfaceData surfaceData, BRDFData br outSpecularColor += surfaceData.specularAO * radianceAttenuation * radiance * envBRDFApprox(speculaColor, brdfData.roughness, surfaceData.dotNV); } -void evaluateSheenIBL(Varyings varyings, SurfaceData surfaceData, BRDFData brdfData, inout vec3 diffuseColor, inout vec3 SpecularColor){ +void evaluateSheenIBL(Varyings varyings, SurfaceData surfaceData, BRDFData brdfData, float radianceAttenuation, inout vec3 diffuseColor, inout vec3 specularColor){ #ifdef MATERIAL_ENABLE_SHEEN - diffuseColor *= brdfData.sheenEnergy; - SpecularColor *= brdfData.sheenEnergy; + diffuseColor *= brdfData.sheenScaling; + specularColor *= brdfData.sheenScaling; - vec3 reflectance = IBLSheenDFG(surfaceData, brdfData.sheenRoughness) * surfaceData.sheenColor; - SpecularColor += reflectance; + vec3 reflectance = radianceAttenuation * IBLSheenDFG(surfaceData, brdfData.sheenRoughness) * surfaceData.sheenColor; + specularColor += reflectance; #endif } @@ -103,7 +103,7 @@ void evaluateIBL(Varyings varyings, SurfaceData surfaceData, BRDFData brdfData, FUNCTION_SPECULAR_IBL(varyings, surfaceData, brdfData, radianceAttenuation, specularColor); // IBL sheen - FUNCTION_SHEEN_IBL(varyings, surfaceData, brdfData, diffuseColor, specularColor); + FUNCTION_SHEEN_IBL(varyings, surfaceData, brdfData, radianceAttenuation, diffuseColor, specularColor); color += diffuseColor + specularColor; diff --git a/packages/shaderlab/src/shaders/shadingPBR/ReflectionLobe.glsl b/packages/shaderlab/src/shaders/shadingPBR/ReflectionLobe.glsl index 00dc4e37..bddebdc2 100644 --- a/packages/shaderlab/src/shaders/shadingPBR/ReflectionLobe.glsl +++ b/packages/shaderlab/src/shaders/shadingPBR/ReflectionLobe.glsl @@ -9,12 +9,12 @@ void specularLobe(Varyings varyings, SurfaceData surfaceData, BRDFData brdfData, specularColor += attenuationIrradiance * BRDF_Specular_GGX( incidentDirection, surfaceData, brdfData, surfaceData.normal, brdfData.specularColor, brdfData.roughness); } -void SheenLobe(Varyings varyings, SurfaceData surfaceData, BRDFData brdfData, vec3 incidentDirection, inout vec3 diffuseColor, inout vec3 specularColor){ +void SheenLobe(Varyings varyings, SurfaceData surfaceData, BRDFData brdfData, vec3 incidentDirection, vec3 attenuationIrradiance, inout vec3 diffuseColor, inout vec3 specularColor){ #ifdef MATERIAL_ENABLE_SHEEN - diffuseColor *= brdfData.sheenEnergy; - diffuseColor += sheenBRDF(incidentDirection, surfaceData, surfaceData.sheenColor, brdfData.sheenRoughness); - specularColor *= brdfData.sheenEnergy; - specularColor += sheenBRDF(incidentDirection, surfaceData, surfaceData.sheenColor, brdfData.sheenRoughness); + diffuseColor *= brdfData.sheenScaling; + specularColor *= brdfData.sheenScaling; + + specularColor += attenuationIrradiance * sheenBRDF(incidentDirection, surfaceData, surfaceData.sheenColor, brdfData.sheenRoughness); #endif } diff --git a/packages/shaderlab/src/shaders/shadingPBR/index.ts b/packages/shaderlab/src/shaders/shadingPBR/index.ts index 2c6bf9c6..a1995f0b 100644 --- a/packages/shaderlab/src/shaders/shadingPBR/index.ts +++ b/packages/shaderlab/src/shaders/shadingPBR/index.ts @@ -1,6 +1,6 @@ import AttributesPBR from "./AttributesPBR.glsl"; import BRDF from "./BRDF.glsl"; -import LightProbe from "./LightProbe.glsl"; +import LightIndirectFunctions from "./LightIndirectFunctions.glsl"; import ForwardPassPBR from "./ForwardPassPBR.glsl"; import FragmentPBR from "./FragmentPBR.glsl"; import LightDirectPBR from "./LightDirectPBR.glsl"; @@ -18,6 +18,6 @@ export default [ { source: LightIndirectPBR, includeKey: "LightIndirectPBR.glsl" }, { source: VertexPBR, includeKey: "VertexPBR.glsl" }, { source: BRDF, includeKey: "BRDF.glsl" }, - { source: LightProbe, includeKey: "LightProbe.glsl" }, + { source: LightIndirectFunctions, includeKey: "LightIndirectFunctions.glsl" }, { source: ReflectionLobe, includeKey: "ReflectionLobe.glsl" } ]; From 727c19962f3a4a0a9f0778e1e723569161a7fcfe Mon Sep 17 00:00:00 2001 From: hhhhkrx Date: Wed, 11 Dec 2024 16:53:03 +0800 Subject: [PATCH 20/37] fix: sheen scaling name --- packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl b/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl index 6b3bac86..f64ba857 100644 --- a/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl +++ b/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl @@ -80,7 +80,7 @@ struct BRDFData{ #ifdef MATERIAL_ENABLE_SHEEN float sheenRoughness; - float sheenEnergy; + float sheenScaling; #endif }; From b9874f2a5bce2c0ec811b20287f1c2633951165e Mon Sep 17 00:00:00 2001 From: hhhhkrx Date: Wed, 11 Dec 2024 17:31:35 +0800 Subject: [PATCH 21/37] fix: sheen --- .../shaderlab/src/shaders/shadingPBR/LightIndirectPBR.glsl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/shaderlab/src/shaders/shadingPBR/LightIndirectPBR.glsl b/packages/shaderlab/src/shaders/shadingPBR/LightIndirectPBR.glsl index f741b9b8..83fe522c 100644 --- a/packages/shaderlab/src/shaders/shadingPBR/LightIndirectPBR.glsl +++ b/packages/shaderlab/src/shaders/shadingPBR/LightIndirectPBR.glsl @@ -84,8 +84,8 @@ void evaluateSheenIBL(Varyings varyings, SurfaceData surfaceData, BRDFData brdfD diffuseColor *= brdfData.sheenScaling; specularColor *= brdfData.sheenScaling; - vec3 reflectance = radianceAttenuation * IBLSheenDFG(surfaceData, brdfData.sheenRoughness) * surfaceData.sheenColor; - specularColor += reflectance; + vec3 reflectance = radianceAttenuation * IBLSheenDFG(surfaceData, brdfData.sheenRoughness) * surfaceData.sheenColor; + specularColor += reflectance; #endif } From a794dc65c83da48a205abfaba7d8affd505893ea Mon Sep 17 00:00:00 2001 From: hhhhkrx Date: Wed, 11 Dec 2024 17:38:01 +0800 Subject: [PATCH 22/37] fix: sheen --- packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl | 7 +++---- .../src/shaders/shadingPBR/LightDirectPBR.glsl | 2 +- .../src/shaders/shadingPBR/LightIndirectFunctions.glsl | 10 +++++----- .../src/shaders/shadingPBR/LightIndirectPBR.glsl | 2 +- .../src/shaders/shadingPBR/ReflectionLobe.glsl | 2 +- 5 files changed, 11 insertions(+), 12 deletions(-) diff --git a/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl b/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl index f64ba857..fb8303f5 100644 --- a/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl +++ b/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl @@ -81,6 +81,7 @@ struct BRDFData{ #ifdef MATERIAL_ENABLE_SHEEN float sheenRoughness; float sheenScaling; + float IBLsheenDFG; #endif }; @@ -372,10 +373,8 @@ void initBRDFData(SurfaceData surfaceData, out BRDFData brdfData){ #ifdef MATERIAL_ENABLE_SHEEN brdfData.sheenRoughness = max(MIN_PERCEPTUAL_ROUGHNESS, min(surfaceData.sheenRoughness + getAARoughnessFactor(surfaceData.normal), 1.0)); - // sheen energy compensation approximation calculation in ‘Sheen DFG LUT integrated over diffuse IBL’ - // https://drive.google.com/file/d/1T0D1VSyR4AllqIJTQAraEIzjlb5h4FKH/view?usp=sharing - float IBLSheenDFG = IBLSheenDFG(surfaceData, brdfData.sheenRoughness); - brdfData.sheenScaling = 1.0 - IBLSheenDFG * max(max(surfaceData.sheenColor.r, surfaceData.sheenColor.g), surfaceData.sheenColor.b); + brdfData.IBLsheenDFG = IBLSheenDFG(surfaceData, brdfData.sheenRoughness); + brdfData.sheenScaling = 1.0 - brdfData.IBLsheenDFG * max(max(surfaceData.sheenColor.r, surfaceData.sheenColor.g), surfaceData.sheenColor.b); #endif } diff --git a/packages/shaderlab/src/shaders/shadingPBR/LightDirectPBR.glsl b/packages/shaderlab/src/shaders/shadingPBR/LightDirectPBR.glsl index 44a3d5f2..98d7335a 100644 --- a/packages/shaderlab/src/shaders/shadingPBR/LightDirectPBR.glsl +++ b/packages/shaderlab/src/shaders/shadingPBR/LightDirectPBR.glsl @@ -15,7 +15,7 @@ #define FUNCTION_CLEAR_COAT_LOBE clearCoatLobe #endif #ifndef FUNCTION_SHEEN_LOBE - #define FUNCTION_SHEEN_LOBE SheenLobe + #define FUNCTION_SHEEN_LOBE sheenLobe #endif #include "BRDF.glsl" diff --git a/packages/shaderlab/src/shaders/shadingPBR/LightIndirectFunctions.glsl b/packages/shaderlab/src/shaders/shadingPBR/LightIndirectFunctions.glsl index 57b5ec33..2a636a98 100644 --- a/packages/shaderlab/src/shaders/shadingPBR/LightIndirectFunctions.glsl +++ b/packages/shaderlab/src/shaders/shadingPBR/LightIndirectFunctions.glsl @@ -70,12 +70,12 @@ vec3 getLightProbeRadiance(SurfaceData surfaceData, vec3 normal, float roughness // This is a curve-fit approxmation to the "Charlie sheen" BRDF integrated over the hemisphere from // Estevez and Kulla 2017, "Production Friendly Microfacet Sheen BRDF". The analysis can be found // in the Sheen section of https://drive.google.com/file/d/1T0D1VSyR4AllqIJTQAraEIzjlb5h4FKH/view?usp=sharing -float IBLSheenDFG(SurfaceData surfaceData, float roughness) { +float IBLSheenDFG(SurfaceData surfaceData, float sheenRoughness) { float dotNV = surfaceData.dotNV; - float r2 = roughness * roughness; - float a = roughness < 0.25 ? -339.2 * r2 + 161.4 * roughness - 25.9 : -8.48 * r2 + 14.3 * roughness - 9.95; - float b = roughness < 0.25 ? 44.0 * r2 - 23.7 * roughness + 3.26 : 1.97 * r2 - 3.27 * roughness + 0.72; - float DG = exp( a * dotNV + b ) + ( roughness < 0.25 ? 0.0 : 0.1 * ( roughness - 0.25 ) ); + float r2 = sheenRoughness * sheenRoughness; + float a = sheenRoughness < 0.25 ? -339.2 * r2 + 161.4 * sheenRoughness - 25.9 : -8.48 * r2 + 14.3 * sheenRoughness - 9.95; + float b = sheenRoughness < 0.25 ? 44.0 * r2 - 23.7 * sheenRoughness + 3.26 : 1.97 * r2 - 3.27 * sheenRoughness + 0.72; + float DG = exp( a * dotNV + b ) + ( sheenRoughness < 0.25 ? 0.0 : 0.1 * ( sheenRoughness - 0.25 ) ); return saturate( DG * RECIPROCAL_PI ); } diff --git a/packages/shaderlab/src/shaders/shadingPBR/LightIndirectPBR.glsl b/packages/shaderlab/src/shaders/shadingPBR/LightIndirectPBR.glsl index 83fe522c..8561411a 100644 --- a/packages/shaderlab/src/shaders/shadingPBR/LightIndirectPBR.glsl +++ b/packages/shaderlab/src/shaders/shadingPBR/LightIndirectPBR.glsl @@ -84,7 +84,7 @@ void evaluateSheenIBL(Varyings varyings, SurfaceData surfaceData, BRDFData brdfD diffuseColor *= brdfData.sheenScaling; specularColor *= brdfData.sheenScaling; - vec3 reflectance = radianceAttenuation * IBLSheenDFG(surfaceData, brdfData.sheenRoughness) * surfaceData.sheenColor; + vec3 reflectance = radianceAttenuation * brdfData.IBLsheenDFG * surfaceData.sheenColor; specularColor += reflectance; #endif } diff --git a/packages/shaderlab/src/shaders/shadingPBR/ReflectionLobe.glsl b/packages/shaderlab/src/shaders/shadingPBR/ReflectionLobe.glsl index bddebdc2..e13d6062 100644 --- a/packages/shaderlab/src/shaders/shadingPBR/ReflectionLobe.glsl +++ b/packages/shaderlab/src/shaders/shadingPBR/ReflectionLobe.glsl @@ -9,7 +9,7 @@ void specularLobe(Varyings varyings, SurfaceData surfaceData, BRDFData brdfData, specularColor += attenuationIrradiance * BRDF_Specular_GGX( incidentDirection, surfaceData, brdfData, surfaceData.normal, brdfData.specularColor, brdfData.roughness); } -void SheenLobe(Varyings varyings, SurfaceData surfaceData, BRDFData brdfData, vec3 incidentDirection, vec3 attenuationIrradiance, inout vec3 diffuseColor, inout vec3 specularColor){ +void sheenLobe(Varyings varyings, SurfaceData surfaceData, BRDFData brdfData, vec3 incidentDirection, vec3 attenuationIrradiance, inout vec3 diffuseColor, inout vec3 specularColor){ #ifdef MATERIAL_ENABLE_SHEEN diffuseColor *= brdfData.sheenScaling; specularColor *= brdfData.sheenScaling; From 65d1beeb394f38c2021b4c202895fce0f7a90554 Mon Sep 17 00:00:00 2001 From: hhhhkrx Date: Wed, 11 Dec 2024 17:44:54 +0800 Subject: [PATCH 23/37] fix: sheen lobe name --- packages/shaderlab/src/shaders/shadingPBR/LightDirectPBR.glsl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/shaderlab/src/shaders/shadingPBR/LightDirectPBR.glsl b/packages/shaderlab/src/shaders/shadingPBR/LightDirectPBR.glsl index 98d7335a..f8ad6e77 100644 --- a/packages/shaderlab/src/shaders/shadingPBR/LightDirectPBR.glsl +++ b/packages/shaderlab/src/shaders/shadingPBR/LightDirectPBR.glsl @@ -37,7 +37,7 @@ void surfaceShading(Varyings varyings, SurfaceData surfaceData, BRDFData brdfDat FUNCTION_DIFFUSE_LOBE(varyings, surfaceData, brdfData, attenuationIrradiance, diffuseColor); // Specular Lobe FUNCTION_SPECULAR_LOBE(varyings, surfaceData, brdfData, incidentDirection, attenuationIrradiance, specularColor); - // Lobe + // Sheen Lobe FUNCTION_SHEEN_LOBE(varyings, surfaceData, brdfData, incidentDirection, attenuationIrradiance, diffuseColor, specularColor); color += diffuseColor + specularColor; From f356d829ee84eadb46cfb1127d89a3e5bae84d7b Mon Sep 17 00:00:00 2001 From: hhhhkrx Date: Thu, 12 Dec 2024 15:57:22 +0800 Subject: [PATCH 24/37] fix: sheen --- .../shaderlab/src/shaders/shadingPBR/BRDF.glsl | 9 +++++---- .../shadingPBR/LightIndirectFunctions.glsl | 18 +++++++++--------- .../shaders/shadingPBR/LightIndirectPBR.glsl | 2 +- 3 files changed, 15 insertions(+), 14 deletions(-) diff --git a/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl b/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl index fb8303f5..6a2c6cf3 100644 --- a/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl +++ b/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl @@ -81,7 +81,7 @@ struct BRDFData{ #ifdef MATERIAL_ENABLE_SHEEN float sheenRoughness; float sheenScaling; - float IBLsheenDFG; + float iblSheenDFG; #endif }; @@ -372,9 +372,10 @@ void initBRDFData(SurfaceData surfaceData, out BRDFData brdfData){ #endif #ifdef MATERIAL_ENABLE_SHEEN - brdfData.sheenRoughness = max(MIN_PERCEPTUAL_ROUGHNESS, min(surfaceData.sheenRoughness + getAARoughnessFactor(surfaceData.normal), 1.0)); - brdfData.IBLsheenDFG = IBLSheenDFG(surfaceData, brdfData.sheenRoughness); - brdfData.sheenScaling = 1.0 - brdfData.IBLsheenDFG * max(max(surfaceData.sheenColor.r, surfaceData.sheenColor.g), surfaceData.sheenColor.b); + float sheenRoughness = max(MIN_PERCEPTUAL_ROUGHNESS, min(surfaceData.sheenRoughness + getAARoughnessFactor(surfaceData.normal), 1.0)); + brdfData.sheenRoughness = pow2(sheenRoughness); + brdfData.iblSheenDFG = iblSheenDFG(surfaceData, brdfData.sheenRoughness); + brdfData.sheenScaling = 1.0 - brdfData.iblSheenDFG * max(max(surfaceData.sheenColor.r, surfaceData.sheenColor.g), surfaceData.sheenColor.b); #endif } diff --git a/packages/shaderlab/src/shaders/shadingPBR/LightIndirectFunctions.glsl b/packages/shaderlab/src/shaders/shadingPBR/LightIndirectFunctions.glsl index 2a636a98..397d833a 100644 --- a/packages/shaderlab/src/shaders/shadingPBR/LightIndirectFunctions.glsl +++ b/packages/shaderlab/src/shaders/shadingPBR/LightIndirectFunctions.glsl @@ -70,13 +70,13 @@ vec3 getLightProbeRadiance(SurfaceData surfaceData, vec3 normal, float roughness // This is a curve-fit approxmation to the "Charlie sheen" BRDF integrated over the hemisphere from // Estevez and Kulla 2017, "Production Friendly Microfacet Sheen BRDF". The analysis can be found // in the Sheen section of https://drive.google.com/file/d/1T0D1VSyR4AllqIJTQAraEIzjlb5h4FKH/view?usp=sharing -float IBLSheenDFG(SurfaceData surfaceData, float sheenRoughness) { - float dotNV = surfaceData.dotNV; - float r2 = sheenRoughness * sheenRoughness; - float a = sheenRoughness < 0.25 ? -339.2 * r2 + 161.4 * sheenRoughness - 25.9 : -8.48 * r2 + 14.3 * sheenRoughness - 9.95; - float b = sheenRoughness < 0.25 ? 44.0 * r2 - 23.7 * sheenRoughness + 3.26 : 1.97 * r2 - 3.27 * sheenRoughness + 0.72; - float DG = exp( a * dotNV + b ) + ( sheenRoughness < 0.25 ? 0.0 : 0.1 * ( sheenRoughness - 0.25 ) ); - return saturate( DG * RECIPROCAL_PI ); -} - +#ifdef MATERIAL_ENABLE_SHEEN + float iblSheenDFG(SurfaceData surfaceData, float sheenRoughness) { + float dotNV = surfaceData.dotNV; + float a = sheenRoughness < 0.25 ? -339.2 * sheenRoughness + 161.4 * sheenRoughness - 25.9 : -8.48 * sheenRoughness + 14.3 * sheenRoughness - 9.95; + float b = sheenRoughness < 0.25 ? 44.0 * sheenRoughness - 23.7 * sheenRoughness + 3.26 : 1.97 * sheenRoughness - 3.27 * sheenRoughness + 0.72; + float DG = exp( a * dotNV + b ) + ( sheenRoughness < 0.25 ? 0.0 : 0.1 * ( sheenRoughness - 0.25 ) ); + return saturate( DG * RECIPROCAL_PI ); + } +#endif #endif \ No newline at end of file diff --git a/packages/shaderlab/src/shaders/shadingPBR/LightIndirectPBR.glsl b/packages/shaderlab/src/shaders/shadingPBR/LightIndirectPBR.glsl index 8561411a..34893f1d 100644 --- a/packages/shaderlab/src/shaders/shadingPBR/LightIndirectPBR.glsl +++ b/packages/shaderlab/src/shaders/shadingPBR/LightIndirectPBR.glsl @@ -84,7 +84,7 @@ void evaluateSheenIBL(Varyings varyings, SurfaceData surfaceData, BRDFData brdfD diffuseColor *= brdfData.sheenScaling; specularColor *= brdfData.sheenScaling; - vec3 reflectance = radianceAttenuation * brdfData.IBLsheenDFG * surfaceData.sheenColor; + vec3 reflectance = radianceAttenuation * brdfData.iblSheenDFG * surfaceData.sheenColor; specularColor += reflectance; #endif } From 8650e813176cebbb2ec68d5579a8781a462c0525 Mon Sep 17 00:00:00 2001 From: hhhhkrx Date: Thu, 12 Dec 2024 16:02:55 +0800 Subject: [PATCH 25/37] fix: indirect brdf --- .../src/shaders/shadingPBR/BRDF.glsl | 29 +++++++++++++++++ .../shadingPBR/LightIndirectFunctions.glsl | 31 ------------------- 2 files changed, 29 insertions(+), 31 deletions(-) diff --git a/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl b/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl index 6a2c6cf3..63f8e05c 100644 --- a/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl +++ b/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl @@ -341,8 +341,37 @@ vec3 BRDF_Diffuse_Lambert(vec3 diffuseColor) { vec3 F = sheenColor; return D * V * F; } + + // This is a curve-fit approxmation to the "Charlie sheen" BRDF integrated over the hemisphere from + // Estevez and Kulla 2017, "Production Friendly Microfacet Sheen BRDF". The analysis can be found + // in the Sheen section of https://drive.google.com/file/d/1T0D1VSyR4AllqIJTQAraEIzjlb5h4FKH/view?usp=sharing + float iblSheenDFG(SurfaceData surfaceData, float sheenRoughness) { + float dotNV = surfaceData.dotNV; + float a = sheenRoughness < 0.25 ? -339.2 * sheenRoughness + 161.4 * sheenRoughness - 25.9 : -8.48 * sheenRoughness + 14.3 * sheenRoughness - 9.95; + float b = sheenRoughness < 0.25 ? 44.0 * sheenRoughness - 23.7 * sheenRoughness + 3.26 : 1.97 * sheenRoughness - 3.27 * sheenRoughness + 0.72; + float DG = exp( a * dotNV + b ) + ( sheenRoughness < 0.25 ? 0.0 : 0.1 * ( sheenRoughness - 0.25 ) ); + return saturate( DG * RECIPROCAL_PI ); + } #endif +// ------------------------Indirect Specular------------------------ +// ref: https://www.unrealengine.com/blog/physically-based-shading-on-mobile - environmentBRDF for GGX on mobile +vec3 envBRDFApprox(vec3 specularColor, float roughness, float dotNV ) { + + const vec4 c0 = vec4( - 1, - 0.0275, - 0.572, 0.022 ); + + const vec4 c1 = vec4( 1, 0.0425, 1.04, - 0.04 ); + + vec4 r = roughness * c0 + c1; + + float a004 = min( r.x * r.x, exp2( - 9.28 * dotNV ) ) * r.x + r.y; + + vec2 AB = vec2( -1.04, 1.04 ) * a004 + r.zw; + + return specularColor * AB.x + AB.y; + +} + void initBRDFData(SurfaceData surfaceData, out BRDFData brdfData){ vec3 albedoColor = surfaceData.albedoColor; vec3 specularColor = surfaceData.specularColor; diff --git a/packages/shaderlab/src/shaders/shadingPBR/LightIndirectFunctions.glsl b/packages/shaderlab/src/shaders/shadingPBR/LightIndirectFunctions.glsl index 397d833a..a6588349 100644 --- a/packages/shaderlab/src/shaders/shadingPBR/LightIndirectFunctions.glsl +++ b/packages/shaderlab/src/shaders/shadingPBR/LightIndirectFunctions.glsl @@ -1,24 +1,6 @@ #ifndef LIGHT_INDIRECT_FUNCTIONS_INCLUDED #define LIGHT_INDIRECT_FUNCTIONS_INCLUDED #include "Light.glsl" -// ------------------------Specular------------------------ -// ref: https://www.unrealengine.com/blog/physically-based-shading-on-mobile - environmentBRDF for GGX on mobile -vec3 envBRDFApprox(vec3 specularColor, float roughness, float dotNV ) { - - const vec4 c0 = vec4( - 1, - 0.0275, - 0.572, 0.022 ); - - const vec4 c1 = vec4( 1, 0.0425, 1.04, - 0.04 ); - - vec4 r = roughness * c0 + c1; - - float a004 = min( r.x * r.x, exp2( - 9.28 * dotNV ) ) * r.x + r.y; - - vec2 AB = vec2( -1.04, 1.04 ) * a004 + r.zw; - - return specularColor * AB.x + AB.y; - -} - vec3 getReflectedVector(SurfaceData surfaceData, vec3 n) { #ifdef MATERIAL_ENABLE_ANISOTROPY @@ -66,17 +48,4 @@ vec3 getLightProbeRadiance(SurfaceData surfaceData, vec3 normal, float roughness #endif } - -// This is a curve-fit approxmation to the "Charlie sheen" BRDF integrated over the hemisphere from -// Estevez and Kulla 2017, "Production Friendly Microfacet Sheen BRDF". The analysis can be found -// in the Sheen section of https://drive.google.com/file/d/1T0D1VSyR4AllqIJTQAraEIzjlb5h4FKH/view?usp=sharing -#ifdef MATERIAL_ENABLE_SHEEN - float iblSheenDFG(SurfaceData surfaceData, float sheenRoughness) { - float dotNV = surfaceData.dotNV; - float a = sheenRoughness < 0.25 ? -339.2 * sheenRoughness + 161.4 * sheenRoughness - 25.9 : -8.48 * sheenRoughness + 14.3 * sheenRoughness - 9.95; - float b = sheenRoughness < 0.25 ? 44.0 * sheenRoughness - 23.7 * sheenRoughness + 3.26 : 1.97 * sheenRoughness - 3.27 * sheenRoughness + 0.72; - float DG = exp( a * dotNV + b ) + ( sheenRoughness < 0.25 ? 0.0 : 0.1 * ( sheenRoughness - 0.25 ) ); - return saturate( DG * RECIPROCAL_PI ); - } -#endif #endif \ No newline at end of file From 17ccc8e0ce3999f41cc8554ce52027347175a881 Mon Sep 17 00:00:00 2001 From: hhhhkrx Date: Thu, 12 Dec 2024 16:12:48 +0800 Subject: [PATCH 26/37] fix: sheen --- packages/shaderlab/src/shaders/PBR.gs | 4 ++-- packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl | 6 +++--- .../shaderlab/src/shaders/shadingPBR/ReflectionLobe.glsl | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/shaderlab/src/shaders/PBR.gs b/packages/shaderlab/src/shaders/PBR.gs index 0fc0267f..8bea8bb2 100644 --- a/packages/shaderlab/src/shaders/PBR.gs +++ b/packages/shaderlab/src/shaders/PBR.gs @@ -48,8 +48,8 @@ Shader "PBR.gs" { } Header("Sheen"){ - UI_SheenIntensity("Intensity", Range(0, 1, 0.01)) = 0; - UI_SheenColor("Color", Color ) = (0, 0, 0, 0); + ui_SheenIntensity("Intensity", Range(0, 1, 0.01)) = 0; + ui_SheenColor("Color", Color ) = (0, 0, 0, 0); material_SheenRoughness("Roughness", Range(0, 1, 0.01)) = 0; material_SheenTexture("ColorTexture", Texture2D); material_SheenRoughnessTexture("RoughnessTexture", Texture2D); diff --git a/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl b/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl index 63f8e05c..20d9605d 100644 --- a/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl +++ b/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl @@ -79,7 +79,7 @@ struct BRDFData{ #endif #ifdef MATERIAL_ENABLE_SHEEN - float sheenRoughness; + float sheenPerceptualRoughness; float sheenScaling; float iblSheenDFG; #endif @@ -402,8 +402,8 @@ void initBRDFData(SurfaceData surfaceData, out BRDFData brdfData){ #ifdef MATERIAL_ENABLE_SHEEN float sheenRoughness = max(MIN_PERCEPTUAL_ROUGHNESS, min(surfaceData.sheenRoughness + getAARoughnessFactor(surfaceData.normal), 1.0)); - brdfData.sheenRoughness = pow2(sheenRoughness); - brdfData.iblSheenDFG = iblSheenDFG(surfaceData, brdfData.sheenRoughness); + brdfData.sheenPerceptualRoughness = pow2(sheenRoughness); + brdfData.iblSheenDFG = iblSheenDFG(surfaceData, brdfData.sheenPerceptualRoughness); brdfData.sheenScaling = 1.0 - brdfData.iblSheenDFG * max(max(surfaceData.sheenColor.r, surfaceData.sheenColor.g), surfaceData.sheenColor.b); #endif } diff --git a/packages/shaderlab/src/shaders/shadingPBR/ReflectionLobe.glsl b/packages/shaderlab/src/shaders/shadingPBR/ReflectionLobe.glsl index e13d6062..66d34564 100644 --- a/packages/shaderlab/src/shaders/shadingPBR/ReflectionLobe.glsl +++ b/packages/shaderlab/src/shaders/shadingPBR/ReflectionLobe.glsl @@ -14,7 +14,7 @@ void sheenLobe(Varyings varyings, SurfaceData surfaceData, BRDFData brdfData, ve diffuseColor *= brdfData.sheenScaling; specularColor *= brdfData.sheenScaling; - specularColor += attenuationIrradiance * sheenBRDF(incidentDirection, surfaceData, surfaceData.sheenColor, brdfData.sheenRoughness); + specularColor += attenuationIrradiance * sheenBRDF(incidentDirection, surfaceData, surfaceData.sheenColor, brdfData.sheenPerceptualRoughness); #endif } From c7d37fee1a560f839daab2bfacd2a0f81bfdc586 Mon Sep 17 00:00:00 2001 From: hhhhkrx Date: Thu, 12 Dec 2024 16:24:52 +0800 Subject: [PATCH 27/37] fix: sheen --- packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl b/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl index 20d9605d..58bb8fe8 100644 --- a/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl +++ b/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl @@ -86,7 +86,6 @@ struct BRDFData{ }; -#include "LightIndirectFunctions.glsl" float getAARoughnessFactor(vec3 normal) { // Kaplanyan 2016, "Stable specular highlights" From 27cedec41a28fe196cf38ca664aacb311b391d7e Mon Sep 17 00:00:00 2001 From: hhhhkrx Date: Thu, 12 Dec 2024 16:56:39 +0800 Subject: [PATCH 28/37] fix: sheenDFG name --- packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl | 8 ++++---- .../src/shaders/shadingPBR/LightIndirectPBR.glsl | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl b/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl index 58bb8fe8..be611348 100644 --- a/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl +++ b/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl @@ -81,7 +81,7 @@ struct BRDFData{ #ifdef MATERIAL_ENABLE_SHEEN float sheenPerceptualRoughness; float sheenScaling; - float iblSheenDFG; + float approxIBLSheenDG; #endif }; @@ -344,7 +344,7 @@ vec3 BRDF_Diffuse_Lambert(vec3 diffuseColor) { // This is a curve-fit approxmation to the "Charlie sheen" BRDF integrated over the hemisphere from // Estevez and Kulla 2017, "Production Friendly Microfacet Sheen BRDF". The analysis can be found // in the Sheen section of https://drive.google.com/file/d/1T0D1VSyR4AllqIJTQAraEIzjlb5h4FKH/view?usp=sharing - float iblSheenDFG(SurfaceData surfaceData, float sheenRoughness) { + float approxIBLSheenDG(SurfaceData surfaceData, float sheenRoughness) { float dotNV = surfaceData.dotNV; float a = sheenRoughness < 0.25 ? -339.2 * sheenRoughness + 161.4 * sheenRoughness - 25.9 : -8.48 * sheenRoughness + 14.3 * sheenRoughness - 9.95; float b = sheenRoughness < 0.25 ? 44.0 * sheenRoughness - 23.7 * sheenRoughness + 3.26 : 1.97 * sheenRoughness - 3.27 * sheenRoughness + 0.72; @@ -402,8 +402,8 @@ void initBRDFData(SurfaceData surfaceData, out BRDFData brdfData){ #ifdef MATERIAL_ENABLE_SHEEN float sheenRoughness = max(MIN_PERCEPTUAL_ROUGHNESS, min(surfaceData.sheenRoughness + getAARoughnessFactor(surfaceData.normal), 1.0)); brdfData.sheenPerceptualRoughness = pow2(sheenRoughness); - brdfData.iblSheenDFG = iblSheenDFG(surfaceData, brdfData.sheenPerceptualRoughness); - brdfData.sheenScaling = 1.0 - brdfData.iblSheenDFG * max(max(surfaceData.sheenColor.r, surfaceData.sheenColor.g), surfaceData.sheenColor.b); + brdfData. approxIBLSheenDG = approxIBLSheenDG(surfaceData, brdfData.sheenPerceptualRoughness); + brdfData.sheenScaling = 1.0 - brdfData. approxIBLSheenDG * max(max(surfaceData.sheenColor.r, surfaceData.sheenColor.g), surfaceData.sheenColor.b); #endif } diff --git a/packages/shaderlab/src/shaders/shadingPBR/LightIndirectPBR.glsl b/packages/shaderlab/src/shaders/shadingPBR/LightIndirectPBR.glsl index 34893f1d..06f046ea 100644 --- a/packages/shaderlab/src/shaders/shadingPBR/LightIndirectPBR.glsl +++ b/packages/shaderlab/src/shaders/shadingPBR/LightIndirectPBR.glsl @@ -84,7 +84,7 @@ void evaluateSheenIBL(Varyings varyings, SurfaceData surfaceData, BRDFData brdfD diffuseColor *= brdfData.sheenScaling; specularColor *= brdfData.sheenScaling; - vec3 reflectance = radianceAttenuation * brdfData.iblSheenDFG * surfaceData.sheenColor; + vec3 reflectance = radianceAttenuation * brdfData. approxIBLSheenDG * surfaceData.sheenColor; specularColor += reflectance; #endif } From 6099ed5d8c80d1ff0f1443dd895817b9a64c55cd Mon Sep 17 00:00:00 2001 From: hhhhkrx Date: Thu, 12 Dec 2024 16:58:32 +0800 Subject: [PATCH 29/37] fix: sheen --- .../shaderlab/src/shaders/shadingPBR/BRDF.glsl | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl b/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl index be611348..237f04db 100644 --- a/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl +++ b/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl @@ -81,7 +81,7 @@ struct BRDFData{ #ifdef MATERIAL_ENABLE_SHEEN float sheenPerceptualRoughness; float sheenScaling; - float approxIBLSheenDG; + float approxIBLSheenDG; #endif }; @@ -344,12 +344,12 @@ vec3 BRDF_Diffuse_Lambert(vec3 diffuseColor) { // This is a curve-fit approxmation to the "Charlie sheen" BRDF integrated over the hemisphere from // Estevez and Kulla 2017, "Production Friendly Microfacet Sheen BRDF". The analysis can be found // in the Sheen section of https://drive.google.com/file/d/1T0D1VSyR4AllqIJTQAraEIzjlb5h4FKH/view?usp=sharing - float approxIBLSheenDG(SurfaceData surfaceData, float sheenRoughness) { - float dotNV = surfaceData.dotNV; - float a = sheenRoughness < 0.25 ? -339.2 * sheenRoughness + 161.4 * sheenRoughness - 25.9 : -8.48 * sheenRoughness + 14.3 * sheenRoughness - 9.95; - float b = sheenRoughness < 0.25 ? 44.0 * sheenRoughness - 23.7 * sheenRoughness + 3.26 : 1.97 * sheenRoughness - 3.27 * sheenRoughness + 0.72; - float DG = exp( a * dotNV + b ) + ( sheenRoughness < 0.25 ? 0.0 : 0.1 * ( sheenRoughness - 0.25 ) ); - return saturate( DG * RECIPROCAL_PI ); + float approxIBLSheenDG(SurfaceData surfaceData, float sheenRoughness) { + float dotNV = surfaceData.dotNV; + float a = sheenRoughness < 0.25 ? -339.2 * sheenRoughness + 161.4 * sheenRoughness - 25.9 : -8.48 * sheenRoughness + 14.3 * sheenRoughness - 9.95; + float b = sheenRoughness < 0.25 ? 44.0 * sheenRoughness - 23.7 * sheenRoughness + 3.26 : 1.97 * sheenRoughness - 3.27 * sheenRoughness + 0.72; + float DG = exp( a * dotNV + b ) + ( sheenRoughness < 0.25 ? 0.0 : 0.1 * ( sheenRoughness - 0.25 ) ); + return saturate( DG * RECIPROCAL_PI ); } #endif From be36842ce3bb54cc7f95b1e456518f6a467725e4 Mon Sep 17 00:00:00 2001 From: hhhhkrx Date: Thu, 12 Dec 2024 16:59:57 +0800 Subject: [PATCH 30/37] fix: sheen --- packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl | 4 ++-- .../shaderlab/src/shaders/shadingPBR/LightIndirectPBR.glsl | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl b/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl index 237f04db..26db973e 100644 --- a/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl +++ b/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl @@ -402,8 +402,8 @@ void initBRDFData(SurfaceData surfaceData, out BRDFData brdfData){ #ifdef MATERIAL_ENABLE_SHEEN float sheenRoughness = max(MIN_PERCEPTUAL_ROUGHNESS, min(surfaceData.sheenRoughness + getAARoughnessFactor(surfaceData.normal), 1.0)); brdfData.sheenPerceptualRoughness = pow2(sheenRoughness); - brdfData. approxIBLSheenDG = approxIBLSheenDG(surfaceData, brdfData.sheenPerceptualRoughness); - brdfData.sheenScaling = 1.0 - brdfData. approxIBLSheenDG * max(max(surfaceData.sheenColor.r, surfaceData.sheenColor.g), surfaceData.sheenColor.b); + brdfData.approxIBLSheenDG = approxIBLSheenDG(surfaceData, brdfData.sheenPerceptualRoughness); + brdfData.sheenScaling = 1.0 - brdfData.approxIBLSheenDG * max(max(surfaceData.sheenColor.r, surfaceData.sheenColor.g), surfaceData.sheenColor.b); #endif } diff --git a/packages/shaderlab/src/shaders/shadingPBR/LightIndirectPBR.glsl b/packages/shaderlab/src/shaders/shadingPBR/LightIndirectPBR.glsl index 06f046ea..c60e386a 100644 --- a/packages/shaderlab/src/shaders/shadingPBR/LightIndirectPBR.glsl +++ b/packages/shaderlab/src/shaders/shadingPBR/LightIndirectPBR.glsl @@ -84,7 +84,7 @@ void evaluateSheenIBL(Varyings varyings, SurfaceData surfaceData, BRDFData brdfD diffuseColor *= brdfData.sheenScaling; specularColor *= brdfData.sheenScaling; - vec3 reflectance = radianceAttenuation * brdfData. approxIBLSheenDG * surfaceData.sheenColor; + vec3 reflectance = radianceAttenuation * brdfData.approxIBLSheenDG * surfaceData.sheenColor; specularColor += reflectance; #endif } From a69698e2b2262f19296f916207ca9033cd2428df Mon Sep 17 00:00:00 2001 From: hhhhkrx Date: Fri, 13 Dec 2024 00:21:34 +0800 Subject: [PATCH 31/37] fix: sheen dfg --- .../src/shaders/shadingPBR/BRDF.glsl | 25 ++++++++----------- .../shaders/shadingPBR/ReflectionLobe.glsl | 2 +- 2 files changed, 12 insertions(+), 15 deletions(-) diff --git a/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl b/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl index 26db973e..47cea70e 100644 --- a/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl +++ b/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl @@ -9,6 +9,9 @@ #define NEED_TANGENT #endif +#ifdef MATERIAL_ENABLE_SHEEN + sampler2D material_SheenLUT; +#endif struct SurfaceData{ // common @@ -79,7 +82,7 @@ struct BRDFData{ #endif #ifdef MATERIAL_ENABLE_SHEEN - float sheenPerceptualRoughness; + float sheenRoughness; float sheenScaling; float approxIBLSheenDG; #endif @@ -341,16 +344,9 @@ vec3 BRDF_Diffuse_Lambert(vec3 diffuseColor) { return D * V * F; } - // This is a curve-fit approxmation to the "Charlie sheen" BRDF integrated over the hemisphere from - // Estevez and Kulla 2017, "Production Friendly Microfacet Sheen BRDF". The analysis can be found - // in the Sheen section of https://drive.google.com/file/d/1T0D1VSyR4AllqIJTQAraEIzjlb5h4FKH/view?usp=sharing - float approxIBLSheenDG(SurfaceData surfaceData, float sheenRoughness) { - float dotNV = surfaceData.dotNV; - float a = sheenRoughness < 0.25 ? -339.2 * sheenRoughness + 161.4 * sheenRoughness - 25.9 : -8.48 * sheenRoughness + 14.3 * sheenRoughness - 9.95; - float b = sheenRoughness < 0.25 ? 44.0 * sheenRoughness - 23.7 * sheenRoughness + 3.26 : 1.97 * sheenRoughness - 3.27 * sheenRoughness + 0.72; - float DG = exp( a * dotNV + b ) + ( sheenRoughness < 0.25 ? 0.0 : 0.1 * ( sheenRoughness - 0.25 ) ); - return saturate( DG * RECIPROCAL_PI ); - } + float prefilteredDFG(float NoV, float perceptualRoughness) { + return textureLod( material_SheenLUT, vec2(NoV, perceptualRoughness), 0.0).b; +} #endif // ------------------------Indirect Specular------------------------ @@ -371,6 +367,7 @@ vec3 envBRDFApprox(vec3 specularColor, float roughness, float dotNV ) { } + void initBRDFData(SurfaceData surfaceData, out BRDFData brdfData){ vec3 albedoColor = surfaceData.albedoColor; vec3 specularColor = surfaceData.specularColor; @@ -400,9 +397,9 @@ void initBRDFData(SurfaceData surfaceData, out BRDFData brdfData){ #endif #ifdef MATERIAL_ENABLE_SHEEN - float sheenRoughness = max(MIN_PERCEPTUAL_ROUGHNESS, min(surfaceData.sheenRoughness + getAARoughnessFactor(surfaceData.normal), 1.0)); - brdfData.sheenPerceptualRoughness = pow2(sheenRoughness); - brdfData.approxIBLSheenDG = approxIBLSheenDG(surfaceData, brdfData.sheenPerceptualRoughness); + brdfData.sheenRoughness = max(MIN_PERCEPTUAL_ROUGHNESS, min(surfaceData.sheenRoughness + getAARoughnessFactor(surfaceData.normal), 1.0)); + float perceptualRoughness = brdfData.sheenRoughness * brdfData.sheenRoughness; + brdfData.approxIBLSheenDG = prefilteredDFG(surfaceData.dotNV, perceptualRoughness); brdfData.sheenScaling = 1.0 - brdfData.approxIBLSheenDG * max(max(surfaceData.sheenColor.r, surfaceData.sheenColor.g), surfaceData.sheenColor.b); #endif } diff --git a/packages/shaderlab/src/shaders/shadingPBR/ReflectionLobe.glsl b/packages/shaderlab/src/shaders/shadingPBR/ReflectionLobe.glsl index 66d34564..e13d6062 100644 --- a/packages/shaderlab/src/shaders/shadingPBR/ReflectionLobe.glsl +++ b/packages/shaderlab/src/shaders/shadingPBR/ReflectionLobe.glsl @@ -14,7 +14,7 @@ void sheenLobe(Varyings varyings, SurfaceData surfaceData, BRDFData brdfData, ve diffuseColor *= brdfData.sheenScaling; specularColor *= brdfData.sheenScaling; - specularColor += attenuationIrradiance * sheenBRDF(incidentDirection, surfaceData, surfaceData.sheenColor, brdfData.sheenPerceptualRoughness); + specularColor += attenuationIrradiance * sheenBRDF(incidentDirection, surfaceData, surfaceData.sheenColor, brdfData.sheenRoughness); #endif } From 7b8f3d0c8494dde47341f91a629a8ccd135bc03e Mon Sep 17 00:00:00 2001 From: hhhhkrx Date: Fri, 13 Dec 2024 01:02:31 +0800 Subject: [PATCH 32/37] fix: sheen --- packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl b/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl index 47cea70e..2dc98422 100644 --- a/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl +++ b/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl @@ -345,8 +345,8 @@ vec3 BRDF_Diffuse_Lambert(vec3 diffuseColor) { } float prefilteredDFG(float NoV, float perceptualRoughness) { - return textureLod( material_SheenLUT, vec2(NoV, perceptualRoughness), 0.0).b; -} + return textureLod(material_SheenLUT, vec2(NoV, perceptualRoughness), 0.0).b; + } #endif // ------------------------Indirect Specular------------------------ @@ -398,8 +398,7 @@ void initBRDFData(SurfaceData surfaceData, out BRDFData brdfData){ #ifdef MATERIAL_ENABLE_SHEEN brdfData.sheenRoughness = max(MIN_PERCEPTUAL_ROUGHNESS, min(surfaceData.sheenRoughness + getAARoughnessFactor(surfaceData.normal), 1.0)); - float perceptualRoughness = brdfData.sheenRoughness * brdfData.sheenRoughness; - brdfData.approxIBLSheenDG = prefilteredDFG(surfaceData.dotNV, perceptualRoughness); + brdfData.approxIBLSheenDG = prefilteredDFG(surfaceData.dotNV, brdfData.sheenRoughness); brdfData.sheenScaling = 1.0 - brdfData.approxIBLSheenDG * max(max(surfaceData.sheenColor.r, surfaceData.sheenColor.g), surfaceData.sheenColor.b); #endif } From 87444e9d0ee63cd89c77134bc0985d20ecf1733f Mon Sep 17 00:00:00 2001 From: hhhhkrx Date: Fri, 13 Dec 2024 01:06:26 +0800 Subject: [PATCH 33/37] fix: lut name --- packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl b/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl index 2dc98422..fcd7ad99 100644 --- a/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl +++ b/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl @@ -10,7 +10,7 @@ #endif #ifdef MATERIAL_ENABLE_SHEEN - sampler2D material_SheenLUT; + sampler2D scene_prefilteredLUT; #endif struct SurfaceData{ @@ -345,7 +345,7 @@ vec3 BRDF_Diffuse_Lambert(vec3 diffuseColor) { } float prefilteredDFG(float NoV, float perceptualRoughness) { - return textureLod(material_SheenLUT, vec2(NoV, perceptualRoughness), 0.0).b; + return textureLod(scene_prefilteredLUT, vec2(NoV, perceptualRoughness), 0.0).b; } #endif From 731eeaf63929f3ad4b69c7d4f8c39d795cf9542e Mon Sep 17 00:00:00 2001 From: hhhhkrx Date: Fri, 13 Dec 2024 01:16:09 +0800 Subject: [PATCH 34/37] fix: sheen --- packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl b/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl index fcd7ad99..0da9320d 100644 --- a/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl +++ b/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl @@ -344,8 +344,8 @@ vec3 BRDF_Diffuse_Lambert(vec3 diffuseColor) { return D * V * F; } - float prefilteredDFG(float NoV, float perceptualRoughness) { - return textureLod(scene_prefilteredLUT, vec2(NoV, perceptualRoughness), 0.0).b; + float prefilteredSheenDFG(float dotNV, float sheenRoughness) { + return textureLod(scene_prefilteredLUT, vec2(dotNV, sheenRoughness), 0.0).b; } #endif @@ -398,7 +398,7 @@ void initBRDFData(SurfaceData surfaceData, out BRDFData brdfData){ #ifdef MATERIAL_ENABLE_SHEEN brdfData.sheenRoughness = max(MIN_PERCEPTUAL_ROUGHNESS, min(surfaceData.sheenRoughness + getAARoughnessFactor(surfaceData.normal), 1.0)); - brdfData.approxIBLSheenDG = prefilteredDFG(surfaceData.dotNV, brdfData.sheenRoughness); + brdfData.approxIBLSheenDG = prefilteredSheenDFG(surfaceData.dotNV, brdfData.sheenRoughness); brdfData.sheenScaling = 1.0 - brdfData.approxIBLSheenDG * max(max(surfaceData.sheenColor.r, surfaceData.sheenColor.g), surfaceData.sheenColor.b); #endif } From c9c8640c6c401e6cb34f58715e5da779a432e091 Mon Sep 17 00:00:00 2001 From: hhhhkrx Date: Fri, 13 Dec 2024 01:40:15 +0800 Subject: [PATCH 35/37] fix: sheen ao --- packages/shaderlab/src/shaders/shadingPBR/LightIndirectPBR.glsl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/shaderlab/src/shaders/shadingPBR/LightIndirectPBR.glsl b/packages/shaderlab/src/shaders/shadingPBR/LightIndirectPBR.glsl index c60e386a..e0f5780b 100644 --- a/packages/shaderlab/src/shaders/shadingPBR/LightIndirectPBR.glsl +++ b/packages/shaderlab/src/shaders/shadingPBR/LightIndirectPBR.glsl @@ -84,7 +84,7 @@ void evaluateSheenIBL(Varyings varyings, SurfaceData surfaceData, BRDFData brdfD diffuseColor *= brdfData.sheenScaling; specularColor *= brdfData.sheenScaling; - vec3 reflectance = radianceAttenuation * brdfData.approxIBLSheenDG * surfaceData.sheenColor; + vec3 reflectance = surfaceData.specularAO * radianceAttenuation * brdfData.approxIBLSheenDG * surfaceData.sheenColor; specularColor += reflectance; #endif } From ed241f2341be299d19d428408c7f1b57d9a5bb0b Mon Sep 17 00:00:00 2001 From: hhhhkrx Date: Fri, 13 Dec 2024 01:58:54 +0800 Subject: [PATCH 36/37] fix: sheen texture lod --- packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl b/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl index 0da9320d..fbbbd8c3 100644 --- a/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl +++ b/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl @@ -345,7 +345,11 @@ vec3 BRDF_Diffuse_Lambert(vec3 diffuseColor) { } float prefilteredSheenDFG(float dotNV, float sheenRoughness) { - return textureLod(scene_prefilteredLUT, vec2(dotNV, sheenRoughness), 0.0).b; + #ifdef HAS_TEX_LOD + return texture2DLodEXT(scene_prefilteredLUT, vec2(dotNV, sheenRoughness), 0.0).b; + #else + return texture2D(scene_prefilteredLUT, vec2(dotNV, sheenRoughness)).b; + #endif } #endif From 1da200f4c9933bfc346584fd215c86661753ede3 Mon Sep 17 00:00:00 2001 From: hhhhkrx Date: Fri, 13 Dec 2024 02:03:09 +0800 Subject: [PATCH 37/37] fix: sheen 0.0 --- packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl b/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl index fbbbd8c3..c8eb6461 100644 --- a/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl +++ b/packages/shaderlab/src/shaders/shadingPBR/BRDF.glsl @@ -348,7 +348,7 @@ vec3 BRDF_Diffuse_Lambert(vec3 diffuseColor) { #ifdef HAS_TEX_LOD return texture2DLodEXT(scene_prefilteredLUT, vec2(dotNV, sheenRoughness), 0.0).b; #else - return texture2D(scene_prefilteredLUT, vec2(dotNV, sheenRoughness)).b; + return texture2D(scene_prefilteredLUT, vec2(dotNV, sheenRoughness),0.0).b; #endif } #endif