| #version 440 |
| |
| layout(location = 0) in vec2 coord; |
| layout(location = 0) out vec4 fragColor; |
| |
| layout(binding = 1) uniform sampler2D gradTabTexture; |
| |
| layout(std140, binding = 0) uniform buf { |
| mat4 matrix; |
| vec2 translationPoint; |
| vec2 focalToCenter; |
| float centerRadius; |
| float focalRadius; |
| float opacity; |
| } ubuf; |
| |
| void main() |
| { |
| float rd = ubuf.centerRadius - ubuf.focalRadius; |
| float b = 2.0 * (rd * ubuf.focalRadius + dot(coord, ubuf.focalToCenter)); |
| float fmp2_m_radius2 = -ubuf.focalToCenter.x * ubuf.focalToCenter.x - ubuf.focalToCenter.y * ubuf.focalToCenter.y + rd * rd; |
| float inverse_2_fmp2_m_radius2 = 1.0 / (2.0 * fmp2_m_radius2); |
| float det = b * b - 4.0 * fmp2_m_radius2 * ((ubuf.focalRadius * ubuf.focalRadius) - dot(coord, coord)); |
| vec4 result = vec4(0.0); |
| if (det >= 0.0) { |
| float detSqrt = sqrt(det); |
| float w = max((-b - detSqrt) * inverse_2_fmp2_m_radius2, (-b + detSqrt) * inverse_2_fmp2_m_radius2); |
| if (ubuf.focalRadius + w * (ubuf.centerRadius - ubuf.focalRadius) >= 0.0) |
| result = texture(gradTabTexture, vec2(w, 0.5)) * ubuf.opacity; |
| } |
| fragColor = result; |
| } |