@luma.gl/shadertools
Version:
Shader module system for luma.gl
87 lines (73 loc) • 2.3 kB
text/typescript
// luma.gl
// SPDX-License-Identifier: MIT
// Copyright (c) vis.gl contributors
export const lightingUniformsGLSL = /* glsl */ `\
precision highp int;
// #if (defined(SHADER_TYPE_FRAGMENT) && defined(LIGHTING_FRAGMENT)) || (defined(SHADER_TYPE_VERTEX) && defined(LIGHTING_VERTEX))
struct AmbientLight {
vec3 color;
};
struct PointLight {
vec3 color;
vec3 position;
vec3 attenuation; // 2nd order x:Constant-y:Linear-z:Exponential
};
struct SpotLight {
vec3 color;
vec3 position;
vec3 direction;
vec3 attenuation;
vec2 coneCos;
};
struct DirectionalLight {
vec3 color;
vec3 direction;
};
struct UniformLight {
vec3 color;
vec3 position;
vec3 direction;
vec3 attenuation;
vec2 coneCos;
};
layout(std140) uniform lightingUniforms {
int enabled;
int directionalLightCount;
int pointLightCount;
int spotLightCount;
vec3 ambientColor;
UniformLight lights[5];
} lighting;
PointLight lighting_getPointLight(int index) {
UniformLight light = lighting.lights[index];
return PointLight(light.color, light.position, light.attenuation);
}
SpotLight lighting_getSpotLight(int index) {
UniformLight light = lighting.lights[lighting.pointLightCount + index];
return SpotLight(light.color, light.position, light.direction, light.attenuation, light.coneCos);
}
DirectionalLight lighting_getDirectionalLight(int index) {
UniformLight light =
lighting.lights[lighting.pointLightCount + lighting.spotLightCount + index];
return DirectionalLight(light.color, light.direction);
}
float getPointLightAttenuation(PointLight pointLight, float distance) {
return pointLight.attenuation.x
+ pointLight.attenuation.y * distance
+ pointLight.attenuation.z * distance * distance;
}
float getSpotLightAttenuation(SpotLight spotLight, vec3 positionWorldspace) {
vec3 light_direction = normalize(positionWorldspace - spotLight.position);
float coneFactor = smoothstep(
spotLight.coneCos.y,
spotLight.coneCos.x,
dot(normalize(spotLight.direction), light_direction)
);
float distanceAttenuation = getPointLightAttenuation(
PointLight(spotLight.color, spotLight.position, spotLight.attenuation),
distance(spotLight.position, positionWorldspace)
);
return distanceAttenuation / max(coneFactor, 0.0001);
}
// #endif
`;