Files
Nuake/Data/Shaders/barrel_distortion.shader
2025-01-31 18:04:43 -05:00

49 lines
1.1 KiB
GLSL

#shader vertex
#version 440 core
layout(location = 0) in vec3 VertexPosition;
layout(location = 1) in vec2 UVPosition;
out flat vec2 UV;
void main()
{
UV = UVPosition;
gl_Position = vec4(VertexPosition, 1.0f);
}
#shader fragment
#version 440 core
uniform sampler2D u_Source; // Input texture
uniform float u_Distortion;
uniform float u_DistortionEdge;
uniform float u_Scale;
in vec2 UV;
out vec4 FragColor;
// k1: the main distortion
// positive = barrel, negative = pincushion
// k2 : tweaks the edges of distortion
// can be 0.0
vec2 brownConradyDistortion(in vec2 uv, in float k1, in float k2)
{
uv = uv * 2.0 - 1.0; // brown conrady takes [-1:1]
// positive values of K1 give barrel distortion, negative give pincushion
float r2 = uv.x * uv.x + uv.y * uv.y;
uv *= 1.0 + k1 * r2 + k2 * r2 * r2;
// tangential distortion (due to off center lens elements)
// is not modeled in this function, but if it was, the terms would go here
uv *= u_Scale;
uv = (uv * .5 + .5); // restore -> [0:1]
return uv;
}
void main()
{
FragColor = texture(u_Source, brownConradyDistortion(UV, u_Distortion, u_DistortionEdge));
}