46 lines
1.6 KiB
Plaintext
46 lines
1.6 KiB
Plaintext
//Gravitational lensing effect. Loosely inspired by https://unionassets.com/blog/the-effect-of-the-gravitational-lens-195 to be Clyde based (based on what)
|
|
|
|
uniform sampler2D SCREEN_TEXTURE;
|
|
uniform highp vec2 renderScale;
|
|
uniform highp float maxDistance;
|
|
uniform lowp int count;
|
|
|
|
uniform highp float[5] falloffPower;
|
|
uniform highp float[5] intensity;
|
|
uniform highp vec2[5] position;
|
|
// the `5`s in the array lengths correspond to the upper limit on the simultaneous distortion sources that can be present on screen at a time.
|
|
// If you want to change this, make sure to change all of them here, in the for loop, and, in whatever overlay assigns the uniforms
|
|
// (apparently #define is an unknown preprocessor directive)
|
|
|
|
void fragment() {
|
|
|
|
highp vec2 finalCoords = FRAGCOORD.xy;
|
|
highp vec2 delta;
|
|
highp float distance;
|
|
highp float deformation;
|
|
|
|
for (int i = 0; i < 5 && i < count; i++) {
|
|
|
|
delta = FRAGCOORD.xy - position[i];
|
|
distance = length(delta / renderScale);
|
|
|
|
deformation = intensity[i] / pow(distance, falloffPower[i]);
|
|
|
|
// ensure deformation goes to zero at max distance
|
|
// avoids long-range single-pixel shifts that are noticeable when leaving PVS.
|
|
|
|
if (distance >= maxDistance) {
|
|
deformation = 0.0;
|
|
} else {
|
|
deformation *= (1.0 - pow(distance/maxDistance, 4.0));
|
|
}
|
|
|
|
if(deformation > 0.8)
|
|
deformation = pow(deformation, 0.3);
|
|
|
|
finalCoords -= deformation * delta;
|
|
}
|
|
|
|
COLOR = zTextureSpec(SCREEN_TEXTURE, finalCoords*SCREEN_PIXEL_SIZE );
|
|
}
|