Files
LNXSDK/leenkx/Shaders/std/light_mobile.glsl

353 lines
9.1 KiB
Plaintext
Raw Normal View History

2025-01-22 16:18:30 +01:00
#ifndef _LIGHT_MOBILE_GLSL_
#define _LIGHT_MOBILE_GLSL_
#include "compiled.inc"
#include "std/brdf.glsl"
#ifdef _ShadowMap
#include "std/shadows.glsl"
#endif
#ifdef _Spot
#include "std/light_common.glsl"
#endif
#ifdef _ShadowMap
#ifdef _SinglePoint
#ifdef _Spot
uniform sampler2DShadow shadowMapSpot[1];
2026-09-16 12:40:39 -07:00
#ifdef _ShadowMapTransparent
uniform sampler2D shadowMapSpotTransparent[1];
#endif
2026-08-07 02:04:01 -07:00
uniform mat4 LWVPSpotArray[1];
2025-01-22 16:18:30 +01:00
#else
uniform samplerCubeShadow shadowMapPoint[1];
2026-09-16 12:40:39 -07:00
#ifdef _ShadowMapTransparent
uniform samplerCube shadowMapPointTransparent[1];
#endif
2025-01-22 16:18:30 +01:00
uniform vec2 lightProj;
#endif
#endif
#ifdef _Clusters
#ifdef _SingleAtlas
//!uniform sampler2DShadow shadowMapAtlas;
2026-09-16 12:40:39 -07:00
#ifdef _ShadowMapTransparent
//!uniform sampler2D shadowMapAtlasTransparent;
#endif
2025-01-22 16:18:30 +01:00
#endif
2026-08-07 02:04:01 -07:00
#ifndef _SinglePoint
2025-01-22 16:18:30 +01:00
uniform vec2 lightProj;
2026-08-07 02:04:01 -07:00
#endif
2025-01-22 16:18:30 +01:00
#ifdef _ShadowMapAtlas
#ifndef _SingleAtlas
uniform sampler2DShadow shadowMapAtlasPoint;
2026-09-16 12:40:39 -07:00
#ifdef _ShadowMapTransparent
uniform sampler2D shadowMapAtlasPointTransparent;
#endif
2025-01-22 16:18:30 +01:00
#endif
#else
uniform samplerCubeShadow shadowMapPoint[4];
2026-09-16 12:40:39 -07:00
#ifdef _ShadowMapTransparent
uniform samplerCube shadowMapPointTransparent[4];
#endif
2025-01-22 16:18:30 +01:00
#endif
#ifdef _Spot
#ifdef _ShadowMapAtlas
#ifndef _SingleAtlas
uniform sampler2DShadow shadowMapAtlasSpot;
2026-09-16 12:40:39 -07:00
#ifdef _ShadowMapTransparent
uniform sampler2D shadowMapAtlasSpotTransparent;
#endif
2025-01-22 16:18:30 +01:00
#endif
#else
uniform sampler2DShadow shadowMapSpot[maxLightsCluster];
2026-09-16 12:40:39 -07:00
#ifdef _ShadowMapTransparent
uniform sampler2D shadowMapSpotTransparent[maxLightsCluster];
#endif
2025-01-22 16:18:30 +01:00
#endif
uniform mat4 LWVPSpotArray[maxLightsCluster];
#endif
#endif
#endif
vec3 sampleLight(const vec3 p, const vec3 n, const vec3 v, const float dotNV, const vec3 lp, const vec3 lightCol,
const vec3 albedo, const float rough, const float spec, const vec3 f0
#ifdef _ShadowMap
, int index, float bias, bool receiveShadow
2026-09-16 12:40:39 -07:00
#ifdef _ShadowMapTransparent
, bool transparent
#endif
2025-01-22 16:18:30 +01:00
#endif
#ifdef _Spot
, bool isSpot, float spotSize, float spotBlend, vec3 spotDir, vec2 scale, vec3 right
#endif
2026-07-27 12:10:11 -07:00
#ifdef _ClearCoat
2026-08-07 02:04:01 -07:00
, float clearcoat, float clearcoatRough, float coatIOR, vec3 coatTint, vec3 coatN
2026-07-27 12:10:11 -07:00
#endif
#ifdef _Sheen
, float sheen, float sheenRough, vec3 sheenTint
#endif
#ifdef _Anisotropy
, float anisotropy, float anisoRot, vec3 tangent
#endif
2026-08-07 02:04:01 -07:00
#ifdef _SSS
2026-07-27 12:10:11 -07:00
, float subsurface, vec3 sssColor, vec3 sssRadius, float sssAnisotropy
#endif
#ifdef _Transmission
, float transmission, float transRough, float ior, float thinWall
#endif
2025-01-22 16:18:30 +01:00
) {
vec3 ld = lp - p;
2026-08-07 02:04:01 -07:00
float dist = length(ld);
vec3 l = ld / dist;
2025-01-22 16:18:30 +01:00
vec3 h = normalize(v + l);
float dotNH = max(0.0, dot(n, h));
float dotVH = max(0.0, dot(v, h));
float dotNL = max(0.0, dot(n, l));
2026-07-27 12:10:11 -07:00
#ifdef _Anisotropy
vec3 direct;
2026-08-07 02:04:01 -07:00
if (abs(anisotropy) > 0.001 && dot(tangent, tangent) > 0.001) {
2026-07-27 12:10:11 -07:00
vec3 bitangent = normalize(cross(n, tangent));
direct = diffuseBRDF(albedo, rough, f0, dotNL, dotNV, dotVH) +
2026-07-27 12:10:11 -07:00
anisotropicBRDF(f0, rough, anisotropy, anisoRot,
tangent, bitangent, n, l, v, dotNL, dotNV) * spec;
} else {
direct = diffuseBRDF(albedo, rough, f0, dotNL, dotNV, dotVH) +
2026-07-27 12:10:11 -07:00
specularBRDF(f0, rough, dotNL, dotNH, dotNV, dotVH) * spec;
}
#else
vec3 direct = diffuseBRDF(albedo, rough, f0, dotNL, dotNV, dotVH) +
specularBRDF(f0, rough, dotNL, dotNH, dotNV, dotVH) * spec;
2026-07-27 12:10:11 -07:00
#endif
2026-08-07 02:04:01 -07:00
#ifdef _ExtBRDF
float layerWeight;
direct = applyExtBRDFLayers(direct, albedo, f0, rough, dotNL, dotNV, dotNH, dotVH, n, l, v, h
#ifdef _ClearCoat
, clearcoat, clearcoatRough, coatIOR, coatTint, coatN
#endif
#ifdef _Sheen
, sheen, sheenRough, sheenTint
#endif
#ifdef _Transmission
, transmission, transRough, ior, thinWall
#endif
, layerWeight
);
2026-07-27 12:10:11 -07:00
#endif
2025-01-22 16:18:30 +01:00
direct *= lightCol;
2026-08-07 02:04:01 -07:00
direct *= attenuate(dist);
2025-01-22 16:18:30 +01:00
#ifdef _Spot
if (isSpot) {
direct *= spotlightMask(l, spotDir, right, scale, spotSize, spotBlend);
#ifdef _ShadowMap
if (receiveShadow) {
#ifdef _SinglePoint
2026-09-16 12:40:39 -07:00
vec4 lPos = LWVPSpotArray[0] * vec4(p + n * bias * 10, 1.0);
direct *= shadowTest(shadowMapSpot[0],
#ifdef _ShadowMapTransparent
shadowMapSpotTransparent[0],
#endif
lPos.xyz / lPos.w, bias
#ifdef _ShadowMapTransparent
, transparent
#endif
);
2025-01-22 16:18:30 +01:00
#endif
#ifdef _Clusters
vec4 lPos = LWVPSpotArray[index] * vec4(p + n * bias * 10, 1.0);
#ifdef _ShadowMapAtlas
2026-09-16 12:40:39 -07:00
tileBounds = tileBoundsSpotArray[index];
direct *= shadowTest(
#ifdef _ShadowMapTransparent
#ifndef _SingleAtlas
shadowMapAtlasSpot, shadowMapAtlasSpotTransparent
#else
shadowMapAtlas, shadowMapAtlasTransparent
#endif
#else
#ifndef _SingleAtlas
shadowMapAtlasSpot
#else
shadowMapAtlas
#endif
#endif
, lPos.xyz / lPos.w, bias
#ifdef _ShadowMapTransparent
, transparent
#endif
);
#else
if (index == 0) direct *= shadowTest(shadowMapSpot[0],
#ifdef _ShadowMapTransparent
shadowMapSpotTransparent[0],
#endif
lPos.xyz / lPos.w, bias
#ifdef _ShadowMapTransparent
, transparent
#endif
);
else if (index == 1) direct *= shadowTest(shadowMapSpot[1],
#ifdef _ShadowMapTransparent
shadowMapSpotTransparent[1],
#endif
lPos.xyz / lPos.w, bias
#ifdef _ShadowMapTransparent
, transparent
2025-01-22 16:18:30 +01:00
#endif
2026-09-16 12:40:39 -07:00
);
else if (index == 2) direct *= shadowTest(shadowMapSpot[2],
#ifdef _ShadowMapTransparent
shadowMapSpotTransparent[2],
#endif
lPos.xyz / lPos.w, bias
#ifdef _ShadowMapTransparent
, transparent
#endif
);
else if (index == 3) direct *= shadowTest(shadowMapSpot[3],
#ifdef _ShadowMapTransparent
shadowMapSpotTransparent[3],
#endif
lPos.xyz / lPos.w, bias
#ifdef _ShadowMapTransparent
, transparent
#endif
);
2025-01-22 16:18:30 +01:00
#endif
#endif
}
#endif
return direct;
}
#endif
#ifdef _ShadowMap
if (receiveShadow) {
#ifdef _SinglePoint
2026-09-16 12:40:39 -07:00
#ifndef _Spot
direct *= PCFCube(shadowMapPoint[0],
#ifdef _ShadowMapTransparent
shadowMapPointTransparent[0],
2025-01-22 16:18:30 +01:00
#endif
2026-09-16 12:40:39 -07:00
ld, -l, bias, lightProj, n
#ifdef _ShadowMapTransparent
, transparent
2025-01-22 16:18:30 +01:00
#endif
2026-09-16 12:40:39 -07:00
);
#endif
#endif
2025-01-22 16:18:30 +01:00
#ifdef _Clusters
#ifdef _ShadowMapAtlas
2026-09-16 12:40:39 -07:00
direct *= PCFFakeCube(
#ifdef _ShadowMapTransparent
#ifndef _SingleAtlas
shadowMapAtlasPoint, shadowMapAtlasPointTransparent
#else
shadowMapAtlas, shadowMapAtlasTransparent
#endif
2025-01-22 16:18:30 +01:00
#else
2026-09-16 12:40:39 -07:00
#ifndef _SingleAtlas
shadowMapAtlasPoint
#else
shadowMapAtlas
#endif
#endif
, ld, -l, bias, lightProj, n, index
#ifdef _ShadowMapTransparent
, transparent
#endif
);
#else
if (index == 0) direct *= PCFCube(shadowMapPoint[0],
#ifdef _ShadowMapTransparent
shadowMapPointTransparent[0],
#endif
ld, -l, bias, lightProj, n
#ifdef _ShadowMapTransparent
, transparent
#endif
);
else if (index == 1) direct *= PCFCube(shadowMapPoint[1],
#ifdef _ShadowMapTransparent
shadowMapPointTransparent[1],
#endif
ld, -l, bias, lightProj, n
#ifdef _ShadowMapTransparent
, transparent
#endif
);
else if (index == 2) direct *= PCFCube(shadowMapPoint[2],
#ifdef _ShadowMapTransparent
shadowMapPointTransparent[2],
#endif
ld, -l, bias, lightProj, n
#ifdef _ShadowMapTransparent
, transparent
#endif
);
else if (index == 3) direct *= PCFCube(shadowMapPoint[3],
#ifdef _ShadowMapTransparent
shadowMapPointTransparent[3],
#endif
ld, -l, bias, lightProj, n
#ifdef _ShadowMapTransparent
, transparent
#endif
);
2025-01-22 16:18:30 +01:00
#endif
#endif
}
#endif
return direct;
}
2026-08-07 02:04:01 -07:00
// Backward-compatible overload for generated shaders that don't pass extended BRDF params
#ifdef _ExtBRDF
vec3 sampleLight(const vec3 p, const vec3 n, const vec3 v, const float dotNV, const vec3 lp, const vec3 lightCol,
const vec3 albedo, const float rough, const float spec, const vec3 f0
#ifdef _ShadowMap
, int index, float bias, bool receiveShadow
2026-09-16 12:40:39 -07:00
#ifdef _ShadowMapTransparent
, bool transparent
#endif
2026-08-07 02:04:01 -07:00
#endif
#ifdef _Spot
, bool isSpot, float spotSize, float spotBlend, vec3 spotDir, vec2 scale, vec3 right
#endif
) {
return sampleLight(p, n, v, dotNV, lp, lightCol, albedo, rough, spec, f0
#ifdef _ShadowMap
, index, bias, receiveShadow
2026-09-16 12:40:39 -07:00
#ifdef _ShadowMapTransparent
, transparent
#endif
2026-08-07 02:04:01 -07:00
#endif
#ifdef _Spot
, isSpot, spotSize, spotBlend, spotDir, scale, right
#endif
#ifdef _ClearCoat
, 0.0, 0.0, 1.5, vec3(1.0), n
#endif
#ifdef _Sheen
, 0.0, 0.0, vec3(1.0)
#endif
#ifdef _Anisotropy
, 0.0, 0.0, vec3(0.0)
#endif
#ifdef _SSS
, 0.0, vec3(0.0), vec3(0.0), 0.0
#endif
#ifdef _Transmission
, 0.0, 0.0, 1.45, 1.0
#endif
);
}
#endif // _ExtBRDF
2025-01-22 16:18:30 +01:00
#endif