std::ostringstream fs;
fs << "#version 440\n"
- << "layout(location = 0) in vec2 fs_in_pos_screen;\n"
- << "layout(location = 1) in vec2 fs_in_offset;\n"
+ << "layout(location = 0) in vec2 fs_in_pos_screen;\n"
+ << "layout(location = 1) in vec2 fs_in_offset;\n"
<< "\n"
<< "layout(location = 0) out vec2 fs_out_color;\n"
<< "\n"
<< "void main (void)\n"
<< "{\n"
- << " const float threshold = 0.15625;\n"
+ << " const vec2 frag_center = interpolateAtOffset(fs_in_pos_screen, vec2(0.0));\n"
+ << " const vec2 center_diff = abs(frag_center - fs_in_pos_screen);\n"
+ << " const float threshold = 0.125;\n"
+ << " bool valuesEqual = false;\n"
<< "\n"
- << " const vec2 pos_interpolated_at_offset = interpolateAtOffset(fs_in_pos_screen, fs_in_offset);\n"
- << " const vec2 pixel_center = floor(fs_in_pos_screen) + vec2(0.5, 0.5);\n"
- << " const vec2 reference_value = pixel_center + fs_in_offset;\n"
- << " const bool valuesEqual = all(lessThan(abs(pos_interpolated_at_offset - reference_value), vec2(threshold)));\n"
+ << " if (all(lessThan(center_diff, vec2(0.5 + threshold)))) {\n"
+ << " const vec2 pos_interpolated_at_offset = interpolateAtOffset(fs_in_pos_screen, fs_in_offset);\n"
+ << " const vec2 reference_value = frag_center + fs_in_offset;\n"
<< "\n"
- << " if (valuesEqual)\n"
- << " fs_out_color = vec2(0.0, 1.0);\n"
- << " else\n"
- << " fs_out_color = vec2(1.0, 0.0);\n"
+ << " valuesEqual = all(lessThan(abs(pos_interpolated_at_offset - reference_value), vec2(threshold)));\n"
+ << " }\n"
+ << "\n"
+ << " if (valuesEqual)\n"
+ << " fs_out_color = vec2(0.0, 1.0);\n"
+ << " else\n"
+ << " fs_out_color = vec2(1.0, 0.0);\n"
<< "}\n";
programCollection.glslSources.add("fragment_shader") << glu::FragmentSource(fs.str());