|
@@ -1,365 +1,62 @@
|
|
#import "Common/ShaderLib/GLSLCompat.glsllib"
|
|
#import "Common/ShaderLib/GLSLCompat.glsllib"
|
|
-#import "Common/ShaderLib/PBR.glsllib"
|
|
|
|
-#import "Common/ShaderLib/Parallax.glsllib"
|
|
|
|
-#import "Common/ShaderLib/Lighting.glsllib"
|
|
|
|
|
|
|
|
-varying vec2 texCoord;
|
|
|
|
-#ifdef SEPARATE_TEXCOORD
|
|
|
|
- varying vec2 texCoord2;
|
|
|
|
-#endif
|
|
|
|
-
|
|
|
|
-varying vec4 Color;
|
|
|
|
-
|
|
|
|
-uniform vec4 g_LightData[NB_LIGHTS];
|
|
|
|
-uniform vec3 g_CameraPosition;
|
|
|
|
-uniform vec4 g_AmbientLightColor;
|
|
|
|
-
|
|
|
|
-uniform float m_Roughness;
|
|
|
|
-uniform float m_Metallic;
|
|
|
|
-
|
|
|
|
-varying vec3 wPosition;
|
|
|
|
-
|
|
|
|
-
|
|
|
|
-#if NB_PROBES >= 1
|
|
|
|
- uniform samplerCube g_PrefEnvMap;
|
|
|
|
- uniform vec3 g_ShCoeffs[9];
|
|
|
|
- uniform mat4 g_LightProbeData;
|
|
|
|
-#endif
|
|
|
|
-#if NB_PROBES >= 2
|
|
|
|
- uniform samplerCube g_PrefEnvMap2;
|
|
|
|
- uniform vec3 g_ShCoeffs2[9];
|
|
|
|
- uniform mat4 g_LightProbeData2;
|
|
|
|
-#endif
|
|
|
|
-#if NB_PROBES == 3
|
|
|
|
- uniform samplerCube g_PrefEnvMap3;
|
|
|
|
- uniform vec3 g_ShCoeffs3[9];
|
|
|
|
- uniform mat4 g_LightProbeData3;
|
|
|
|
-#endif
|
|
|
|
-
|
|
|
|
-#ifdef BASECOLORMAP
|
|
|
|
- uniform sampler2D m_BaseColorMap;
|
|
|
|
-#endif
|
|
|
|
-
|
|
|
|
-#ifdef USE_PACKED_MR
|
|
|
|
- uniform sampler2D m_MetallicRoughnessMap;
|
|
|
|
-#else
|
|
|
|
- #ifdef METALLICMAP
|
|
|
|
- uniform sampler2D m_MetallicMap;
|
|
|
|
- #endif
|
|
|
|
- #ifdef ROUGHNESSMAP
|
|
|
|
- uniform sampler2D m_RoughnessMap;
|
|
|
|
- #endif
|
|
|
|
-#endif
|
|
|
|
-
|
|
|
|
-#ifdef EMISSIVE
|
|
|
|
- uniform vec4 m_Emissive;
|
|
|
|
-#endif
|
|
|
|
-#ifdef EMISSIVEMAP
|
|
|
|
- uniform sampler2D m_EmissiveMap;
|
|
|
|
-#endif
|
|
|
|
-#if defined(EMISSIVE) || defined(EMISSIVEMAP)
|
|
|
|
- uniform float m_EmissivePower;
|
|
|
|
- uniform float m_EmissiveIntensity;
|
|
|
|
-#endif
|
|
|
|
|
|
+// enable apis and import PBRLightingUtils
|
|
|
|
+#define ENABLE_PBRLightingUtils_getWorldPosition 1
|
|
|
|
+//#define ENABLE_PBRLightingUtils_getLocalPosition 1
|
|
|
|
+#define ENABLE_PBRLightingUtils_getWorldNormal 1
|
|
|
|
+#define ENABLE_PBRLightingUtils_getWorldTangent 1
|
|
|
|
+#define ENABLE_PBRLightingUtils_getTexCoord 1
|
|
|
|
+#define ENABLE_PBRLightingUtils_readPBRSurface 1
|
|
|
|
+#define ENABLE_PBRLightingUtils_computeDirectLightContribution 1
|
|
|
|
+#define ENABLE_PBRLightingUtils_computeProbesContribution 1
|
|
|
|
|
|
-#ifdef SPECGLOSSPIPELINE
|
|
|
|
-
|
|
|
|
- uniform vec4 m_Specular;
|
|
|
|
- uniform float m_Glossiness;
|
|
|
|
- #ifdef USE_PACKED_SG
|
|
|
|
- uniform sampler2D m_SpecularGlossinessMap;
|
|
|
|
- #else
|
|
|
|
- uniform sampler2D m_SpecularMap;
|
|
|
|
- uniform sampler2D m_GlossinessMap;
|
|
|
|
- #endif
|
|
|
|
-#endif
|
|
|
|
-
|
|
|
|
-#ifdef PARALLAXMAP
|
|
|
|
- uniform sampler2D m_ParallaxMap;
|
|
|
|
-#endif
|
|
|
|
-#if (defined(PARALLAXMAP) || (defined(NORMALMAP_PARALLAX) && defined(NORMALMAP)))
|
|
|
|
- uniform float m_ParallaxHeight;
|
|
|
|
-#endif
|
|
|
|
-
|
|
|
|
-#ifdef LIGHTMAP
|
|
|
|
- uniform sampler2D m_LightMap;
|
|
|
|
-#endif
|
|
|
|
-
|
|
|
|
-#ifdef AO_STRENGTH
|
|
|
|
- uniform float m_AoStrength;
|
|
|
|
-#endif
|
|
|
|
-
|
|
|
|
-#if defined(NORMALMAP) || defined(PARALLAXMAP)
|
|
|
|
- uniform sampler2D m_NormalMap;
|
|
|
|
- varying vec4 wTangent;
|
|
|
|
-#endif
|
|
|
|
-#ifdef NORMALSCALE
|
|
|
|
- uniform float m_NormalScale;
|
|
|
|
-#endif
|
|
|
|
-varying vec3 wNormal;
|
|
|
|
|
|
+#import "Common/ShaderLib/module/pbrlighting/PBRLightingUtils.glsllib"
|
|
|
|
|
|
-// Specular-AA
|
|
|
|
-#ifdef SPECULAR_AA_SCREEN_SPACE_VARIANCE
|
|
|
|
- uniform float m_SpecularAASigma;
|
|
|
|
-#endif
|
|
|
|
-#ifdef SPECULAR_AA_THRESHOLD
|
|
|
|
- uniform float m_SpecularAAKappa;
|
|
|
|
|
|
+#ifdef DEBUG_VALUES_MODE
|
|
|
|
+ uniform int m_DebugValuesMode;
|
|
#endif
|
|
#endif
|
|
|
|
|
|
-#ifdef DISCARD_ALPHA
|
|
|
|
- uniform float m_AlphaDiscardThreshold;
|
|
|
|
-#endif
|
|
|
|
|
|
+uniform vec4 g_LightData[NB_LIGHTS];
|
|
|
|
+uniform vec3 g_CameraPosition;
|
|
|
|
|
|
void main(){
|
|
void main(){
|
|
- vec2 newTexCoord;
|
|
|
|
- vec3 viewDir = normalize(g_CameraPosition - wPosition);
|
|
|
|
-
|
|
|
|
- vec3 norm = normalize(wNormal);
|
|
|
|
- #if defined(NORMALMAP) || defined(PARALLAXMAP)
|
|
|
|
- vec3 tan = normalize(wTangent.xyz);
|
|
|
|
- mat3 tbnMat = mat3(tan, wTangent.w * cross( (norm), (tan)), norm);
|
|
|
|
- #endif
|
|
|
|
-
|
|
|
|
- #if (defined(PARALLAXMAP) || (defined(NORMALMAP_PARALLAX) && defined(NORMALMAP)))
|
|
|
|
- vec3 vViewDir = viewDir * tbnMat;
|
|
|
|
- #ifdef STEEP_PARALLAX
|
|
|
|
- #ifdef NORMALMAP_PARALLAX
|
|
|
|
- //parallax map is stored in the alpha channel of the normal map
|
|
|
|
- newTexCoord = steepParallaxOffset(m_NormalMap, vViewDir, texCoord, m_ParallaxHeight);
|
|
|
|
- #else
|
|
|
|
- //parallax map is a texture
|
|
|
|
- newTexCoord = steepParallaxOffset(m_ParallaxMap, vViewDir, texCoord, m_ParallaxHeight);
|
|
|
|
- #endif
|
|
|
|
- #else
|
|
|
|
- #ifdef NORMALMAP_PARALLAX
|
|
|
|
- //parallax map is stored in the alpha channel of the normal map
|
|
|
|
- newTexCoord = classicParallaxOffset(m_NormalMap, vViewDir, texCoord, m_ParallaxHeight);
|
|
|
|
- #else
|
|
|
|
- //parallax map is a texture
|
|
|
|
- newTexCoord = classicParallaxOffset(m_ParallaxMap, vViewDir, texCoord, m_ParallaxHeight);
|
|
|
|
- #endif
|
|
|
|
- #endif
|
|
|
|
- #else
|
|
|
|
- newTexCoord = texCoord;
|
|
|
|
- #endif
|
|
|
|
|
|
+ vec3 wpos = PBRLightingUtils_getWorldPosition();
|
|
|
|
+ vec3 worldViewDir = normalize(g_CameraPosition - wpos);
|
|
|
|
|
|
- #ifdef BASECOLORMAP
|
|
|
|
- vec4 albedo = texture2D(m_BaseColorMap, newTexCoord) * Color;
|
|
|
|
- #else
|
|
|
|
- vec4 albedo = Color;
|
|
|
|
- #endif
|
|
|
|
-
|
|
|
|
- //ao in r channel, roughness in green channel, metallic in blue channel!
|
|
|
|
- vec3 aoRoughnessMetallicValue = vec3(1.0, 1.0, 0.0);
|
|
|
|
- #ifdef USE_PACKED_MR
|
|
|
|
- aoRoughnessMetallicValue = texture2D(m_MetallicRoughnessMap, newTexCoord).rgb;
|
|
|
|
- float Roughness = aoRoughnessMetallicValue.g * max(m_Roughness, 1e-4);
|
|
|
|
- float Metallic = aoRoughnessMetallicValue.b * max(m_Metallic, 0.0);
|
|
|
|
- #else
|
|
|
|
- #ifdef ROUGHNESSMAP
|
|
|
|
- float Roughness = texture2D(m_RoughnessMap, newTexCoord).r * max(m_Roughness, 1e-4);
|
|
|
|
- #else
|
|
|
|
- float Roughness = max(m_Roughness, 1e-4);
|
|
|
|
- #endif
|
|
|
|
- #ifdef METALLICMAP
|
|
|
|
- float Metallic = texture2D(m_MetallicMap, newTexCoord).r * max(m_Metallic, 0.0);
|
|
|
|
- #else
|
|
|
|
- float Metallic = max(m_Metallic, 0.0);
|
|
|
|
- #endif
|
|
|
|
- #endif
|
|
|
|
-
|
|
|
|
- float alpha = albedo.a;
|
|
|
|
-
|
|
|
|
- #ifdef DISCARD_ALPHA
|
|
|
|
- if(alpha < m_AlphaDiscardThreshold){
|
|
|
|
- discard;
|
|
|
|
- }
|
|
|
|
- #endif
|
|
|
|
-
|
|
|
|
- // ***********************
|
|
|
|
- // Read from textures
|
|
|
|
- // ***********************
|
|
|
|
- #if defined(NORMALMAP)
|
|
|
|
- vec4 normalHeight = texture2D(m_NormalMap, newTexCoord);
|
|
|
|
- // Note we invert directx style normal maps to opengl style
|
|
|
|
-
|
|
|
|
- #ifdef NORMALSCALE
|
|
|
|
- vec3 normal = normalize((normalHeight.xyz * vec3(2.0, NORMAL_TYPE * 2.0, 2.0) - vec3(1.0, NORMAL_TYPE * 1.0, 1.0)) * vec3(m_NormalScale, m_NormalScale, 1.0));
|
|
|
|
- #else
|
|
|
|
- vec3 normal = normalize((normalHeight.xyz * vec3(2.0, NORMAL_TYPE * 2.0, 2.0) - vec3(1.0, NORMAL_TYPE * 1.0, 1.0)));
|
|
|
|
- #endif
|
|
|
|
- normal = normalize(tbnMat * normal);
|
|
|
|
- //normal = normalize(normal * inverse(tbnMat));
|
|
|
|
- #else
|
|
|
|
- vec3 normal = norm;
|
|
|
|
- #endif
|
|
|
|
-
|
|
|
|
- #ifdef SPECGLOSSPIPELINE
|
|
|
|
-
|
|
|
|
- #ifdef USE_PACKED_SG
|
|
|
|
- vec4 specularColor = texture2D(m_SpecularGlossinessMap, newTexCoord);
|
|
|
|
- float glossiness = specularColor.a * m_Glossiness;
|
|
|
|
- specularColor *= m_Specular;
|
|
|
|
- #else
|
|
|
|
- #ifdef SPECULARMAP
|
|
|
|
- vec4 specularColor = texture2D(m_SpecularMap, newTexCoord);
|
|
|
|
- #else
|
|
|
|
- vec4 specularColor = vec4(1.0);
|
|
|
|
- #endif
|
|
|
|
- #ifdef GLOSSINESSMAP
|
|
|
|
- float glossiness = texture2D(m_GlossinessMap, newTexCoord).r * m_Glossiness;
|
|
|
|
- #else
|
|
|
|
- float glossiness = m_Glossiness;
|
|
|
|
- #endif
|
|
|
|
- specularColor *= m_Specular;
|
|
|
|
- #endif
|
|
|
|
- vec4 diffuseColor = albedo;// * (1.0 - max(max(specularColor.r, specularColor.g), specularColor.b));
|
|
|
|
- Roughness = 1.0 - glossiness;
|
|
|
|
- vec3 fZero = specularColor.xyz;
|
|
|
|
- #else
|
|
|
|
- vec4 specularColor = (0.04 - 0.04 * Metallic) + albedo * Metallic; // 0.04 is the standard base specular reflectance for non-metallic surfaces in PBR. While values like 0.08 can be used for different implementations, 0.04 aligns with Khronos' PBR specification.
|
|
|
|
- vec4 diffuseColor = albedo - albedo * Metallic;
|
|
|
|
- vec3 fZero = mix(vec3(0.04), albedo.rgb, Metallic);
|
|
|
|
- #endif
|
|
|
|
-
|
|
|
|
- gl_FragColor.rgb = vec3(0.0);
|
|
|
|
- vec3 ao = vec3(1.0);
|
|
|
|
-
|
|
|
|
- #ifdef LIGHTMAP
|
|
|
|
- vec3 lightMapColor;
|
|
|
|
- #ifdef SEPARATE_TEXCOORD
|
|
|
|
- lightMapColor = texture2D(m_LightMap, texCoord2).rgb;
|
|
|
|
- #else
|
|
|
|
- lightMapColor = texture2D(m_LightMap, texCoord).rgb;
|
|
|
|
- #endif
|
|
|
|
- #ifdef AO_MAP
|
|
|
|
- lightMapColor.gb = lightMapColor.rr;
|
|
|
|
- ao = lightMapColor;
|
|
|
|
- #else
|
|
|
|
- gl_FragColor.rgb += diffuseColor.rgb * lightMapColor;
|
|
|
|
- #endif
|
|
|
|
- specularColor.rgb *= lightMapColor;
|
|
|
|
- #endif
|
|
|
|
-
|
|
|
|
- #if defined(AO_PACKED_IN_MR_MAP) && defined(USE_PACKED_MR)
|
|
|
|
- ao = aoRoughnessMetallicValue.rrr;
|
|
|
|
- #endif
|
|
|
|
-
|
|
|
|
- #ifdef AO_STRENGTH
|
|
|
|
- ao = 1.0 + m_AoStrength * (ao - 1.0);
|
|
|
|
- // sanity check
|
|
|
|
- ao = clamp(ao, 0.0, 1.0);
|
|
|
|
- #endif
|
|
|
|
-
|
|
|
|
- #ifdef SPECULAR_AA
|
|
|
|
- float sigma = 1.0;
|
|
|
|
- float kappa = 0.18;
|
|
|
|
- #ifdef SPECULAR_AA_SCREEN_SPACE_VARIANCE
|
|
|
|
- sigma = m_SpecularAASigma;
|
|
|
|
- #endif
|
|
|
|
- #ifdef SPECULAR_AA_THRESHOLD
|
|
|
|
- kappa = m_SpecularAAKappa;
|
|
|
|
- #endif
|
|
|
|
- #endif
|
|
|
|
- float ndotv = max( dot( normal, viewDir ),0.0);
|
|
|
|
- for( int i = 0;i < NB_LIGHTS; i+=3){
|
|
|
|
- vec4 lightColor = g_LightData[i];
|
|
|
|
- vec4 lightData1 = g_LightData[i+1];
|
|
|
|
- vec4 lightDir;
|
|
|
|
- vec3 lightVec;
|
|
|
|
- lightComputeDir(wPosition, lightColor.w, lightData1, lightDir, lightVec);
|
|
|
|
-
|
|
|
|
- float fallOff = 1.0;
|
|
|
|
- #if __VERSION__ >= 110
|
|
|
|
- // allow use of control flow
|
|
|
|
- if(lightColor.w > 1.0){
|
|
|
|
- #endif
|
|
|
|
- fallOff = computeSpotFalloff(g_LightData[i+2], lightVec);
|
|
|
|
- #if __VERSION__ >= 110
|
|
|
|
- }
|
|
|
|
- #endif
|
|
|
|
- //point light attenuation
|
|
|
|
- fallOff *= lightDir.w;
|
|
|
|
-
|
|
|
|
- lightDir.xyz = normalize(lightDir.xyz);
|
|
|
|
- vec3 directDiffuse;
|
|
|
|
- vec3 directSpecular;
|
|
|
|
-
|
|
|
|
- #ifdef SPECULAR_AA
|
|
|
|
- float hdotv = PBR_ComputeDirectLightWithSpecularAA(
|
|
|
|
- normal, lightDir.xyz, viewDir,
|
|
|
|
- lightColor.rgb, fZero, Roughness, sigma, kappa, ndotv,
|
|
|
|
- directDiffuse, directSpecular);
|
|
|
|
- #else
|
|
|
|
- float hdotv = PBR_ComputeDirectLight(
|
|
|
|
- normal, lightDir.xyz, viewDir,
|
|
|
|
- lightColor.rgb, fZero, Roughness, ndotv,
|
|
|
|
- directDiffuse, directSpecular);
|
|
|
|
- #endif
|
|
|
|
|
|
+ // Create a blank PBRSurface.
|
|
|
|
+ PBRSurface surface = PBRLightingUtils_createPBRSurface(worldViewDir);
|
|
|
|
+
|
|
|
|
+ // Read surface data from standard PBR matParams. (note: matParams are declared in 'PBRLighting.j3md' and initialized as uniforms in 'PBRLightingUtils.glsllib')
|
|
|
|
+ PBRLightingUtils_readPBRSurface(surface);
|
|
|
|
|
|
- vec3 directLighting = diffuseColor.rgb *directDiffuse + directSpecular;
|
|
|
|
-
|
|
|
|
- gl_FragColor.rgb += directLighting * fallOff;
|
|
|
|
|
|
+ //Calculate necessary variables from pbr surface prior to applying lighting. Ensure all texture/param reading and blending occurrs prior to this being called!
|
|
|
|
+ PBRLightingUtils_calculatePreLightingValues(surface);
|
|
|
|
+
|
|
|
|
+ // Calculate direct lights
|
|
|
|
+ for(int i = 0;i < NB_LIGHTS; i+=3){
|
|
|
|
+ vec4 lightData0 = g_LightData[i];
|
|
|
|
+ vec4 lightData1 = g_LightData[i+1];
|
|
|
|
+ vec4 lightData2 = g_LightData[i+2];
|
|
|
|
+ PBRLightingUtils_computeDirectLightContribution(
|
|
|
|
+ lightData0, lightData1, lightData2,
|
|
|
|
+ surface
|
|
|
|
+ );
|
|
}
|
|
}
|
|
|
|
|
|
- #if NB_PROBES >= 1
|
|
|
|
- vec3 color1 = vec3(0.0);
|
|
|
|
- vec3 color2 = vec3(0.0);
|
|
|
|
- vec3 color3 = vec3(0.0);
|
|
|
|
- float weight1 = 1.0;
|
|
|
|
- float weight2 = 0.0;
|
|
|
|
- float weight3 = 0.0;
|
|
|
|
-
|
|
|
|
- float ndf = renderProbe(viewDir, wPosition, normal, norm, Roughness, diffuseColor, specularColor, ndotv, ao, g_LightProbeData, g_ShCoeffs, g_PrefEnvMap, color1);
|
|
|
|
- #if NB_PROBES >= 2
|
|
|
|
- float ndf2 = renderProbe(viewDir, wPosition, normal, norm, Roughness, diffuseColor, specularColor, ndotv, ao, g_LightProbeData2, g_ShCoeffs2, g_PrefEnvMap2, color2);
|
|
|
|
- #endif
|
|
|
|
- #if NB_PROBES == 3
|
|
|
|
- float ndf3 = renderProbe(viewDir, wPosition, normal, norm, Roughness, diffuseColor, specularColor, ndotv, ao, g_LightProbeData3, g_ShCoeffs3, g_PrefEnvMap3, color3);
|
|
|
|
- #endif
|
|
|
|
|
|
|
|
- #if NB_PROBES >= 2
|
|
|
|
- float invNdf = max(1.0 - ndf,0.0);
|
|
|
|
- float invNdf2 = max(1.0 - ndf2,0.0);
|
|
|
|
- float sumNdf = ndf + ndf2;
|
|
|
|
- float sumInvNdf = invNdf + invNdf2;
|
|
|
|
- #if NB_PROBES == 3
|
|
|
|
- float invNdf3 = max(1.0 - ndf3,0.0);
|
|
|
|
- sumNdf += ndf3;
|
|
|
|
- sumInvNdf += invNdf3;
|
|
|
|
- weight3 = ((1.0 - (ndf3 / sumNdf)) / (NB_PROBES - 1)) * (invNdf3 / sumInvNdf);
|
|
|
|
- #endif
|
|
|
|
|
|
+ // Calculate env probes
|
|
|
|
+ PBRLightingUtils_computeProbesContribution(surface);
|
|
|
|
|
|
- weight1 = ((1.0 - (ndf / sumNdf)) / (NB_PROBES - 1)) * (invNdf / sumInvNdf);
|
|
|
|
- weight2 = ((1.0 - (ndf2 / sumNdf)) / (NB_PROBES - 1)) * (invNdf2 / sumInvNdf);
|
|
|
|
-
|
|
|
|
- float weightSum = weight1 + weight2 + weight3;
|
|
|
|
-
|
|
|
|
- weight1 /= weightSum;
|
|
|
|
- weight2 /= weightSum;
|
|
|
|
- weight3 /= weightSum;
|
|
|
|
- #endif
|
|
|
|
-
|
|
|
|
- #ifdef USE_AMBIENT_LIGHT
|
|
|
|
- color1.rgb *= g_AmbientLightColor.rgb;
|
|
|
|
- color2.rgb *= g_AmbientLightColor.rgb;
|
|
|
|
- color3.rgb *= g_AmbientLightColor.rgb;
|
|
|
|
- #endif
|
|
|
|
- gl_FragColor.rgb += color1 * clamp(weight1,0.0,1.0) + color2 * clamp(weight2,0.0,1.0) + color3 * clamp(weight3,0.0,1.0);
|
|
|
|
-
|
|
|
|
- #endif
|
|
|
|
-
|
|
|
|
- #if defined(EMISSIVE) || defined (EMISSIVEMAP)
|
|
|
|
- #ifdef EMISSIVEMAP
|
|
|
|
- vec4 emissive = texture2D(m_EmissiveMap, newTexCoord);
|
|
|
|
- #ifdef EMISSIVE
|
|
|
|
- emissive *= m_Emissive;
|
|
|
|
- #endif
|
|
|
|
- #else
|
|
|
|
- vec4 emissive = m_Emissive;
|
|
|
|
- #endif
|
|
|
|
- gl_FragColor += emissive * pow(emissive.a, m_EmissivePower) * m_EmissiveIntensity;
|
|
|
|
- #endif
|
|
|
|
- gl_FragColor.a = alpha;
|
|
|
|
-
|
|
|
|
|
|
+ // Put it all together
|
|
|
|
+ gl_FragColor.rgb = vec3(0.0);
|
|
|
|
+ gl_FragColor.rgb += surface.bakedLightContribution;
|
|
|
|
+ gl_FragColor.rgb += surface.directLightContribution;
|
|
|
|
+ gl_FragColor.rgb += surface.envLightContribution;
|
|
|
|
+ gl_FragColor.rgb += surface.emission;
|
|
|
|
+ gl_FragColor.a = surface.alpha;
|
|
|
|
+
|
|
|
|
+ //outputs the final value of the selected layer as a color for debug purposes.
|
|
|
|
+ #ifdef DEBUG_VALUES_MODE
|
|
|
|
+ gl_FragColor = PBRLightingUtils_getColorOutputForDebugMode(m_DebugValuesMode, vec4(gl_FragColor.rgba), surface);
|
|
|
|
+ #endif
|
|
}
|
|
}
|