/
SCImageKernel.html
211 lines (211 loc) · 16 KB
/
SCImageKernel.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta http-equiv="Content-Style-Type" content="text/css">
<title></title>
<meta name="Generator" content="Cocoa HTML Writer">
<meta name="CocoaVersion" content="949.33">
<style type="text/css">
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Helvetica}
p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco; color: #a32213}
p.p3 {margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco; color: #a32213; min-height: 14.0px}
p.p4 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica}
p.p5 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; min-height: 14.0px}
p.p6 {margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Helvetica}
p.p7 {margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Helvetica; min-height: 17.0px}
p.p8 {margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco; color: #8e1f11}
p.p9 {margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco}
p.p10 {margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco; color: #0032b4}
p.p11 {margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco; color: #606060; min-height: 14.0px}
p.p12 {margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco; color: #606060}
p.p13 {margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco; min-height: 14.0px}
p.p14 {margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Monaco; color: #9e210a}
p.p15 {margin: 0.0px 0.0px 0.0px 36.0px; text-align: justify; text-indent: -36.0px; font: 10.0px Monaco; color: #9e210a; background-color: #f4f4f4}
p.p16 {margin: 0.0px 0.0px 0.0px 36.0px; text-align: justify; text-indent: -36.0px; font: 10.0px Monaco; color: #9e210a}
span.s1 {color: #0043f0}
span.s2 {color: #0042e5}
span.s3 {color: #0040e6}
span.s4 {text-decoration: underline}
span.s5 {font: 14.0px Helvetica}
span.s6 {color: #002da2}
span.s7 {color: #0032b4}
span.s8 {color: #606060}
span.s9 {color: #9e210a}
span.s10 {color: #000000}
span.Apple-tab-span {white-space:pre}
</style>
</head>
<body>
<p class="p1"><b>SCImageKernel</b></p>
<p class="p2">// very experimental :)</p>
<p class="p3"><br></p>
<p class="p4">kernel class to use with <a href="SCImage.html"><span class="s1">SCImage</span></a><span class="s2">.</span> Currently this class represents the CoreImage <b>CIKernel</b> you can apply to a <a href="SCImage.html"><span class="s3">SCImage</span></a>. The Kernel language is a subset of the <i>OpenGL Shading Language</i>.</p>
<p class="p5"><br></p>
<p class="p4">more information about the Kernel Language can be found here :</p>
<p class="p5"><br></p>
<p class="p4"><span class="s4">http://developer.apple.com/documentation/GraphicsImaging/Reference/CIKernelLangRef/Introduction/chapter_1_section_1.html</span></p>
<p class="p5"><br></p>
<p class="p4">and here:</p>
<p class="p5"><br></p>
<p class="p4"><span class="s4">http://developer.apple.com/documentation/GraphicsImaging/Reference/CIKernelLangRef/chapter_2_section_1.html#//apple_ref/doc/uid/TP40004397-CH206-TPXREF101</span></p>
<p class="p5"><br></p>
<p class="p5"><br></p>
<p class="p4">here is the translation table between Kernel language Objects and SuperCollider objects</p>
<p class="p4">--------------------------------------------------------------------------------------------------------------------------------------------------</p>
<p class="p4"><b> </span>Kernel Language Object<span class="Apple-tab-span"> </span></b><span class="Apple-tab-span"> </span>|<span class="Apple-tab-span"> </span><b>SuperCollider Object</b></p>
<p class="p4">--------------------------------------------------------------------------------------------------------------------------------------------------</p>
<p class="p4"><span class="Apple-tab-span"> </span>sampler<span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span>|<span class="Apple-tab-span"> </span><a href="SCImage.html"><span class="s2">SCImage</span></a></p>
<p class="p4"><span class="Apple-tab-span"> </span>__color<span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span>|<span class="Apple-tab-span"> </span><a href="../../GUI-Tools/Color.html"><span class="s2">Color</span></a></p>
<p class="p4"><span class="Apple-tab-span"> </span>float<span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span>|<span class="Apple-tab-span"> </span><a href="../../../Math/Number.html"><span class="s2">Number</span></a></p>
<p class="p4"><span class="Apple-tab-span"> </span>vec2, vec3, vec4<span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span>|<span class="Apple-tab-span"> </span><a href="../../../Collections/Array.html"><span class="s1">Array</span></a></p>
<p class="p4"><span class="Apple-tab-span"> </span>__table<span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span>| <span class="Apple-tab-span"> </span><a href="SCImage.html"><span class="s2">SCImage</span></a> (basically the __table modifier just use Images as a data providers - LUT)</p>
<p class="p5"><br></p>
<p class="p5"><br></p>
<p class="p6"><b>Class Methods</b></p>
<p class="p7"><b><span class="Apple-tab-span"> </span></b></p>
<p class="p4"><span class="s5"><b><span class="Apple-tab-span"> </span></b></span><b>*new( shader, values, bounds )</b></p>
<p class="p4"><b><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span></b>creates a new <span class="s6">SCImageKernel</span></p>
<p class="p4"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><b>shader</b> - optional. the shader code string. <span class="s6">nil</span> by default</p>
<p class="p4"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><b>values</b> - optional. the values that match the kernel proc function defined in the shader string. <span class="s6">nil</span> by default</p>
<p class="p4"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><b>bounds</b> - optional. not used for now. <span class="s6">nil</span> by default</p>
<p class="p5"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span></p>
<p class="p6"><b>Instance Methods</b></p>
<p class="p7"><b><span class="Apple-tab-span"> </span></b></p>
<p class="p4"><span class="s5"><b><span class="Apple-tab-span"> </span></b></span><b>shader</b></p>
<p class="p4"><b><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span></b>get the shader string.</p>
<p class="p5"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span></p>
<p class="p4"><span class="Apple-tab-span"> </span><b>shader_</b></p>
<p class="p4"><b><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span></b>set the shader string.<span class="Apple-tab-span"> </span></p>
<p class="p7"><br></p>
<p class="p4"><span class="s5"><b><span class="Apple-tab-span"> </span></b></span><b>values</b></p>
<p class="p4"><b><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span></b>get the values array.</p>
<p class="p5"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span></p>
<p class="p4"><span class="Apple-tab-span"> </span><b>values_</b></p>
<p class="p4"><b><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span></b>set the values array.<span class="Apple-tab-span"> </span>the object indexes in the values Array must match the argument declaration order as defined in the main</p>
<p class="p4"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span><i>kernel vec4 routine</i>. See examples for more info.</p>
<p class="p7"><b><span class="Apple-tab-span"> </span></b></p>
<p class="p4"><span class="s5"><b><span class="Apple-tab-span"> </span></b></span><b>isValid</b></p>
<p class="p4"><b><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span></b>very basic verification to tell if all arguments of the shader are set.</p>
<p class="p7"><span class="Apple-tab-span"> </span></p>
<p class="p4"><span class="s5"><span class="Apple-tab-span"> </span></span><b>compile</b></p>
<p class="p4"><b><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span></b>compile the SCImageKernel object (and cache it). </span></p>
<p class="p4"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span>Note: when rendered the first time, the kernel object is always compiled first.</p>
<p class="p4"><span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span>If you plan to change the shader string after, you must explicitely compile it to make it effective.</p>
<p class="p7"><span class="Apple-tab-span"> </span></p>
<p class="p8">/**** Kernels ****/</p>
<p class="p8">// very experimental</p>
<p class="p8">// COLOR INVERSION SHADER EXAMPLE</p>
<p class="p9">(</p>
<p class="p9">a = <span class="s7">SCImage</span>.new(<span class="s7">Document</span>.current.dir +/+ <span class="s8">"vduck2.jpg"</span>); <span class="s9">// get the image</span></p>
<p class="p10"><span class="s10">k = </span>SCImageKernel<span class="s10">.new;</span></p>
<p class="p9">k.shader_(<span class="s8">"</span></p>
<p class="p11"><br></p>
<p class="p12">vec4<span class="Apple-tab-span"> </span>invertPixel(vec4 pix) {</p>
<p class="p12"><span class="Apple-tab-span"> </span>return vec4(1.0 - pix.r, 1.0 - pix.g, 1.0 - pix.b, pix.a);</p>
<p class="p12">}</p>
<p class="p11"><br></p>
<p class="p12">kernel vec4 _invertColor(sampler source)</p>
<p class="p12">{</p>
<p class="p12"><span class="Apple-tab-span"> </span>vec4 pixel;</p>
<p class="p12"><span class="Apple-tab-span"> </span>pixel = sample(source, samplerCoord(source));</p>
<p class="p12"><span class="Apple-tab-span"> </span>unpremultiply(pixel);</p>
<p class="p12"><span class="Apple-tab-span"> </span>return unpremultiply(invertPixel(pixel));</p>
<p class="p12">}</p>
<p class="p9"><span class="s8">"</span>);</p>
<p class="p13"><br></p>
<p class="p14">// the argument order should be kept in the array</p>
<p class="p14">// here we need only the "sampler" argument wich should be as the translation table informs you a SCImage</p>
<p class="p14">// the signature of the Kernel function is normaly 'kernel vec4'</p>
<p class="p14">// you can of course add other functions in the shader</p>
<p class="p9">k.values_([a]);</p>
<p class="p13"><br></p>
<p class="p9">k.isValid.postln; <span class="s9">// is it ok</span></p>
<p class="p9">a.applyKernel(k);</p>
<p class="p13"><br></p>
<p class="p9">w = a.plot(freeOnClose:<span class="s7">true</span>);</p>
<p class="p9">)</p>
<p class="p13"><br></p>
<p class="p13"><br></p>
<p class="p9">(</p>
<p class="p14">// ANOTHER APPLE KERNEL EXAMPLE - See CoreImage programming guide for original example</p>
<p class="p9">a = <span class="s7">SCImage</span>.new(<span class="s7">Document</span>.current.dir +/+ <span class="s8">"vduck2.jpg"</span>); <span class="s9">// get the image</span></p>
<p class="p10"><span class="s10">k = </span>SCImageKernel<span class="s10">.new;</span></p>
<p class="p9">k.shader_(<span class="s8">"</span></p>
<p class="p12">vec2 testVec(float x, float y)</p>
<p class="p12">{</p>
<p class="p12"><span class="Apple-tab-span"> </span>return vec2(x, y);</p>
<p class="p12">}</p>
<p class="p11"><br></p>
<p class="p12">kernel vec4 testKernelFromApple( sampler src, __color color, float distance, float slope )</p>
<p class="p12">{</p>
<p class="p12"><span class="Apple-tab-span"> </span>vec4 <span class="Apple-tab-span"> </span>t;</p>
<p class="p12"><span class="Apple-tab-span"> </span>float<span class="Apple-tab-span"> </span>d;</p>
<p class="p12"><span class="Apple-tab-span"> </span>d = destCoord().y * slope + distance;</p>
<p class="p12"><span class="Apple-tab-span"> </span>t = unpremultiply(sample(src, samplerCoord(src)));</p>
<p class="p12"><span class="Apple-tab-span"> </span>t = (t - d*color) / (1.0-d);</p>
<p class="p12"><span class="Apple-tab-span"> </span>return premultiply(t);</p>
<p class="p12">}</p>
<p class="p9"><span class="s8">"</span>);</p>
<p class="p13"><br></p>
<p class="p14">// as stated in the Apple Example</p>
<p class="p14">// distance - min: 0.0 max: 1.0</p>
<p class="p14">// slope - min: -0.01 max: 0.01</p>
<p class="p9">k.values_(</p>
<p class="p9"><span class="Apple-tab-span"> </span>[</p>
<p class="p14"><span class="s10"><span class="Apple-tab-span"> </span>a,<span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span></span>// arg 0: the SCImage</p>
<p class="p14"><span class="s10"><span class="Apple-tab-span"> </span></span><span class="s7">Color</span><span class="s10">.white, </span></span>// arg 1: color</p>
<p class="p14"><span class="s10"><span class="Apple-tab-span"> </span>0.5, <span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span></span>// arg 2: distance</p>
<p class="p14"><span class="s10"><span class="Apple-tab-span"> </span>-0.002<span class="Apple-tab-span"> </span><span class="Apple-tab-span"> </span></span>// arg 3: slope</p>
<p class="p9"><span class="Apple-tab-span"> </span>]</p>
<p class="p9">);</p>
<p class="p13"><br></p>
<p class="p9">a.applyKernel(k);</p>
<p class="p13"><br></p>
<p class="p9">w = a.plot(freeOnClose:<span class="s7">true</span>);</p>
<p class="p9">)</p>
<p class="p13"><br></p>
<p class="p13"><br></p>
<p class="p13"><br></p>
<p class="p13"><br></p>
<p class="p9">(</p>
<p class="p14">// OK a Better Colorfull Kernel</p>
<p class="p9">a = <span class="s7">SCImage</span>.new(600@600); <span class="s9">// get the image</span></p>
<p class="p10"><span class="s10">k = </span>SCImageKernel<span class="s10">.new;</span></p>
<p class="p13"><br></p>
<p class="p9">k.shader_(</p>
<p class="p14">// shader/kernel from toneburst.com</p>
<p class="p15">// Generates spherical and planar displacement maps for VBO-based 3D heightfield. </p>
<p class="p16">// http://machinesdontcare.wordpress.com </p>
<p class="p12">"</p>
<p class="p12">const float PI = 3.14159265359;</p>
<p class="p12">const float TWOPI = 6.28318530718;</p>
<p class="p11"><br></p>
<p class="p12">kernel vec4 _heightMap(sampler image, vec3 scale)</p>
<p class="p12">{</p>
<p class="p12"><span class="Apple-tab-span"> </span>vec2 xyNorm = samplerCoord(image) / samplerSize(image);</p>
<p class="p12"><span class="Apple-tab-span"> </span>float u = xyNorm.x * PI;</p>
<p class="p12"><span class="Apple-tab-span"> </span>float v = xyNorm.y * TWOPI;</p>
<p class="p12"><span class="Apple-tab-span"> </span>vec3 spherical;</p>
<p class="p12"><span class="Apple-tab-span"> </span>spherical.r = cos(v) * sin(u);</p>
<p class="p12"><span class="Apple-tab-span"> </span>spherical.g = sin(v) * sin(u);</p>
<p class="p12"><span class="Apple-tab-span"> </span>spherical.b = cos(u);</p>
<p class="p11"><span class="Apple-tab-span"> </span></p>
<p class="p12"><span class="Apple-tab-span"> </span>spherical.r = (spherical.r * 0.5 + 0.5) * scale.x;</p>
<p class="p12"><span class="Apple-tab-span"> </span>spherical.g = (spherical.g * 0.5 + 0.5) * scale.y;</p>
<p class="p12"><span class="Apple-tab-span"> </span>spherical.b = (spherical.b * 0.5 + 0.5) * scale.z;</p>
<p class="p11"><span class="Apple-tab-span"> </span></p>
<p class="p12"><span class="Apple-tab-span"> </span>return vec4(spherical,1.0);</p>
<p class="p12">}</p>
<p class="p9"><span class="s8">"</span>);</p>
<p class="p13"><br></p>
<p class="p9">k.values_([a, [1.0, 1.0, 1.0]]);</p>
<p class="p13"><br></p>
<p class="p14">// k.isValid; // is it ok</p>
<p class="p9">a.applyKernel(k);</p>
<p class="p14"><span class="s10">//.flatten; </span>// 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.</p>
<p class="p13"><br></p>
<p class="p9">w = a.plot(freeOnClose:<span class="s7">true</span>);</p>
<p class="p9">)</p>
</body>
</html>