std::string Fixel::Shader::fragment_shader_source (const Displayable& fixel) { std::string source = "in float include; \n" "out vec3 color;\n" "flat in float value_out;\n" "in vec3 fragmentColour;\n"; if (fixel.use_discard_lower()) source += "uniform float lower;\n"; if (fixel.use_discard_upper()) source += "uniform float upper;\n"; source += "void main(){\n"; if (fixel.use_discard_lower()) source += " if (value_out < lower) discard;\n"; if (fixel.use_discard_upper()) source += " if (value_out > upper) discard;\n"; source += std::string(" color = fragmentColour;\n"); source += "}\n"; return source; }
std::string Slice::Shader::fragment_shader_source (const Displayable& object) { std::string source = object.declare_shader_variables () + "uniform sampler3D tex;\n" "in vec3 texcoord;\n" "out vec4 color;\n"; source += "void main() {\n" " if (texcoord.s < 0.0 || texcoord.s > 1.0 ||\n" " texcoord.t < 0.0 || texcoord.t > 1.0 ||\n" " texcoord.p < 0.0 || texcoord.p > 1.0) discard;\n" " color = texture (tex, texcoord.stp);\n" " float amplitude = " + std::string (ColourMap::maps[object.colourmap].amplitude) + ";\n" " if (isnan(amplitude) || isinf(amplitude)) discard;\n"; if (object.use_discard_lower()) source += " if (amplitude < lower) discard;\n"; if (object.use_discard_upper()) source += " if (amplitude > upper) discard;\n"; if (object.use_transparency()) source += " if (amplitude < alpha_offset) discard;\n" " color.a = clamp ((amplitude - alpha_offset) * alpha_scale, 0, alpha);\n"; if (!ColourMap::maps[object.colourmap].special) { source += " amplitude = clamp ("; if (object.scale_inverted()) source += "1.0 -"; source += " scale * (amplitude - offset), 0.0, 1.0);\n "; } source += ColourMap::maps[object.colourmap].glsl_mapping; source += "}\n"; return source; }
std::string AbstractFixel::Shader::geometry_shader_source (const Displayable& fixel) { std::string source = "layout(points) in;\n" "layout(triangle_strip, max_vertices = 4) out;\n" "in vec3 v_dir[];\n" "in vec2 v_fixel_metrics[];\n" "uniform mat4 MVP;\n" "uniform float length_mult;\n" "uniform vec3 colourmap_colour;\n" "uniform float line_thickness;\n"; switch (color_type) { case Direction: break; case CValue: source += "uniform float offset, scale;\n"; break; } if (fixel.use_discard_lower()) source += "uniform float lower;\n"; if (fixel.use_discard_upper()) source += "uniform float upper;\n"; source += "flat out vec3 fColour;\n" "void main() {\n"; if (fixel.use_discard_lower()) source += " if (v_fixel_metrics[0].y < lower) return;\n"; if (fixel.use_discard_upper()) source += " if (v_fixel_metrics[0].y > upper) return;\n"; switch (length_type) { case Unity: source += " vec4 line_offset = length_mult * vec4 (v_dir[0], 0);\n"; break; case Amplitude: source += " vec4 line_offset = length_mult * v_fixel_metrics[0].x * vec4 (v_dir[0], 0);\n"; break; case LValue: source += " vec4 line_offset = length_mult * v_fixel_metrics[0].y * vec4 (v_dir[0], 0);\n"; break; } switch (color_type) { case CValue: if (!ColourMap::maps[colourmap].special) { source += " float amplitude = clamp ("; if (fixel.scale_inverted()) source += "1.0 -"; source += " scale * (v_fixel_metrics[0].y - offset), 0.0, 1.0);\n"; } source += std::string (" vec3 color;\n") + ColourMap::maps[colourmap].glsl_mapping + " fColour = color;\n"; break; case Direction: source += " fColour = normalize (abs (v_dir[0]));\n"; break; default: break; } source += " vec4 start = MVP * (gl_in[0].gl_Position - line_offset);\n" " vec4 end = MVP * (gl_in[0].gl_Position + line_offset);\n" " vec4 line = end - start;\n" " vec4 normal = normalize(vec4(-line.y, line.x, 0.0, 0.0));\n" " vec4 thick_vec = line_thickness * normal;\n" " gl_Position = start - thick_vec;\n" " EmitVertex();\n" " gl_Position = start + thick_vec;\n" " EmitVertex();\n" " gl_Position = end - thick_vec;\n" " EmitVertex();\n" " gl_Position = end + thick_vec;\n" " EmitVertex();\n" " EndPrimitive();\n" "}\n"; return source; }