factor/extra/gpu/demos/bunny/sobel.f.glsl

46 lines
1.6 KiB
GLSL

#version 110
uniform sampler2D color_texture, normal_texture, depth_texture;
uniform vec4 line_color;
varying vec2 texcoord;
const float sample_step = 1.0/512.0;
const float depth_weight = 8.0;
float
border_factor(vec2 texcoord)
{
float depth_samples[8];
depth_samples[0] = texture2D(depth_texture, texcoord + vec2(-sample_step, -sample_step)).x;
depth_samples[1] = texture2D(depth_texture, texcoord + vec2( 0, -sample_step)).x;
depth_samples[2] = texture2D(depth_texture, texcoord + vec2( sample_step, -sample_step)).x;
depth_samples[3] = texture2D(depth_texture, texcoord + vec2(-sample_step, 0 )).x;
depth_samples[4] = texture2D(depth_texture, texcoord + vec2( sample_step, 0 )).x;
depth_samples[5] = texture2D(depth_texture, texcoord + vec2(-sample_step, sample_step)).x;
depth_samples[6] = texture2D(depth_texture, texcoord + vec2( 0, sample_step)).x;
depth_samples[7] = texture2D(depth_texture, texcoord + vec2( sample_step, sample_step)).x;
float horizontal = 1.0 * depth_samples[0] + 2.0 * depth_samples[3] + 1.0 * depth_samples[5]
- 1.0 * depth_samples[2] - 2.0 * depth_samples[4] - 1.0 * depth_samples[7];
float vertical = 1.0 * depth_samples[0] + 2.0 * depth_samples[1] + 1.0 * depth_samples[2]
- 1.0 * depth_samples[5] - 2.0 * depth_samples[6] - 1.0 * depth_samples[7];
return depth_weight * sqrt(horizontal*horizontal + vertical*vertical);
}
void
main()
{
gl_FragColor = mix(
texture2D(color_texture, texcoord),
line_color,
border_factor(texcoord)
);
}