|
@@ -12,279 +12,43 @@
|
|
|
|
|
|
|
|
precision highp float;
|
|
precision highp float;
|
|
|
|
|
|
|
|
-#include<__decl__pbrFragment>
|
|
|
|
|
-
|
|
|
|
|
-uniform vec4 vEyePosition;
|
|
|
|
|
-uniform vec3 vAmbientColor;
|
|
|
|
|
-uniform vec4 vCameraInfos;
|
|
|
|
|
-
|
|
|
|
|
-// Input
|
|
|
|
|
-varying vec3 vPositionW;
|
|
|
|
|
-
|
|
|
|
|
-#if DEBUGMODE > 0
|
|
|
|
|
- uniform vec2 vDebugMode;
|
|
|
|
|
- varying vec4 vClipSpacePosition;
|
|
|
|
|
-#endif
|
|
|
|
|
-
|
|
|
|
|
-#ifdef MAINUV1
|
|
|
|
|
- varying vec2 vMainUV1;
|
|
|
|
|
-#endif
|
|
|
|
|
-
|
|
|
|
|
-#ifdef MAINUV2
|
|
|
|
|
- varying vec2 vMainUV2;
|
|
|
|
|
-#endif
|
|
|
|
|
-
|
|
|
|
|
-#ifdef NORMAL
|
|
|
|
|
- varying vec3 vNormalW;
|
|
|
|
|
- #if defined(USESPHERICALFROMREFLECTIONMAP) && defined(USESPHERICALINVERTEX)
|
|
|
|
|
- varying vec3 vEnvironmentIrradiance;
|
|
|
|
|
- #endif
|
|
|
|
|
-#endif
|
|
|
|
|
-
|
|
|
|
|
-#ifdef VERTEXCOLOR
|
|
|
|
|
-varying vec4 vColor;
|
|
|
|
|
-#endif
|
|
|
|
|
-
|
|
|
|
|
-// Lights
|
|
|
|
|
-#include<__decl__lightFragment>[0..maxSimultaneousLights]
|
|
|
|
|
-
|
|
|
|
|
-// Samplers
|
|
|
|
|
-#ifdef ALBEDO
|
|
|
|
|
- #if ALBEDODIRECTUV == 1
|
|
|
|
|
- #define vAlbedoUV vMainUV1
|
|
|
|
|
- #elif ALBEDODIRECTUV == 2
|
|
|
|
|
- #define vAlbedoUV vMainUV2
|
|
|
|
|
- #else
|
|
|
|
|
- varying vec2 vAlbedoUV;
|
|
|
|
|
- #endif
|
|
|
|
|
- uniform sampler2D albedoSampler;
|
|
|
|
|
-#endif
|
|
|
|
|
-
|
|
|
|
|
-#ifdef AMBIENT
|
|
|
|
|
- #if AMBIENTDIRECTUV == 1
|
|
|
|
|
- #define vAmbientUV vMainUV1
|
|
|
|
|
- #elif AMBIENTDIRECTUV == 2
|
|
|
|
|
- #define vAmbientUV vMainUV2
|
|
|
|
|
- #else
|
|
|
|
|
- varying vec2 vAmbientUV;
|
|
|
|
|
- #endif
|
|
|
|
|
- uniform sampler2D ambientSampler;
|
|
|
|
|
-#endif
|
|
|
|
|
-
|
|
|
|
|
-#ifdef OPACITY
|
|
|
|
|
- #if OPACITYDIRECTUV == 1
|
|
|
|
|
- #define vOpacityUV vMainUV1
|
|
|
|
|
- #elif OPACITYDIRECTUV == 2
|
|
|
|
|
- #define vOpacityUV vMainUV2
|
|
|
|
|
- #else
|
|
|
|
|
- varying vec2 vOpacityUV;
|
|
|
|
|
- #endif
|
|
|
|
|
- uniform sampler2D opacitySampler;
|
|
|
|
|
-#endif
|
|
|
|
|
-
|
|
|
|
|
-#ifdef EMISSIVE
|
|
|
|
|
- #if EMISSIVEDIRECTUV == 1
|
|
|
|
|
- #define vEmissiveUV vMainUV1
|
|
|
|
|
- #elif EMISSIVEDIRECTUV == 2
|
|
|
|
|
- #define vEmissiveUV vMainUV2
|
|
|
|
|
- #else
|
|
|
|
|
- varying vec2 vEmissiveUV;
|
|
|
|
|
- #endif
|
|
|
|
|
- uniform sampler2D emissiveSampler;
|
|
|
|
|
-#endif
|
|
|
|
|
-
|
|
|
|
|
-#ifdef LIGHTMAP
|
|
|
|
|
- #if LIGHTMAPDIRECTUV == 1
|
|
|
|
|
- #define vLightmapUV vMainUV1
|
|
|
|
|
- #elif LIGHTMAPDIRECTUV == 2
|
|
|
|
|
- #define vLightmapUV vMainUV2
|
|
|
|
|
- #else
|
|
|
|
|
- varying vec2 vLightmapUV;
|
|
|
|
|
- #endif
|
|
|
|
|
- uniform sampler2D lightmapSampler;
|
|
|
|
|
-#endif
|
|
|
|
|
-
|
|
|
|
|
-#ifdef REFLECTIVITY
|
|
|
|
|
- #if REFLECTIVITYDIRECTUV == 1
|
|
|
|
|
- #define vReflectivityUV vMainUV1
|
|
|
|
|
- #elif REFLECTIVITYDIRECTUV == 2
|
|
|
|
|
- #define vReflectivityUV vMainUV2
|
|
|
|
|
- #else
|
|
|
|
|
- varying vec2 vReflectivityUV;
|
|
|
|
|
- #endif
|
|
|
|
|
- uniform sampler2D reflectivitySampler;
|
|
|
|
|
-#endif
|
|
|
|
|
-
|
|
|
|
|
-#ifdef MICROSURFACEMAP
|
|
|
|
|
- #if MICROSURFACEMAPDIRECTUV == 1
|
|
|
|
|
- #define vMicroSurfaceSamplerUV vMainUV1
|
|
|
|
|
- #elif MICROSURFACEMAPDIRECTUV == 2
|
|
|
|
|
- #define vMicroSurfaceSamplerUV vMainUV2
|
|
|
|
|
- #else
|
|
|
|
|
- varying vec2 vMicroSurfaceSamplerUV;
|
|
|
|
|
- #endif
|
|
|
|
|
- uniform sampler2D microSurfaceSampler;
|
|
|
|
|
-#endif
|
|
|
|
|
-
|
|
|
|
|
-#ifdef CLEARCOAT
|
|
|
|
|
- #ifdef CLEARCOAT_TEXTURE
|
|
|
|
|
- #if CLEARCOAT_TEXTUREDIRECTUV == 1
|
|
|
|
|
- #define vClearCoatUV vMainUV1
|
|
|
|
|
- #elif CLEARCOAT_TEXTUREDIRECTUV == 2
|
|
|
|
|
- #define vClearCoatUV vMainUV2
|
|
|
|
|
- #else
|
|
|
|
|
- varying vec2 vClearCoatUV;
|
|
|
|
|
- #endif
|
|
|
|
|
- uniform sampler2D clearCoatSampler;
|
|
|
|
|
- #endif
|
|
|
|
|
-
|
|
|
|
|
- #ifdef CLEARCOAT_BUMP
|
|
|
|
|
- #if CLEARCOAT_BUMPDIRECTUV == 1
|
|
|
|
|
- #define vClearCoatBumpUV vMainUV1
|
|
|
|
|
- #elif CLEARCOAT_BUMPDIRECTUV == 2
|
|
|
|
|
- #define vClearCoatBumpUV vMainUV2
|
|
|
|
|
- #else
|
|
|
|
|
- varying vec2 vClearCoatBumpUV;
|
|
|
|
|
- #endif
|
|
|
|
|
- uniform sampler2D clearCoatBumpSampler;
|
|
|
|
|
- #endif
|
|
|
|
|
-
|
|
|
|
|
- #ifdef CLEARCOAT_TINT_TEXTURE
|
|
|
|
|
- #if CLEARCOAT_TINT_TEXTUREDIRECTUV == 1
|
|
|
|
|
- #define vClearCoatTintUV vMainUV1
|
|
|
|
|
- #elif CLEARCOAT_TINT_TEXTUREDIRECTUV == 2
|
|
|
|
|
- #define vClearCoatTintUV vMainUV2
|
|
|
|
|
- #else
|
|
|
|
|
- varying vec2 vClearCoatTintUV;
|
|
|
|
|
- #endif
|
|
|
|
|
- uniform sampler2D clearCoatTintSampler;
|
|
|
|
|
- #endif
|
|
|
|
|
-#endif
|
|
|
|
|
-
|
|
|
|
|
-#ifdef SHEEN
|
|
|
|
|
- #ifdef SHEEN_TEXTURE
|
|
|
|
|
- #if SHEEN_TEXTUREDIRECTUV == 1
|
|
|
|
|
- #define vSheenUV vMainUV1
|
|
|
|
|
- #elif SHEEN_TEXTUREDIRECTUV == 2
|
|
|
|
|
- #define vSheenUV vMainUV2
|
|
|
|
|
- #else
|
|
|
|
|
- varying vec2 vSheenUV;
|
|
|
|
|
- #endif
|
|
|
|
|
- uniform sampler2D sheenSampler;
|
|
|
|
|
- #endif
|
|
|
|
|
-#endif
|
|
|
|
|
-
|
|
|
|
|
-#ifdef ANISOTROPIC
|
|
|
|
|
- #ifdef ANISOTROPIC_TEXTURE
|
|
|
|
|
- #if ANISOTROPIC_TEXTUREDIRECTUV == 1
|
|
|
|
|
- #define vAnisotropyUV vMainUV1
|
|
|
|
|
- #elif ANISOTROPIC_TEXTUREDIRECTUV == 2
|
|
|
|
|
- #define vAnisotropyUV vMainUV2
|
|
|
|
|
- #else
|
|
|
|
|
- varying vec2 vAnisotropyUV;
|
|
|
|
|
- #endif
|
|
|
|
|
- uniform sampler2D anisotropySampler;
|
|
|
|
|
- #endif
|
|
|
|
|
-#endif
|
|
|
|
|
-
|
|
|
|
|
-// Refraction
|
|
|
|
|
-#ifdef REFRACTION
|
|
|
|
|
- #ifdef REFRACTIONMAP_3D
|
|
|
|
|
- #define sampleRefraction(s, c) textureCube(s, c)
|
|
|
|
|
-
|
|
|
|
|
- uniform samplerCube refractionSampler;
|
|
|
|
|
-
|
|
|
|
|
- #ifdef LODBASEDMICROSFURACE
|
|
|
|
|
- #define sampleRefractionLod(s, c, l) textureCubeLodEXT(s, c, l)
|
|
|
|
|
- #else
|
|
|
|
|
- uniform samplerCube refractionSamplerLow;
|
|
|
|
|
- uniform samplerCube refractionSamplerHigh;
|
|
|
|
|
- #endif
|
|
|
|
|
- #else
|
|
|
|
|
- #define sampleRefraction(s, c) texture2D(s, c)
|
|
|
|
|
-
|
|
|
|
|
- uniform sampler2D refractionSampler;
|
|
|
|
|
-
|
|
|
|
|
- #ifdef LODBASEDMICROSFURACE
|
|
|
|
|
- #define sampleRefractionLod(s, c, l) texture2DLodEXT(s, c, l)
|
|
|
|
|
- #else
|
|
|
|
|
- uniform samplerCube refractionSamplerLow;
|
|
|
|
|
- uniform samplerCube refractionSamplerHigh;
|
|
|
|
|
- #endif
|
|
|
|
|
- #endif
|
|
|
|
|
-#endif
|
|
|
|
|
-
|
|
|
|
|
-// Reflection
|
|
|
|
|
-#ifdef REFLECTION
|
|
|
|
|
- #ifdef REFLECTIONMAP_3D
|
|
|
|
|
- #define sampleReflection(s, c) textureCube(s, c)
|
|
|
|
|
-
|
|
|
|
|
- uniform samplerCube reflectionSampler;
|
|
|
|
|
-
|
|
|
|
|
- #ifdef LODBASEDMICROSFURACE
|
|
|
|
|
- #define sampleReflectionLod(s, c, l) textureCubeLodEXT(s, c, l)
|
|
|
|
|
- #else
|
|
|
|
|
- uniform samplerCube reflectionSamplerLow;
|
|
|
|
|
- uniform samplerCube reflectionSamplerHigh;
|
|
|
|
|
- #endif
|
|
|
|
|
- #else
|
|
|
|
|
- #define sampleReflection(s, c) texture2D(s, c)
|
|
|
|
|
-
|
|
|
|
|
- uniform sampler2D reflectionSampler;
|
|
|
|
|
-
|
|
|
|
|
- #ifdef LODBASEDMICROSFURACE
|
|
|
|
|
- #define sampleReflectionLod(s, c, l) texture2DLodEXT(s, c, l)
|
|
|
|
|
- #else
|
|
|
|
|
- uniform samplerCube reflectionSamplerLow;
|
|
|
|
|
- uniform samplerCube reflectionSamplerHigh;
|
|
|
|
|
- #endif
|
|
|
|
|
- #endif
|
|
|
|
|
-
|
|
|
|
|
- #ifdef REFLECTIONMAP_SKYBOX
|
|
|
|
|
- varying vec3 vPositionUVW;
|
|
|
|
|
- #else
|
|
|
|
|
- #if defined(REFLECTIONMAP_EQUIRECTANGULAR_FIXED) || defined(REFLECTIONMAP_MIRROREDEQUIRECTANGULAR_FIXED)
|
|
|
|
|
- varying vec3 vDirectionW;
|
|
|
|
|
- #endif
|
|
|
|
|
- #endif
|
|
|
|
|
-
|
|
|
|
|
- #include<reflectionFunction>
|
|
|
|
|
-#endif
|
|
|
|
|
-
|
|
|
|
|
-#ifdef ENVIRONMENTBRDF
|
|
|
|
|
- uniform sampler2D environmentBrdfSampler;
|
|
|
|
|
-#endif
|
|
|
|
|
-
|
|
|
|
|
// Forces linear space for image processing
|
|
// Forces linear space for image processing
|
|
|
#ifndef FROMLINEARSPACE
|
|
#ifndef FROMLINEARSPACE
|
|
|
#define FROMLINEARSPACE;
|
|
#define FROMLINEARSPACE;
|
|
|
#endif
|
|
#endif
|
|
|
|
|
|
|
|
|
|
+// Declaration
|
|
|
|
|
+#include<__decl__pbrFragment>
|
|
|
|
|
+#include<pbrFragmentExtraDeclaration>
|
|
|
|
|
+#include<__decl__lightFragment>[0..maxSimultaneousLights]
|
|
|
|
|
+#include<pbrFragmentSamplersDeclaration>
|
|
|
#include<imageProcessingDeclaration>
|
|
#include<imageProcessingDeclaration>
|
|
|
|
|
+#include<clipPlaneFragmentDeclaration>
|
|
|
|
|
+#include<logDepthDeclaration>
|
|
|
|
|
+#include<fogFragmentDeclaration>
|
|
|
|
|
|
|
|
|
|
+// Helper Functions
|
|
|
#include<helperFunctions>
|
|
#include<helperFunctions>
|
|
|
-
|
|
|
|
|
|
|
+#include<pbrHelperFunctions>
|
|
|
#include<imageProcessingFunctions>
|
|
#include<imageProcessingFunctions>
|
|
|
-
|
|
|
|
|
-// PBR
|
|
|
|
|
#include<shadowsFragmentFunctions>
|
|
#include<shadowsFragmentFunctions>
|
|
|
-#include<pbrFunctions>
|
|
|
|
|
#include<harmonicsFunctions>
|
|
#include<harmonicsFunctions>
|
|
|
-#include<pbrPreLightingFunctions>
|
|
|
|
|
-#include<pbrFalloffLightingFunctions>
|
|
|
|
|
-#include<pbrLightingFunctions>
|
|
|
|
|
-
|
|
|
|
|
|
|
+#include<pbrDirectLightingSetupFunctions>
|
|
|
|
|
+#include<pbrDirectLightingFalloffFunctions>
|
|
|
|
|
+#include<pbrBRDFFunctions>
|
|
|
|
|
+#include<pbrDirectLightingFunctions>
|
|
|
|
|
+#include<pbrIBLFunctions>
|
|
|
#include<bumpFragmentFunctions>
|
|
#include<bumpFragmentFunctions>
|
|
|
-#include<clipPlaneFragmentDeclaration>
|
|
|
|
|
-#include<logDepthDeclaration>
|
|
|
|
|
|
|
|
|
|
-// Fog
|
|
|
|
|
-#include<fogFragmentDeclaration>
|
|
|
|
|
|
|
+#ifdef REFLECTION
|
|
|
|
|
+ #include<reflectionFunction>
|
|
|
|
|
+#endif
|
|
|
|
|
|
|
|
|
|
+// _____________________________ MAIN FUNCTION ____________________________
|
|
|
void main(void) {
|
|
void main(void) {
|
|
|
-#include<clipPlaneFragment>
|
|
|
|
|
|
|
|
|
|
-// _______________________________________________________________________________
|
|
|
|
|
|
|
+ #include<clipPlaneFragment>
|
|
|
|
|
+
|
|
|
// _____________________________ Geometry Information ____________________________
|
|
// _____________________________ Geometry Information ____________________________
|
|
|
vec3 viewDirectionW = normalize(vEyePosition.xyz - vPositionW);
|
|
vec3 viewDirectionW = normalize(vEyePosition.xyz - vPositionW);
|
|
|
|
|
|
|
@@ -468,7 +232,7 @@ void main(void) {
|
|
|
#endif
|
|
#endif
|
|
|
|
|
|
|
|
// Adapt microSurface.
|
|
// Adapt microSurface.
|
|
|
- microSurface = clamp(microSurface, 0., 1.);
|
|
|
|
|
|
|
+ microSurface = saturate(microSurface);
|
|
|
// Compute roughness.
|
|
// Compute roughness.
|
|
|
float roughness = 1. - microSurface;
|
|
float roughness = 1. - microSurface;
|
|
|
|
|
|
|
@@ -490,7 +254,7 @@ void main(void) {
|
|
|
vec3 normalForward = faceforward(normalW, -viewDirectionW, normalW);
|
|
vec3 normalForward = faceforward(normalW, -viewDirectionW, normalW);
|
|
|
|
|
|
|
|
// Calculate the appropriate linear opacity for the current viewing angle (formally, this quantity is the "directional absorptance").
|
|
// Calculate the appropriate linear opacity for the current viewing angle (formally, this quantity is the "directional absorptance").
|
|
|
- alpha = getReflectanceFromAnalyticalBRDFLookup_Jones(clamp(dot(viewDirectionW, normalForward), 0.0, 1.0), vec3(opacity0), vec3(opacity90), sqrt(microSurface)).x;
|
|
|
|
|
|
|
+ alpha = getReflectanceFromAnalyticalBRDFLookup_Jones(saturate(dot(viewDirectionW, normalForward)), vec3(opacity0), vec3(opacity90), sqrt(microSurface)).x;
|
|
|
|
|
|
|
|
#ifdef ALPHATEST
|
|
#ifdef ALPHATEST
|
|
|
if (alpha < ALPHATESTVALUE)
|
|
if (alpha < ALPHATESTVALUE)
|
|
@@ -506,7 +270,8 @@ void main(void) {
|
|
|
|
|
|
|
|
// _____________________________ Compute Geometry info _________________________________
|
|
// _____________________________ Compute Geometry info _________________________________
|
|
|
float NdotVUnclamped = dot(normalW, viewDirectionW);
|
|
float NdotVUnclamped = dot(normalW, viewDirectionW);
|
|
|
- float NdotV = clamp(NdotVUnclamped,0., 1.) + 0.00001;
|
|
|
|
|
|
|
+ // The order 1886 page 3.
|
|
|
|
|
+ float NdotV = absEps(NdotVUnclamped);
|
|
|
float alphaG = convertRoughnessToAverageSlope(roughness);
|
|
float alphaG = convertRoughnessToAverageSlope(roughness);
|
|
|
vec2 AARoughnessFactors = getAARoughnessFactors(normalW.xyz);
|
|
vec2 AARoughnessFactors = getAARoughnessFactors(normalW.xyz);
|
|
|
|
|
|
|
@@ -560,7 +325,7 @@ void main(void) {
|
|
|
#ifdef LODINREFRACTIONALPHA
|
|
#ifdef LODINREFRACTIONALPHA
|
|
|
float refractionLOD = getLodFromAlphaG(vRefractionMicrosurfaceInfos.x, alphaG, NdotVUnclamped);
|
|
float refractionLOD = getLodFromAlphaG(vRefractionMicrosurfaceInfos.x, alphaG, NdotVUnclamped);
|
|
|
#else
|
|
#else
|
|
|
- float refractionLOD = getLodFromAlphaG(vRefractionMicrosurfaceInfos.x, alphaG, 1.0);
|
|
|
|
|
|
|
+ float refractionLOD = getLodFromAlphaG(vRefractionMicrosurfaceInfos.x, alphaG);
|
|
|
#endif
|
|
#endif
|
|
|
|
|
|
|
|
#ifdef LODBASEDMICROSFURACE
|
|
#ifdef LODBASEDMICROSFURACE
|
|
@@ -586,7 +351,7 @@ void main(void) {
|
|
|
|
|
|
|
|
environmentRefraction = sampleRefractionLod(refractionSampler, refractionCoords, requestedRefractionLOD);
|
|
environmentRefraction = sampleRefractionLod(refractionSampler, refractionCoords, requestedRefractionLOD);
|
|
|
#else
|
|
#else
|
|
|
- float lodRefractionNormalized = clamp(refractionLOD / log2(vRefractionMicrosurfaceInfos.x), 0., 1.);
|
|
|
|
|
|
|
+ float lodRefractionNormalized = saturate(refractionLOD / log2(vRefractionMicrosurfaceInfos.x));
|
|
|
float lodRefractionNormalizedDoubled = lodRefractionNormalized * 2.0;
|
|
float lodRefractionNormalizedDoubled = lodRefractionNormalized * 2.0;
|
|
|
|
|
|
|
|
vec4 environmentRefractionMid = sampleRefraction(refractionSampler, refractionCoords);
|
|
vec4 environmentRefractionMid = sampleRefraction(refractionSampler, refractionCoords);
|
|
@@ -646,7 +411,7 @@ void main(void) {
|
|
|
#if defined(LODINREFLECTIONALPHA) && !defined(REFLECTIONMAP_SKYBOX)
|
|
#if defined(LODINREFLECTIONALPHA) && !defined(REFLECTIONMAP_SKYBOX)
|
|
|
float reflectionLOD = getLodFromAlphaG(vReflectionMicrosurfaceInfos.x, alphaG, NdotVUnclamped);
|
|
float reflectionLOD = getLodFromAlphaG(vReflectionMicrosurfaceInfos.x, alphaG, NdotVUnclamped);
|
|
|
#else
|
|
#else
|
|
|
- float reflectionLOD = getLodFromAlphaG(vReflectionMicrosurfaceInfos.x, alphaG, 1.);
|
|
|
|
|
|
|
+ float reflectionLOD = getLodFromAlphaG(vReflectionMicrosurfaceInfos.x, alphaG);
|
|
|
#endif
|
|
#endif
|
|
|
|
|
|
|
|
#ifdef LODBASEDMICROSFURACE
|
|
#ifdef LODBASEDMICROSFURACE
|
|
@@ -672,7 +437,7 @@ void main(void) {
|
|
|
|
|
|
|
|
environmentRadiance = sampleReflectionLod(reflectionSampler, reflectionCoords, requestedReflectionLOD);
|
|
environmentRadiance = sampleReflectionLod(reflectionSampler, reflectionCoords, requestedReflectionLOD);
|
|
|
#else
|
|
#else
|
|
|
- float lodReflectionNormalized = clamp(reflectionLOD / log2(vReflectionMicrosurfaceInfos.x), 0., 1.);
|
|
|
|
|
|
|
+ float lodReflectionNormalized = saturate(reflectionLOD / log2(vReflectionMicrosurfaceInfos.x));
|
|
|
float lodReflectionNormalizedDoubled = lodReflectionNormalized * 2.0;
|
|
float lodReflectionNormalizedDoubled = lodReflectionNormalized * 2.0;
|
|
|
|
|
|
|
|
vec4 environmentSpecularMid = sampleReflection(reflectionSampler, reflectionCoords);
|
|
vec4 environmentSpecularMid = sampleReflection(reflectionSampler, reflectionCoords);
|
|
@@ -740,7 +505,7 @@ void main(void) {
|
|
|
#endif
|
|
#endif
|
|
|
|
|
|
|
|
#ifdef SHEEN_LINKWITHALBEDO
|
|
#ifdef SHEEN_LINKWITHALBEDO
|
|
|
- float sheenFactor = pow(1.0-sheenIntensity, 5.0);
|
|
|
|
|
|
|
+ float sheenFactor = pow5(1.0-sheenIntensity);
|
|
|
vec3 sheenColor = baseColor.rgb*(1.0-sheenFactor);
|
|
vec3 sheenColor = baseColor.rgb*(1.0-sheenFactor);
|
|
|
float sheenRoughness = sheenIntensity;
|
|
float sheenRoughness = sheenIntensity;
|
|
|
// remap albedo.
|
|
// remap albedo.
|
|
@@ -771,7 +536,7 @@ void main(void) {
|
|
|
#if defined(LODINREFLECTIONALPHA) && !defined(REFLECTIONMAP_SKYBOX)
|
|
#if defined(LODINREFLECTIONALPHA) && !defined(REFLECTIONMAP_SKYBOX)
|
|
|
float sheenReflectionLOD = getLodFromAlphaG(vReflectionMicrosurfaceInfos.x, sheenAlphaG, NdotVUnclamped);
|
|
float sheenReflectionLOD = getLodFromAlphaG(vReflectionMicrosurfaceInfos.x, sheenAlphaG, NdotVUnclamped);
|
|
|
#else
|
|
#else
|
|
|
- float sheenReflectionLOD = getLodFromAlphaG(vReflectionMicrosurfaceInfos.x, sheenAlphaG, 1.);
|
|
|
|
|
|
|
+ float sheenReflectionLOD = getLodFromAlphaG(vReflectionMicrosurfaceInfos.x, sheenAlphaG);
|
|
|
#endif
|
|
#endif
|
|
|
|
|
|
|
|
#ifdef LODBASEDMICROSFURACE
|
|
#ifdef LODBASEDMICROSFURACE
|
|
@@ -779,7 +544,7 @@ void main(void) {
|
|
|
sheenReflectionLOD = sheenReflectionLOD * vReflectionMicrosurfaceInfos.y + vReflectionMicrosurfaceInfos.z;
|
|
sheenReflectionLOD = sheenReflectionLOD * vReflectionMicrosurfaceInfos.y + vReflectionMicrosurfaceInfos.z;
|
|
|
environmentSheenRadiance = sampleReflectionLod(reflectionSampler, reflectionCoords, sheenReflectionLOD);
|
|
environmentSheenRadiance = sampleReflectionLod(reflectionSampler, reflectionCoords, sheenReflectionLOD);
|
|
|
#else
|
|
#else
|
|
|
- float lodSheenReflectionNormalized = clamp(sheenReflectionLOD / log2(vReflectionMicrosurfaceInfos.x), 0., 1.);
|
|
|
|
|
|
|
+ float lodSheenReflectionNormalized = saturate(sheenReflectionLOD / log2(vReflectionMicrosurfaceInfos.x));
|
|
|
float lodSheenReflectionNormalizedDoubled = lodSheenReflectionNormalized * 2.0;
|
|
float lodSheenReflectionNormalizedDoubled = lodSheenReflectionNormalized * 2.0;
|
|
|
|
|
|
|
|
vec4 environmentSheenMid = sampleReflection(reflectionSampler, reflectionCoords);
|
|
vec4 environmentSheenMid = sampleReflection(reflectionSampler, reflectionCoords);
|
|
@@ -879,7 +644,8 @@ void main(void) {
|
|
|
|
|
|
|
|
// Compute N dot V.
|
|
// Compute N dot V.
|
|
|
float clearCoatNdotVUnclamped = dot(clearCoatNormalW, viewDirectionW);
|
|
float clearCoatNdotVUnclamped = dot(clearCoatNormalW, viewDirectionW);
|
|
|
- float clearCoatNdotV = clamp(clearCoatNdotVUnclamped,0., 1.) + 0.00001;
|
|
|
|
|
|
|
+ // The order 1886 page 3.
|
|
|
|
|
+ float clearCoatNdotV = absEps(clearCoatNdotVUnclamped);
|
|
|
|
|
|
|
|
// Clear Coat Reflection
|
|
// Clear Coat Reflection
|
|
|
#if defined(REFLECTION)
|
|
#if defined(REFLECTION)
|
|
@@ -911,7 +677,7 @@ void main(void) {
|
|
|
#if defined(LODINREFLECTIONALPHA) && !defined(REFLECTIONMAP_SKYBOX)
|
|
#if defined(LODINREFLECTIONALPHA) && !defined(REFLECTIONMAP_SKYBOX)
|
|
|
float clearCoatReflectionLOD = getLodFromAlphaG(vReflectionMicrosurfaceInfos.x, clearCoatAlphaG, clearCoatNdotVUnclamped);
|
|
float clearCoatReflectionLOD = getLodFromAlphaG(vReflectionMicrosurfaceInfos.x, clearCoatAlphaG, clearCoatNdotVUnclamped);
|
|
|
#else
|
|
#else
|
|
|
- float clearCoatReflectionLOD = getLodFromAlphaG(vReflectionMicrosurfaceInfos.x, clearCoatAlphaG, 1.);
|
|
|
|
|
|
|
+ float clearCoatReflectionLOD = getLodFromAlphaG(vReflectionMicrosurfaceInfos.x, clearCoatAlphaG);
|
|
|
#endif
|
|
#endif
|
|
|
|
|
|
|
|
#ifdef LODBASEDMICROSFURACE
|
|
#ifdef LODBASEDMICROSFURACE
|
|
@@ -921,7 +687,7 @@ void main(void) {
|
|
|
|
|
|
|
|
environmentClearCoatRadiance = sampleReflectionLod(reflectionSampler, clearCoatReflectionCoords, requestedClearCoatReflectionLOD);
|
|
environmentClearCoatRadiance = sampleReflectionLod(reflectionSampler, clearCoatReflectionCoords, requestedClearCoatReflectionLOD);
|
|
|
#else
|
|
#else
|
|
|
- float lodClearCoatReflectionNormalized = clamp(clearCoatReflectionLOD / log2(vReflectionMicrosurfaceInfos.x), 0., 1.);
|
|
|
|
|
|
|
+ float lodClearCoatReflectionNormalized = saturate(clearCoatReflectionLOD / log2(vReflectionMicrosurfaceInfos.x));
|
|
|
float lodClearCoatReflectionNormalizedDoubled = lodClearCoatReflectionNormalized * 2.0;
|
|
float lodClearCoatReflectionNormalizedDoubled = lodClearCoatReflectionNormalized * 2.0;
|
|
|
|
|
|
|
|
vec4 environmentClearCoatMid = sampleReflection(reflectionSampler, reflectionCoords);
|
|
vec4 environmentClearCoatMid = sampleReflection(reflectionSampler, reflectionCoords);
|
|
@@ -951,7 +717,8 @@ void main(void) {
|
|
|
#ifdef CLEARCOAT_TINT
|
|
#ifdef CLEARCOAT_TINT
|
|
|
// Used later on in the light fragment and ibl.
|
|
// Used later on in the light fragment and ibl.
|
|
|
vec3 clearCoatVRefract = -refract(vPositionW, clearCoatNormalW, vClearCoatRefractionParams.y);
|
|
vec3 clearCoatVRefract = -refract(vPositionW, clearCoatNormalW, vClearCoatRefractionParams.y);
|
|
|
- float clearCoatNdotVRefract = clamp(dot(clearCoatNormalW, clearCoatVRefract), 0.00000000001, 1.0);
|
|
|
|
|
|
|
+ // The order 1886 page 3.
|
|
|
|
|
+ float clearCoatNdotVRefract = absEps(dot(clearCoatNormalW, clearCoatVRefract));
|
|
|
vec3 absorption = vec3(0.);
|
|
vec3 absorption = vec3(0.);
|
|
|
#endif
|
|
#endif
|
|
|
|
|
|
|
@@ -1115,7 +882,7 @@ void main(void) {
|
|
|
// TODO. PBR Tinting.
|
|
// TODO. PBR Tinting.
|
|
|
vec3 mixedAlbedo = surfaceAlbedo;
|
|
vec3 mixedAlbedo = surfaceAlbedo;
|
|
|
float maxChannel = max(max(mixedAlbedo.r, mixedAlbedo.g), mixedAlbedo.b);
|
|
float maxChannel = max(max(mixedAlbedo.r, mixedAlbedo.g), mixedAlbedo.b);
|
|
|
- vec3 tint = clamp(maxChannel * mixedAlbedo, 0.0, 1.0);
|
|
|
|
|
|
|
+ vec3 tint = saturate(maxChannel * mixedAlbedo);
|
|
|
|
|
|
|
|
// Decrease Albedo Contribution
|
|
// Decrease Albedo Contribution
|
|
|
surfaceAlbedo *= alpha;
|
|
surfaceAlbedo *= alpha;
|
|
@@ -1252,7 +1019,7 @@ void main(void) {
|
|
|
#endif
|
|
#endif
|
|
|
|
|
|
|
|
#if defined(RADIANCEOVERALPHA) || defined(SPECULAROVERALPHA)
|
|
#if defined(RADIANCEOVERALPHA) || defined(SPECULAROVERALPHA)
|
|
|
- alpha = clamp(alpha + luminanceOverAlpha * luminanceOverAlpha, 0., 1.);
|
|
|
|
|
|
|
+ alpha = saturate(alpha + luminanceOverAlpha * luminanceOverAlpha);
|
|
|
#endif
|
|
#endif
|
|
|
#endif
|
|
#endif
|
|
|
#endif
|
|
#endif
|