CGII/framework/shader/cgv_gl/glsl/point.glfs
2018-05-17 16:01:02 +02:00

51 lines
No EOL
1.6 KiB
Text

#version 150 compatibility
uniform bool smooth_points = true;
uniform int illumination_mode = 1;
uniform vec4 halo_color;
in vec3 normal;
in vec2 uv;
in vec4 color;
in vec3 position;
in vec2 position_pixel;
in float percentual_outline_start;
in float percentual_halo_start;
in float percentual_pixel_extent;
in float percentual_splat_size;
flat in int side;
//layout pixel_center_integer in vec4 gl_FragCoord;
vec4 doLighting(vec3 position, vec3 normal, vec4 diffuseMaterial);
vec4 doTwoSidedLighting(vec3 position, vec3 normal, vec4 diffuseMaterial, int side);
void main()
{
float l = length(uv);
if (smooth_points && (l > percentual_splat_size))
discard;
float pixel_scale = 1.0 / percentual_pixel_extent;
float outline_width = percentual_splat_size - percentual_outline_start - percentual_pixel_extent;
if (outline_width < 0.01) {
outline_width = 0.01;
}
float lambda_in = clamp(pixel_scale*(percentual_outline_start + percentual_pixel_extent - l), 0.0, 1.0);
float lambda_out = clamp(pixel_scale*(l - percentual_splat_size), 0.0, 1.0);
float lambda_line = clamp((percentual_splat_size - 0.5*percentual_pixel_extent - l)/outline_width, 0.0, 1.0);
// illumination
vec4 color_in = color;
if (l > percentual_halo_start)
color_in = halo_color;
switch (illumination_mode) {
case 1: color_in.rgb = doLighting(position, normal, color_in).rgb; break;
case 2: color_in.rgb = doTwoSidedLighting(position, normal, color_in, side).rgb; break;
}
vec4 color_line = vec4(color_in.rgb, lambda_line*color_in.a);
gl_FragColor = lambda_in * color_in + (1.0 - lambda_out - lambda_in) * color_line;
}