diff --git a/leenkx/Shaders/deferred_light/deferred_light.frag.glsl b/leenkx/Shaders/deferred_light/deferred_light.frag.glsl index a722c85..73788ff 100644 --- a/leenkx/Shaders/deferred_light/deferred_light.frag.glsl +++ b/leenkx/Shaders/deferred_light/deferred_light.frag.glsl @@ -20,7 +20,7 @@ uniform sampler2D gbuffer0; uniform sampler2D gbuffer1; #ifdef _gbuffer2 - //!uniform sampler2D gbuffer2; + uniform sampler2D gbuffer2; #endif #ifdef _EmissionShaded uniform sampler2D gbufferEmission; @@ -29,10 +29,11 @@ uniform sampler2D gbuffer1; #ifdef _VoxelGI uniform sampler2D voxels_diffuse; uniform sampler2D voxels_specular; -#endif +#else #ifdef _VoxelAOvar uniform sampler2D voxels_ao; #endif +#endif #ifdef _VoxelShadow uniform sampler3D voxels; uniform sampler3D voxelsSDF; @@ -117,11 +118,15 @@ uniform vec2 cameraPlane; #ifdef _SinglePoint #ifdef _Spot //!uniform sampler2DShadow shadowMapSpot[1]; + #ifdef _ShadowMapTransparent //!uniform sampler2D shadowMapSpotTransparent[1]; + #endif //!uniform mat4 LWVPSpot[1]; #else //!uniform samplerCubeShadow shadowMapPoint[1]; + #ifdef _ShadowMapTransparent //!uniform samplerCube shadowMapPointTransparent[1]; + #endif //!uniform vec2 lightProj; #endif #endif @@ -129,30 +134,40 @@ uniform vec2 cameraPlane; #ifdef _ShadowMapAtlas #ifdef _SingleAtlas uniform sampler2DShadow shadowMapAtlas; + #ifdef _ShadowMapTransparent uniform sampler2D shadowMapAtlasTransparent; #endif + #endif #endif #ifdef _ShadowMapAtlas #ifndef _SingleAtlas //!uniform sampler2DShadow shadowMapAtlasPoint; + #ifdef _ShadowMapTransparent //!uniform sampler2D shadowMapAtlasPointTransparent; #endif - //!uniform vec4 pointLightDataArray[4]; + #endif + //!uniform vec4 pointLightDataArray[maxLightsCluster * 6]; #else //!uniform samplerCubeShadow shadowMapPoint[4]; + #ifdef _ShadowMapTransparent //!uniform samplerCube shadowMapPointTransparent[4]; + #endif #endif //!uniform vec2 lightProj; #ifdef _Spot #ifdef _ShadowMapAtlas #ifndef _SingleAtlas //!uniform sampler2DShadow shadowMapAtlasSpot; + #ifdef _ShadowMapTransparent //!uniform sampler2D shadowMapAtlasSpotTransparent; #endif + #endif #else //!uniform sampler2DShadow shadowMapSpot[4]; + #ifdef _ShadowMapTransparent //!uniform sampler2D shadowMapSpotTransparent[4]; #endif + #endif //!uniform mat4 LWVPSpotArray[maxLightsCluster]; #endif #endif @@ -165,12 +180,16 @@ uniform vec3 sunCol; #ifdef _ShadowMapAtlas #ifndef _SingleAtlas uniform sampler2DShadow shadowMapAtlasSun; + #ifdef _ShadowMapTransparent uniform sampler2D shadowMapAtlasSunTransparent; #endif + #endif #else uniform sampler2DShadow shadowMap; + #ifdef _ShadowMapTransparent uniform sampler2D shadowMapTransparent; #endif + #endif uniform float shadowsBias; #ifdef _CSM //!uniform vec4 casData[shadowmapCascades * 4 + 4]; @@ -231,21 +250,22 @@ void main() { vec4 g2 = textureLod(gbuffer2, texCoord, 0.0); #endif + #ifdef _MicroShadowing occspec.x = mix(1.0, occspec.x, dotNV); // AO Fresnel #endif #ifdef _Brdf vec2 envBRDF = texelFetch(senvmapBrdf, ivec2(vec2(dotNV, 1.0 - roughness) * 256.0), 0).xy; - vec3 F = f0 * envBRDF.x + envBRDF.y; + vec3 F = f0 * envBRDF.x + envBRDF.y; +#else + vec3 F = f0; #endif - #ifndef _VoxelAOvar #ifndef _VoxelGI -// Envmap + // Envmap #ifdef _Irr - vec3 envl = shIrradiance(n, shirr); #ifdef _gbuffer2 @@ -279,14 +299,14 @@ void main() { envl.rgb *= albedo; #ifdef _Brdf - envl.rgb *= 1.0 - F; + envl.rgb *= 1.0 - F; //LV: We should take refracted light into account #endif #ifdef _Rad // Indirect specular - envl.rgb += prefilteredColor * F; + envl.rgb += prefilteredColor * F; //LV: Removed "1.5 * occspec.y". Specular should be weighted only by FV LUT #else #ifdef _EnvCol - envl.rgb += backgroundCol * F; + envl.rgb += backgroundCol * F; //LV: Eh, what's the point of weighting it only by F0? #endif #endif @@ -301,7 +321,6 @@ void main() { if(roughness < 1.0 && occspec.y > 0.0) fragColor.rgb += textureLod(voxels_specular, texCoord, 0.0).rgb * F * voxelgiRefl; #else - #ifdef _VoxelAOvar fragColor.rgb = textureLod(voxels_ao, texCoord, 0.0).rgb * voxelgiOcc; #endif @@ -356,46 +375,76 @@ void main() { float sdotVH = max(0.0, dot(v, sh)); float sdotNL = max(0.0, dot(n, sunDir)); vec3 svisibility = vec3(1.0); - vec3 sdirect = lambertDiffuseBRDF(albedo, sdotNL) + + vec3 sdirect = lambertDiffuseBRDF(albedo, sdotNL) + specularBRDF(f0, roughness, sdotNL, sdotNH, dotNV, sdotVH) * occspec.y; #ifdef _ShadowMap #ifdef _CSM svisibility = shadowTestCascade( - #ifdef _ShadowMapAtlas - #ifndef _SingleAtlas - shadowMapAtlasSun, shadowMapAtlasSunTransparent - #else - shadowMapAtlas, shadowMapAtlasTransparent - #endif - #else - shadowMap, shadowMapTransparent - #endif - , eye, p + n * shadowsBias * 10, shadowsBias, false - ); + #ifdef _ShadowMapAtlas + #ifdef _ShadowMapTransparent + #ifndef _SingleAtlas + shadowMapAtlasSun, shadowMapAtlasSunTransparent + #else + shadowMapAtlas, shadowMapAtlasTransparent + #endif + #else + #ifndef _SingleAtlas + shadowMapAtlasSun + #else + shadowMapAtlas + #endif + #endif + #else + #ifdef _ShadowMapTransparent + shadowMap, shadowMapTransparent + #else + shadowMap + #endif + #endif + , eye, p + n * shadowsBias * 10, shadowsBias + #ifdef _ShadowMapTransparent + , false + #endif + ); #else vec4 lPos = LWVP * vec4(p + n * shadowsBias * 100, 1.0); if (lPos.w > 0.0) { svisibility = shadowTest( - #ifdef _ShadowMapAtlas - #ifndef _SingleAtlas - shadowMapAtlasSun, shadowMapAtlasSunTransparent - #else - shadowMapAtlas, shadowMapAtlasTransparent - #endif - #else - shadowMap, shadowMapTransparent - #endif - , lPos.xyz / lPos.w, shadowsBias, false - ); + #ifdef _ShadowMapAtlas + #ifdef _ShadowMapTransparent + #ifndef _SingleAtlas + shadowMapAtlasSun, shadowMapAtlasSunTransparent + #else + shadowMapAtlas, shadowMapAtlasTransparent + #endif + #else + #ifndef _SingleAtlas + shadowMapAtlasSun + #else + shadowMapAtlas + #endif + #endif + #else + #ifdef _ShadowMapTransparent + shadowMap, shadowMapTransparent + #else + shadowMap + #endif + #endif + , lPos.xyz / lPos.w, shadowsBias + #ifdef _ShadowMapTransparent + , false + #endif + ); } #endif #endif #ifdef _VoxelShadow - svisibility *= (1.0 - traceShadow(p, n, voxels, voxelsSDF, sunDir, clipmaps, gl_FragCoord.xy, g2.rg).r) * voxelgiShad; + svisibility *= (1.0 - traceShadow(p, n, voxels, voxelsSDF, sunDir, clipmaps, gl_FragCoord.xy, -g2.rg).r) * voxelgiShad; #endif - + #ifdef _SSRS // vec2 coords = getProjectedCoord(hitCoord); // vec2 deltaCoords = abs(vec2(0.5, 0.5) - coords.xy); @@ -452,7 +501,10 @@ void main() { fragColor.rgb += sampleLight( p, n, v, dotNV, pointPos, pointCol, albedo, roughness, occspec.y, f0 #ifdef _ShadowMap - , 0, pointBias, true, false + , 0, pointBias, true + #ifdef _ShadowMapTransparent + , false + #endif #endif #ifdef _Spot , true, spotData.x, spotData.y, spotDir, spotData.zw, spotRight @@ -505,7 +557,10 @@ void main() { f0 #ifdef _ShadowMap // light index, shadow bias, cast_shadows - , li, lightsArray[li * 3 + 2].x, lightsArray[li * 3 + 2].z != 0.0, false + , li, lightsArray[li * 3 + 2].x, lightsArray[li * 3 + 2].z != 0.0 + #ifdef _ShadowMapTransparent + , false + #endif #endif #ifdef _Spot , lightsArray[li * 3 + 2].y != 0.0 @@ -527,6 +582,5 @@ void main() { ); } #endif // _Clusters - fragColor.a = 1.0; // Mark as opaque }