/* Published by b-l-a-c-k-o-p.com
Copyright (c) 2007-2012
http://creativecommons.org/licenses/by-nc-sa/3.0/legalcode
*/
SAMPLE: QameraGlassBeerBottles.qtzThis takes two input images in addition to the primary image input. It samples the delta(radius) and delta(theta) from the displacement maps and then distorts the sample coordinate of the source image by the polar offset given by radius and theta.
float as_radians(const float in_degrees)
{
return in_degrees * (3.14597/180.0);
}
vec2 from_polar(const float in_radius, const float in_theta)
{
float x = in_radius * sin(as_radians(in_theta));
float y = in_radius * cos(as_radians(in_theta));
return vec2(x,y);
}
kernel vec4 msBlackDisplacementMaps(sampler input_image, sampler input_map_radius, sampler input_map_angle, float input_range_normal)
{
float input_range = clamp(input_range_normal,0.0,1.0);
vec2 image_size = samplerSize(input_image);
vec2 pixel_coord = samplerCoord(input_image);
vec4 maxel_radius = sample(input_map_radius, samplerCoord(input_map_radius));
vec4 maxel_angle = sample(input_map_angle, samplerCoord(input_map_angle));
float dr_normal = input_range*dot(vec3(maxel_radius),vec3(maxel_radius));
float dt_normal = dot(vec3(maxel_angle),vec3(maxel_angle));
float radius = dr_normal*max(image_size.x, image_size.y);
float angle = dt_normal*360.0;
pixel_coord += from_polar(radius, angle);
return sample(input_image, pixel_coord);
}