174 lines
4.7 KiB
Text
174 lines
4.7 KiB
Text
|
class:: SCImageKernel
|
||
|
summary:: kernel class to use with SCImage
|
||
|
categories:: GUI>Views
|
||
|
related:: Classes/SCImage, Classes/SCImageFilter
|
||
|
|
||
|
DESCRIPTION::
|
||
|
|
||
|
code::// very experimental :)::
|
||
|
|
||
|
Currently this class represents the CoreImage strong::CIKernel:: you can apply to a link::Classes/SCImage::. The Kernel language is a subset of the OpenGL Shading Language. more information about the Kernel Language can be found here : http://developer.apple.com/documentation/GraphicsImaging/Reference/CIKernelLangRef/Introduction/chapter_1_section_1.html
|
||
|
|
||
|
and here: http://developer.apple.com/documentation/GraphicsImaging/Reference/CIKernelLangRef/chapter_2_section_1.html#//apple_ref/doc/uid/TP40004397-CH206-TPXREF101
|
||
|
|
||
|
here is the translation table between Kernel language Objects and SuperCollider objects
|
||
|
|
||
|
table::
|
||
|
## strong::Kernel Language Object:: || strong::SuperCollider Object::
|
||
|
## sampler || link::Classes/SCImage::
|
||
|
## __color || link::Classes/Color::
|
||
|
## float || link::Classes/Number::
|
||
|
## vec2, vec3, vec4 || link::Classes/Array::
|
||
|
## __table || link::Classes/SCImage:: (basically the __table modifier just use Images as a data providers - LUT)
|
||
|
::
|
||
|
|
||
|
CLASSMETHODS::
|
||
|
|
||
|
METHOD::new
|
||
|
creates a new SCImageKernel
|
||
|
|
||
|
ARGUMENT::shader
|
||
|
optional. the shader code string. nil by default
|
||
|
|
||
|
ARGUMENT::values
|
||
|
optional. the values that match the kernel proc function defined in the shader string. nil by default
|
||
|
|
||
|
ARGUMENT::bounds
|
||
|
optional. not used for now. nil by default
|
||
|
|
||
|
INSTANCEMETHODS::
|
||
|
|
||
|
METHOD::shader
|
||
|
get or set the shader string.
|
||
|
|
||
|
METHOD::values
|
||
|
get or set the values array. When setting the object indexes in the values Array must match the argument declaration order as defined in the main emphasis::kernel vec4 routine::. See link::#Examples:: for more info.
|
||
|
|
||
|
METHOD::isValid
|
||
|
very basic verification to tell if all arguments of the shader are set.
|
||
|
|
||
|
METHOD::compile
|
||
|
compile the SCImageKernel object (and cache it).
|
||
|
NOTE::
|
||
|
when rendered the first time, the kernel object is always compiled first. If you plan to change the shader string after, you must explicitely compile it to make it effective.
|
||
|
::
|
||
|
|
||
|
EXAMPLES::
|
||
|
|
||
|
code::
|
||
|
/**** Kernels ****/
|
||
|
// very experimental
|
||
|
// COLOR INVERSION SHADER EXAMPLE
|
||
|
(
|
||
|
a = SCImage.new(SCDoc.helpSourceDir +/+ "images/vduck2.jpg"); // get the image
|
||
|
k = SCImageKernel.new;
|
||
|
k.shader_("
|
||
|
|
||
|
vec4 invertPixel(vec4 pix) {
|
||
|
return vec4(1.0 - pix.r, 1.0 - pix.g, 1.0 - pix.b, pix.a);
|
||
|
}
|
||
|
|
||
|
kernel vec4 _invertColor(sampler source)
|
||
|
{
|
||
|
vec4 pixel;
|
||
|
pixel = sample(source, samplerCoord(source));
|
||
|
unpremultiply(pixel);
|
||
|
return unpremultiply(invertPixel(pixel));
|
||
|
}
|
||
|
");
|
||
|
|
||
|
// the argument order should be kept in the array
|
||
|
// here we need only the "sampler" argument which should be as the translation table informs you a SCImage
|
||
|
// the signature of the Kernel function is normally 'kernel vec4'
|
||
|
// you can of course add other functions in the shader
|
||
|
k.values_([a]);
|
||
|
|
||
|
k.isValid.postln; // is it ok
|
||
|
a.applyKernel(k);
|
||
|
|
||
|
w = a.plot(freeOnClose:true);
|
||
|
)
|
||
|
|
||
|
|
||
|
(
|
||
|
// ANOTHER APPLE KERNEL EXAMPLE - See CoreImage programming guide for original example
|
||
|
a = SCImage.new(SCDoc.helpSourceDir +/+ "images/vduck2.jpg"); // get the image
|
||
|
k = SCImageKernel.new;
|
||
|
k.shader_("
|
||
|
vec2 testVec(float x, float y)
|
||
|
{
|
||
|
return vec2(x, y);
|
||
|
}
|
||
|
|
||
|
kernel vec4 testKernelFromApple( sampler src, __color color, float distance, float slope )
|
||
|
{
|
||
|
vec4 t;
|
||
|
float d;
|
||
|
d = destCoord().y * slope + distance;
|
||
|
t = unpremultiply(sample(src, samplerCoord(src)));
|
||
|
t = (t - d*color) / (1.0-d);
|
||
|
return premultiply(t);
|
||
|
}
|
||
|
");
|
||
|
|
||
|
// as stated in the Apple Example
|
||
|
// distance - min: 0.0 max: 1.0
|
||
|
// slope - min: -0.01 max: 0.01
|
||
|
k.values_(
|
||
|
[
|
||
|
a, // arg 0: the SCImage
|
||
|
Color.white, // arg 1: color
|
||
|
0.5, // arg 2: distance
|
||
|
-0.002 // arg 3: slope
|
||
|
]
|
||
|
);
|
||
|
|
||
|
a.applyKernel(k);
|
||
|
|
||
|
w = a.plot(freeOnClose:true);
|
||
|
)
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
(
|
||
|
// OK a Better Colorful Kernel
|
||
|
a = SCImage.new(600@600); // get the image
|
||
|
k = SCImageKernel.new;
|
||
|
|
||
|
k.shader_(
|
||
|
// shader/kernel from toneburst.com
|
||
|
// Generates spherical and planar displacement maps for VBO-based 3D heightfield.
|
||
|
// http://machinesdontcare.wordpress.com
|
||
|
"
|
||
|
const float PI = 3.14159265359;
|
||
|
const float TWOPI = 6.28318530718;
|
||
|
|
||
|
kernel vec4 _heightMap(sampler image, vec3 scale)
|
||
|
{
|
||
|
vec2 xyNorm = samplerCoord(image) / samplerSize(image);
|
||
|
float u = xyNorm.x * PI;
|
||
|
float v = xyNorm.y * TWOPI;
|
||
|
vec3 spherical;
|
||
|
spherical.r = cos(v) * sin(u);
|
||
|
spherical.g = sin(v) * sin(u);
|
||
|
spherical.b = cos(u);
|
||
|
|
||
|
spherical.r = (spherical.r * 0.5 + 0.5) * scale.x;
|
||
|
spherical.g = (spherical.g * 0.5 + 0.5) * scale.y;
|
||
|
spherical.b = (spherical.b * 0.5 + 0.5) * scale.z;
|
||
|
|
||
|
return vec4(spherical,1.0);
|
||
|
}
|
||
|
");
|
||
|
|
||
|
k.values_([a, [1.0, 1.0, 1.0]]);
|
||
|
|
||
|
// k.isValid; // is it ok
|
||
|
a.applyKernel(k);
|
||
|
//.flatten; // ensure a bitmap rep so the kernel is not applied at each rendering call - uncomment that and rescale the plot window to see the difference.
|
||
|
|
||
|
w = a.plot(freeOnClose:true);
|
||
|
)
|
||
|
::
|