oculus1
annotate sdr/sdr.glsl @ 23:0c76f70fb7e9
merged
author | John Tsiombikas <nuclear@member.fsf.org> |
---|---|
date | Sat, 28 Sep 2013 04:13:33 +0300 |
parents | f3672317e5c2 |
children |
rev | line source |
---|---|
nuclear@13 | 1 uniform sampler2D tex; |
nuclear@13 | 2 uniform float aspect, scale; |
nuclear@13 | 3 uniform float lens_center_offset; |
nuclear@13 | 4 uniform vec4 dist_factors; |
nuclear@18 | 5 uniform vec2 tex_scale; |
nuclear@13 | 6 |
nuclear@14 | 7 vec2 distort_texcoords(in vec2 tc); |
nuclear@13 | 8 float barrel_scale(float x, in vec4 k); |
nuclear@13 | 9 |
nuclear@13 | 10 void main() |
nuclear@13 | 11 { |
nuclear@14 | 12 vec2 tc = distort_texcoords(gl_TexCoord[0].xy); |
nuclear@13 | 13 |
nuclear@18 | 14 float vis = any(greaterThan(tc, vec2(1.0))) || any(lessThan(tc, vec2(0.0))) ? 0.0 : 1.0; |
nuclear@14 | 15 |
nuclear@18 | 16 gl_FragColor.rgb = texture2D(tex, tc * tex_scale).rgb * vis; |
nuclear@13 | 17 gl_FragColor.a = 1.0; |
nuclear@13 | 18 } |
nuclear@13 | 19 |
nuclear@14 | 20 vec2 distort_texcoords(in vec2 tc) |
nuclear@13 | 21 { |
nuclear@13 | 22 // map tc [0, 1] -> [-1, 1] |
nuclear@13 | 23 vec2 pt = tc * 2.0 - 1.0; |
nuclear@13 | 24 |
nuclear@13 | 25 pt.x += lens_center_offset * 2.0; |
nuclear@13 | 26 pt.y /= aspect; // correct for aspect ratio |
nuclear@13 | 27 |
nuclear@13 | 28 float rad = barrel_scale(dot(pt, pt), dist_factors); |
nuclear@13 | 29 pt *= rad; // scale the point by the computer distortion radius |
nuclear@13 | 30 |
nuclear@14 | 31 pt /= scale; |
nuclear@13 | 32 pt.y *= aspect; |
nuclear@13 | 33 pt.x -= lens_center_offset * 2.0; |
nuclear@13 | 34 |
nuclear@13 | 35 // map back to range [0, 1] |
nuclear@13 | 36 return pt * 0.5 + 0.5; |
nuclear@13 | 37 } |
nuclear@13 | 38 |
nuclear@13 | 39 float barrel_scale(float rad, in vec4 k) |
nuclear@13 | 40 { |
nuclear@13 | 41 float radsq = rad * rad; |
nuclear@13 | 42 float radquad = radsq * radsq; |
nuclear@13 | 43 return k.x + k.y * radsq + k.z * radquad + k.w * radquad * radsq; |
nuclear@13 | 44 } |