nuclear@15: static const char *sdr_src = nuclear@15: "uniform sampler2D tex;\n" nuclear@15: "uniform float aspect, scale;\n" nuclear@15: "uniform float lens_center_offset;\n" nuclear@15: "uniform vec4 dist_factors;\n" nuclear@15: "\n" nuclear@15: "vec2 distort_texcoords(in vec2 tc);\n" nuclear@15: "float barrel_scale(float x, in vec4 k);\n" nuclear@15: "\n" nuclear@15: "void main()\n" nuclear@15: "{\n" nuclear@15: " vec2 tc = distort_texcoords(gl_TexCoord[0].xy);\n" nuclear@15: "\n" nuclear@15: " float vis = any(greaterThan(tc, vec2(1.0)) || lessThan(tc, vec2(0.0))) ? 0.0 : 1.0;\n" nuclear@15: "\n" nuclear@15: " gl_FragColor.rgb = texture2D(tex, tc).rgb * vis;\n" nuclear@15: " gl_FragColor.a = 1.0;\n" nuclear@15: "}\n" nuclear@15: "\n" nuclear@15: "vec2 distort_texcoords(in vec2 tc)\n" nuclear@15: "{\n" nuclear@15: " // map tc [0, 1] -> [-1, 1]\n" nuclear@15: " vec2 pt = tc * 2.0 - 1.0;\n" nuclear@15: "\n" nuclear@15: " pt.x += lens_center_offset * 2.0;\n" nuclear@15: " pt.y /= aspect; // correct for aspect ratio\n" nuclear@15: "\n" nuclear@15: " float rad = barrel_scale(dot(pt, pt), dist_factors);\n" nuclear@15: " pt *= rad; // scale the point by the computer distortion radius\n" nuclear@15: "\n" nuclear@15: " pt /= scale;\n" nuclear@15: " pt.y *= aspect;\n" nuclear@15: " pt.x -= lens_center_offset * 2.0;\n" nuclear@15: "\n" nuclear@15: " // map back to range [0, 1]\n" nuclear@15: " return pt * 0.5 + 0.5;\n" nuclear@15: "}\n" nuclear@15: "\n" nuclear@15: "float barrel_scale(float rad, in vec4 k)\n" nuclear@15: "{\n" nuclear@15: " float radsq = rad * rad;\n" nuclear@15: " float radquad = radsq * radsq;\n" nuclear@15: " return k.x + k.y * radsq + k.z * radquad + k.w * radquad * radsq;\n" nuclear@15: "}\n"; nuclear@15: