Files
NixOS-configs/modules/wallpaper-engine/effects/godrays/preview/shaders/effects/godrays_cast.frag
2025-02-07 17:04:43 -06:00

49 lines
1.4 KiB
GLSL

// [COMBO] {"material":"Caster","combo":"CASTER","type":"options","default":0,"options":{"Radial":0,"Directional":1}}
#include "common.h"
varying vec2 v_TexCoord;
uniform sampler2D g_Texture0; // {"material":"Framebuffer","hidden":true}
uniform float g_Length; // {"material":"Ray length","default":0.5,"range":[0.01, 1]}
uniform float g_Intensity; // {"material":"Ray intensity","default":1,"range":[0.01, 2.0]}
uniform vec3 g_Color1; // {"material":"Color start","default":"1 1 1","type":"color"}
uniform vec3 g_Color2; // {"material":"Color end","default":"1 1 1","type":"color"}
#if CASTER == 0
uniform vec2 g_Center; // {"material":"Center","default":"0.5 0.5"}
#else
uniform float g_Direction; // {"material":"Direction","default":0,"range":[0,6.28]}
#endif
void main() {
vec2 texCoords = v_TexCoord;
vec4 albedo = CAST4(0.0);
#if CASTER == 0
vec2 direction = g_Center - texCoords;
#else
vec2 direction = rotateVec2(vec2(0, -0.5), g_Direction);
#endif
float dist = length(direction);
direction /= dist;
dist = min(dist, dist * g_Length);
texCoords += direction * dist;
direction = direction * dist / 29.0;
for (int i = 0; i < 30; ++i)
{
vec4 sample = texSample2D(g_Texture0, texCoords);
texCoords -= direction;
sample.rgb *= mix(g_Color2, g_Color1, i/29.0);
albedo += sample * (i / 29.0);
}
gl_FragColor = albedo * g_Intensity * 0.1;
}