lygia
/distort
/chromaAB
)Chroma Aberration
Dependencies:
Use:
chromaAB(<SAMPLER_TYPE> texture, <vec2> st [, <float|vec2> sdf|offset, <float> pct])
#ifndef CHROMAAB_PCT
#define CHROMAAB_PCT 1.5
#endif
#ifndef CHROMAAB_TYPE
#define CHROMAAB_TYPE vec3
#endif
#ifndef CHROMAAB_SAMPLER_FNC
#define CHROMAAB_SAMPLER_FNC(TEX, UV) SAMPLER_FNC(TEX, UV)
#endif
#ifndef FNC_CHROMAAB
#define FNC_CHROMAAB
CHROMAAB_TYPE chromaAB(in SAMPLER_TYPE tex, in vec2 st, in vec2 direction, in vec3 distortion ) {
vec2 offset = vec2(0.0);
CHROMAAB_TYPE c = CHROMAAB_TYPE(1.);
c.r = CHROMAAB_SAMPLER_FNC(tex, st + direction * distortion.r).r;
c.g = CHROMAAB_SAMPLER_FNC(tex, st + direction * distortion.g).g;
c.b = CHROMAAB_SAMPLER_FNC(tex, st + direction * distortion.b).b;
return c;
}
CHROMAAB_TYPE chromaAB(in SAMPLER_TYPE tex, in vec2 st, in vec2 offset, in float pct) {
#ifdef CHROMAAB_CENTER_BUFFER
// modify the distance from the center, so that only the edges are affected
offset = max(offset - CHROMAAB_CENTER_BUFFER, 0.);
#endif
// Distort the UVs
vec2 stR = st * (1.0 + offset * 0.02 * pct),
stB = st * (1.0 - offset * 0.02 * pct);
// Get the individual channels using the modified UVs
CHROMAAB_TYPE c = CHROMAAB_TYPE(1.);
c.r = CHROMAAB_SAMPLER_FNC(tex, stR).r;
c.g = CHROMAAB_SAMPLER_FNC(tex, st).g;
c.b = CHROMAAB_SAMPLER_FNC(tex, stB).b;
return c;
}
CHROMAAB_TYPE chromaAB(in SAMPLER_TYPE tex, in vec2 st, in float sdf, in float pct) {
return chromaAB(tex, st, vec2(sdf), pct);
}
CHROMAAB_TYPE chromaAB(in SAMPLER_TYPE tex, in vec2 st, in float sdf) {
return chromaAB(tex, st, sdf, CHROMAAB_PCT);
}
CHROMAAB_TYPE chromaAB(in SAMPLER_TYPE tex, in vec2 st, in vec2 offset) {
return chromaAB(tex, st, offset, CHROMAAB_PCT);
}
CHROMAAB_TYPE chromaAB(in SAMPLER_TYPE tex, in vec2 st) {
return chromaAB(tex, st, lengthSq(st - .5), CHROMAAB_PCT);
}
#endif
Dependencies:
Use:
chromaAB(<SAMPLER_TYPE> texture, <float2> st [, <float|float2> sdf|offset, <float> pct])
#ifndef CHROMAAB_PCT
#define CHROMAAB_PCT 1.5
#endif
#ifndef CHROMAAB_TYPE
#define CHROMAAB_TYPE float3
#endif
#ifndef CHROMAAB_SAMPLER_FNC
#define CHROMAAB_SAMPLER_FNC(TEX, UV) SAMPLER_FNC(TEX, UV)
#endif
#ifndef FNC_CHROMAAB
#define FNC_CHROMAAB
CHROMAAB_TYPE chromaAB(in SAMPLER_TYPE tex, in float2 st, in float2 direction, in float3 distortion ) {
CHROMAAB_TYPE c = float4(1., 1., 1., 1.);
c.r = CHROMAAB_SAMPLER_FNC(tex, st + direction * distortion.r).r;
c.g = CHROMAAB_SAMPLER_FNC(tex, st + direction * distortion.g).g;
c.b = CHROMAAB_SAMPLER_FNC(tex, st + direction * distortion.b).b;
return c;
}
CHROMAAB_TYPE chromaAB(in SAMPLER_TYPE tex, in float2 st, in float2 offset, in float pct) {
#ifdef CHROMAAB_CENTER_BUFFER
// modify the distance from the center, so that only the edges are affected
offset = max(offset - CHROMAAB_CENTER_BUFFER, 0.);
#endif
// Distort the UVs
float2 stR = st * (1.0 + offset * 0.02 * pct),
stB = st * (1.0 - offset * 0.02 * pct);
// Get the individual channels using the modified UVs
CHROMAAB_TYPE c = float4(1., 1., 1., 1.);
c.r = CHROMAAB_SAMPLER_FNC(tex, stR).r;
c.g = CHROMAAB_SAMPLER_FNC(tex, st).g;
c.b = CHROMAAB_SAMPLER_FNC(tex, stB).b;
return c;
}
CHROMAAB_TYPE chromaAB(in SAMPLER_TYPE tex, in float2 st, in float sdf, in float pct) {
return chromaAB(tex, st, float2(sdf, sdf), pct);
}
CHROMAAB_TYPE chromaAB(in SAMPLER_TYPE tex, in float2 st, in float sdf) {
return chromaAB(tex, st, sdf, CHROMAAB_PCT);
}
CHROMAAB_TYPE chromaAB(in SAMPLER_TYPE tex, in float2 st, in float2 offset) {
return chromaAB(tex, st, offset, CHROMAAB_PCT);
}
CHROMAAB_TYPE chromaAB(in SAMPLER_TYPE tex, in float2 st) {
return chromaAB(tex, st, lengthSq(st - .5), CHROMAAB_PCT);
}
#endif
Dependencies:
Use:
chromaAB(<SAMPLER_TYPE> texture, <float2> st [, <float|float2> sdf|offset, <float> pct])
#ifndef CHROMAAB_PCT
#define CHROMAAB_PCT 1.5
#endif
#ifndef CHROMAAB_TYPE
#define CHROMAAB_TYPE float3
#endif
#ifndef CHROMAAB_SAMPLER_FNC
#define CHROMAAB_SAMPLER_FNC(TEX, UV) SAMPLER_FNC(TEX, UV)
#endif
#ifndef FNC_CHROMAAB
#define FNC_CHROMAAB
CHROMAAB_TYPE chromaAB(SAMPLER_TYPE tex, float2 st, float2 direction, float3 distortion ) {
float2 offset = float2(0.0);
CHROMAAB_TYPE c = CHROMAAB_TYPE(1.);
c.r = CHROMAAB_SAMPLER_FNC(tex, st + direction * distortion.r).r;
c.g = CHROMAAB_SAMPLER_FNC(tex, st + direction * distortion.g).g;
c.b = CHROMAAB_SAMPLER_FNC(tex, st + direction * distortion.b).b;
return c;
}
CHROMAAB_TYPE chromaAB(SAMPLER_TYPE tex, float2 st, float2 offset, float pct) {
#ifdef CHROMAAB_CENTER_BUFFER
// modify the distance from the center, so that only the edges are affected
offset = max(offset - CHROMAAB_CENTER_BUFFER, 0.);
#endif
// Distort the UVs
float2 stR = st * (1.0 + offset * 0.02 * pct),
stB = st * (1.0 - offset * 0.02 * pct);
// Get the individual channels using the modified UVs
CHROMAAB_TYPE c = CHROMAAB_TYPE(1.);
c.r = CHROMAAB_SAMPLER_FNC(tex, stR).r;
c.g = CHROMAAB_SAMPLER_FNC(tex, st).g;
c.b = CHROMAAB_SAMPLER_FNC(tex, stB).b;
return c;
}
CHROMAAB_TYPE chromaAB(SAMPLER_TYPE tex, float2 st, float sdf, float pct) {
return chromaAB(tex, st, float2(sdf), pct);
}
CHROMAAB_TYPE chromaAB(SAMPLER_TYPE tex, float2 st, float sdf) {
return chromaAB(tex, st, sdf, CHROMAAB_PCT);
}
CHROMAAB_TYPE chromaAB(SAMPLER_TYPE tex, float2 st, float2 offset) {
return chromaAB(tex, st, offset, CHROMAAB_PCT);
}
CHROMAAB_TYPE chromaAB(SAMPLER_TYPE tex, float2 st) {
return chromaAB(tex, st, lengthSq(st - .5), CHROMAAB_PCT);
}
#endif
LYGIA is dual-licensed under the Prosperity License and the Patron License for sponsors and contributors.
Sponsors and contributors are automatically added to the Patron License and they can ignore the any non-commercial rule of the Prosperity Licensed software (please take a look to the exception).
It's also possible to get a permanent comercial license hook to a single and specific version of LYGIA.
Sign up for the news letter bellow, joing the LYGIA's channel on Discord or follow the Github repository