. .
CREATE OR DIE Special Downloads Shop webinale

Schauplatz

Artikel
  • Currently 5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Februar 2009

Pixel Bender


Fortsetzung, Teil 2

(Link zum Artikel: http://www.createordie.de/cod/artikel/2152)

Kurz zum Kernel

Der Aufbau eines Programms in Pixel Bender ist wirklich simpel und vom Prinzip her immer nach dem gleichen Muster gestrickt:

  1. <languageVersion: 1.0;>
  2. kernel name
  3. <
  4. kernel metadata
  5. >
  6. {
  7. kernel members
  8. }

Im konkreten Fall unseres spiralförmigen Droste-Effekts hat der Kernel zwar ein wenig mehr Zeilen, bleibt in der Struktur aber trotzdem sehr überschaubar. Die anfängliche Flut an Parametern dient später nur dazu, dass der Benutzer den Filter mit eigenem Input steuern und so den eigenen Wünschen anpassen kann. In Photoshop werden diese Parameter beispielsweise dem Anwender als einstellbare Slider-Optionen zur Verfügung gestellt.

In Flash steuert man entsprechende Parameter wie folgt an:
meinShader.data.xPos.value = [ x_value];.
In diesem Beispiel wird der Parameter xPos des Shaders in ActionScript neu gesetzt oder angepasst.

  1. <languageVersion: 1.0;>
  2. kernel deformer
  3. <
  4. namespace: "escher/-droste effect";
  5. vendor: "Frank Reitberger";
  6. version: 1;
  7. description: "escherizer";
  8. >
  9. {
  10. parameter float2 size
  11. <
  12. maxValue:float2(4096.0);
  13. minValue:float2(0.0);
  14. defaultValue:float2( 500.0 );
  15. description: "image width/-height";
  16. >;
  17. parameter float2 radians
  18. <
  19. maxValue:float2( 1000.0 );
  20. minValue:float2( -1000.0 );
  21. defaultValue:float2( 50.0, 150.0);
  22. description: "setup radians";
  23. >;
  24. parameter float rotate
  25. <
  26. maxValue:360.0;
  27. minValue:0.0;
  28. defaultValue:0.0;
  29. description: "setup rotation";
  30. >;
  31. parameter float zoom
  32. <
  33. maxValue:100.0;
  34. minValue:1.0;
  35. defaultValue:1.0;
  36. description: "setup zooming";
  37. >;
  38. parameter float2 center
  39. <
  40. maxValue:float2(2100.0);
  41. minValue:float2(-2100.0);
  42. defaultValue:float2(0.0);
  43. description: "sets xy.center";
  44. >;
  45. parameter float2 range
  46. <
  47. maxValue:float2(2100.0);
  48. minValue:float2(-2100.0);
  49. defaultValue:float2(160.0);
  50. description: "sets xy.range";
  51. >;
  52. parameter float xPos
  53. <
  54. maxValue:1050.0;
  55. minValue:-1050.0;
  56. defaultValue:160.0;
  57. description: "sets initial x.position";
  58. >;
  59. parameter float yPos
  60. <
  61. maxValue:1050.0;
  62. minValue:-1050.0;
  63. defaultValue:160.0;
  64. description: "sets initial y.position";
  65. >;
  66. input image4 src;
  67. output pixel4 dst;
  68. void
  69. evaluatePixel() {
  70. float2 pos = outCoord();
  71. float PI = 3.1415926535;
  72. float r1 = 0.0;
  73. float r2 = 0.0;
  74. float logRad = log(radians.y / radians.x);
  75. float alfa = atan(logRad /( PI * 2.0 ));
  76. float xShift = cos( alfa );
  77. float yShift = sin( alfa );
  78. float cosAngle = cos(rotate * PI / 180.0 );
  79. float sinAngle = sin(rotate * PI / 180.0 );
  80. float xZoom = cosAngle * zoom;
  81. float yZoom = sinAngle * zoom;
  82. float startX = center.x-(xPos*cosAngle+
  83. yPos * sinAngle) * zoom;
  84. float startY = center.y+(-xPos*sinAngle+
  85. yPos * cosAngle) * zoom;
  86. float ix = startX+xZoom*ceil(pos.x)
  87. + yZoom * ceil( pos.y );
  88. float iy = startY+yZoom*ceil(pos.x)
  89. - xZoom * ceil( pos.y );
  90. float distRad = log(ix*ix+iy*iy)/2.0;
  91. float f = atan( iy, ix ) + PI;
  92. float i =(distRad*xShift + f *
  93. yShift ) / xShift;
  94. float j = (f*xShift - distRad *
  95. yShift ) / xShift;
  96. i = mod( i, logRad );
  97. j = mod( j, PI * 2.0 );
  98. float z = exp(i) * radians.x;
  99. r1 = range.x + z * cos( j );
  100. r2 = range.y - z * sin( j );
  101. if( r1 < 0.0) r1 = mod( r1,size.x)* -1.0;
  102. if( r2 < 0.0) r2 = mod( r2, size.y)* -1.0;
  103. if( r1 > size.x ) r1 = mod( r1, size.x );
  104. if( r2 > size.y ) r2 = mod( r2, size.y );
  105. dst = sampleNearest(src,float2( r1,r2 ) );
  106. }
  107. }

 

Kommentare
Bisher keine Kommentare
Neuer Kommentar
  • Gute Kommentare werden belohnt.
  •   (optional)
  •   (Kommentar abonnieren/Gravatar - wird nicht veröffentlicht)
  •    Benachrichtige mich bei nachfolgenden Kommentaren per E-Mail
  • -+
Tags
Werbung
pixel bender