- "vec2 distort(vec2 coord)\n"
- "{\n"
- " float r_sq = dot(coord, coord);\n"
- " return coord*dot(distortion, vec4(1.0, r_sq, r_sq*r_sq, r_sq*r_sq*r_sq));\n"
- "}\n"
- " vec2 dtc = (distort(texcoord)-eye_center)/(scale.xy*scale.z)+0.5;\n"
+ " float r_sq = dot(texcoord, texcoord);\n"
+ " float f = dot(distortion, vec4(1.0, r_sq, r_sq*r_sq, r_sq*r_sq*r_sq));\n"
+ " vec2 dtc = (texcoord*f-eye_center)/(scale.xy*scale.z)+lens_center;\n"
- " gl_FragColor = texture2D(texture, dtc);\n"
+ " {\n"
+ " vec2 red_dtc = (texcoord*f*(chromatic[0]+chromatic[1]*r_sq)-eye_center)/(scale.xy*scale.z)+lens_center;\n"
+ " vec2 blue_dtc = (texcoord*f*(chromatic[2]+chromatic[3]*r_sq)-eye_center)/(scale.xy*scale.z)+lens_center;\n"
+ " gl_FragColor = vec4(texture2D(texture, red_dtc).r, texture2D(texture, dtc).g, texture2D(texture, blue_dtc).b, 1.0);\n"
+ " }\n"
shprog(vs_source, fs_source),
// Default values copied from the SDK
view_distance(0.438f),
shprog(vs_source, fs_source),
// Default values copied from the SDK
view_distance(0.438f),
right_shdata.uniform("texture", 0);
right_shdata.uniform("offset", 0.5f);
right_shdata.uniform("texture", 0);
right_shdata.uniform("offset", 0.5f);
// This will also call update_parameters
set_distortion(1.0f, 0.22f, 0.24f);
// This will also call update_parameters
set_distortion(1.0f, 0.22f, 0.24f);
void OculusRiftCombiner::update_parameters()
{
left_shdata.uniform4("distortion", distortion);
void OculusRiftCombiner::update_parameters()
{
left_shdata.uniform4("distortion", distortion);
// Set lens center positions, in output texture coordinates
left_shdata.uniform("lens_center", 1.0f-lens_separation, 0.5);
// Set lens center positions, in output texture coordinates
left_shdata.uniform("lens_center", 1.0f-lens_separation, 0.5);
/* Determine the necessary scaling factor to avoid quality degradation in
the center of the screen. */
/* Determine the necessary scaling factor to avoid quality degradation in
the center of the screen. */
float vert_oversize = distort(1.25f*fill_factor)/(1.25f*fill_factor);
oversize = min(horiz_oversize, vert_oversize);
left_shdata.uniform("scale", 2.0f, 2.5f, oversize);
right_shdata.uniform("scale", 2.0f, 2.5f, oversize);
float vert_oversize = distort(1.25f*fill_factor)/(1.25f*fill_factor);
oversize = min(horiz_oversize, vert_oversize);
left_shdata.uniform("scale", 2.0f, 2.5f, oversize);
right_shdata.uniform("scale", 2.0f, 2.5f, oversize);