Advertisement
Caiwan

4k.frag

Apr 3rd, 2012
118
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 7.59 KB | None | 0 0
  1. // nincsneve
  2. // 4k intro
  3. // by Caiwan
  4. // Industrial Revolutoners
  5. // 2012
  6.  
  7. #version 150
  8.  
  9. // ezeket a parametereket a frameworktol kapja
  10. uniform vec4 params[8];
  11.  
  12. // Az intro alapja egy egyszeru raymarcher
  13. // Felhasznalt anyag + forras:
  14. //   - raymarcher sandbox: http://glsl.heroku.com/e#1996.0
  15. //   - IQ leirasai a distant fuggvenekhez: http://www.iquilezles.org/www/articles/distfunctions/distfunctions.htm
  16. //   - IQ menger szivacsa: http://www.iquilezles.org/www/articles/menger/menger.htm
  17.  
  18. #define PI 3.151592
  19. #define DEBUG
  20.  
  21. //--------------------------------------------------------------------------------------------------------------------
  22. // Object utils
  23. float smoothcurve(float f) {return .5*(1+cos(PI*f));}
  24. float maxcomp(in vec3 p ) { return max(p.x,max(p.y,p.z));}
  25. // ?
  26. float lengthn(in vec3 p, float n){return pow((pow(p.x,n)+pow(p.y,n)+pow(p.z,n)),(1/n));}
  27. float length2(in vec3 p){return lengthn(p,2);}
  28. float length8(in vec3 p){return lengthn(p,8);}
  29.  
  30. //Matrixok
  31. mat4 identity(vec3 v){
  32.     return mat4(
  33.         1, 0, 0, 0,
  34.         0, 1, 0, 0,
  35.         0, 0, 1, 0,
  36.         0, 0, 0, 1
  37.     );
  38. }
  39.  
  40. mat4 translate(vec3 v){
  41.     return mat4(
  42.         1, 0, 0, 0,
  43.         0, 1, 0, 0,
  44.         0, 0, 1, 0,
  45.         v.x, v.y, v.z, 1
  46.     );
  47. }
  48.  
  49. mat4 scale(vec3 v){
  50.     return mat4(
  51.         v.x, 0,   0,   0,
  52.         0,   v.y, 0,   0,
  53.         0,   0,   v.z, 0,
  54.         0,   0,   0,   1
  55.     );
  56. }
  57.  
  58. mat4 rotate(vec3 v, float a){
  59.     float ca = cos(a);
  60.     float sa = sin(a);
  61.     vec3 vv = normalize(v);
  62.     float x = vv.x,
  63.           y = vv.y,
  64.           z = vv.z;
  65.     return mat4x4(
  66.         x*x*(1-ca)+ca,   x*y*(1-ca)-z*sa, x*z*(1-ca)+y*sa,   0,
  67.         y*x*(1-ca)+z*sa, y*y*(1-ca)+ca,   y*z*(1-ca)-x*sa,   0,
  68.         z*x*(1-ca)-y*sa, z*y*(1-ca)+x*sa, z*z*(1-ca)+ca,     0,
  69.         0,               0,               0,                 1
  70.     );
  71. }
  72.  
  73. //=================================================
  74. // Egyszeru primitivek IQ-tol
  75.  
  76. float sdSphere( vec3 p, float s ){
  77.   return length(p)-s;
  78. }
  79.  
  80. float udBox( vec3 p, vec3 b ){
  81.   return length(max(abs(p)-b,0.0));
  82. }
  83.  
  84. float udRoundBox( vec3 p, vec3 b, float r ){
  85.   return length(max(abs(p)-b,0.0))-r;
  86. }
  87.  
  88. float sdPlane( vec3 p, vec4 n ){
  89.   // n must be normalized
  90.   return dot(p,n.xyz) + n.w;
  91. }
  92. /*
  93. float sdBox( vec3 p, vec3 b ){
  94.   vec3  di = abs(p) - b;
  95.   float mc = maxcomp(di);
  96.   return min(mc,length(max(di,0.0)));
  97. }
  98. */
  99. float sdTorus82( vec3 p, vec2 t )
  100. {
  101.   vec3 q = vec3(length2(vec3(p.xz,0))-t.x,p.y,0);
  102.   return length8(q)-t.y;
  103. }
  104.  
  105. float sdTorus88( vec3 p, vec2 t )
  106. {
  107.   vec3 q = vec3(length8(vec3(p.xz,0))-t.x,p.y,0);
  108.   return length8(q)-t.y;
  109. }
  110.  
  111.  
  112. //=================================================
  113. // Primitiv muveletek
  114.  
  115. //osszeadas
  116. float opU( float d1, float d2 ){
  117.     return min(d1,d2);
  118. }
  119.  
  120. //kulonbseg
  121. float opS( float d1, float d2 )
  122. {
  123.     return max(-d1,d2);
  124. }
  125.  
  126. //translation
  127. vec3 opTx( vec3 p, mat4 m ){
  128.     return (inverse(m)*vec4(p,1)).xyz;
  129. }
  130.  
  131. vec3 opRep( vec3 p, vec3 c ){
  132.     return  mod(p,c)-0.5*c;
  133. }
  134.  
  135. //blend
  136. /*
  137. float opBlend(float pa, float pb){
  138.     //float d1 = primitiveA(p);
  139.     //float d2 = primitiveB(p);
  140.     float dd = smoothcurve(pa-pb);
  141.     return mix(pa,pb,dd);
  142. }
  143. */
  144. //hajlitas (nem mukodik)
  145. /*
  146. vec3 opCheapBend( vec3 p, float shift){
  147.     float c = cos(shift*p.y);
  148.     float s = sin(shift*p.y);
  149.     mat2  m = mat2(c,-s,s,c);
  150.     return vec3(m*p.xy,p.z);
  151. }
  152. */
  153. //--------------------------------------------------------------------------------------------------------------------
  154. // Scenek
  155.  
  156. /*
  157. vec3 tex0(in vec3 p){
  158.     vec3 col = vec3(1,1,1);
  159.     vec2 pos = vec2((p.x/5.), (p.z/5.)); //transform (or fract)
  160.     return vec3(length(pos));
  161. }
  162. */
  163.  
  164. mat4 kocka1Forog;
  165. mat4 forog;
  166.  
  167. void matrixok_kiszamol(){
  168.     float scene = params[3].w;
  169.     vec4 scenep = params[4];
  170.    
  171.     forog = rotate((vec4(1,0,0,0)*rotate(vec3(.371,.557,.742), params[1].x*.7)).xyz, params[1].x*.2);
  172.  
  173.     if (scene == 0){
  174.         kocka1Forog = translate(mix(vec3(20,30,-20), vec3(7,6,-7), scenep.w));
  175.         kocka1Forog *= forog;
  176.     } else if (scene == 1) {
  177.         // ...
  178.     }
  179. }
  180.  
  181. float inObj(in vec3 p){
  182.     float f = 1.;
  183.     float scene = params[3].w;
  184.     vec4 scenep = params[4];
  185.    
  186.     float plane = sdPlane(p, vec4(0,1,0,0));
  187.     float vagosik = opU(sdPlane(p, vec4(0,-1,0,0)), sdPlane(opTx(p,translate(vec3(-7))), vec4(0,1,0,0)));
  188.  
  189.     if (scene == 0){
  190.         float pyramid = 1.;
  191.         int h = 5;
  192.         for (int i=1; i<=h; i++){
  193.             pyramid = opU(pyramid, udBox(p, vec3(h-i, i, h-i)));
  194.         }
  195.         f = pyramid;
  196.  
  197.         //f = opU(f, udBox(opTx(p,kocka1Forog), vec3(4)));
  198.         //f = opU(f, plane);
  199.    
  200.     } else if (scene == 1){
  201.         f = opS(vagosik, udRoundBox( opRep(p, vec3(10, 10, 10)) , vec3(3.5), .2));
  202.     } else if (scene == 2){
  203.         f = opS(vagosik, sdTorus88( opRep(p, vec3(10, 10, 10)) , vec2(1,2)));
  204.         f = opU(f, plane);
  205.     } else {
  206.    
  207.     }
  208.     return f;
  209. }
  210.  
  211. vec3 inTexture(float m, vec3 p){
  212.     return vec3(0.1,0.15,0.2);
  213. }
  214.  
  215. //--------------------------------------------------------------------------------------------------------------------
  216. float intersect( in vec3 E, in vec3 M, out vec3 p)
  217. {
  218.     float t = 0.0;
  219.     // amikor release van akkor a nagyobb ertek kell
  220. #ifndef DEBUG
  221.     for(int i=0;i<256;i++)
  222. #else
  223.     for(int i=0;i<64;i++)
  224. #endif
  225.     {
  226.         p = E + M*t;
  227.         float h = inObj(p);
  228. #ifndef  DEBUG
  229.         if( h<0.0002 )
  230. #else
  231.         if( h<0.02 )
  232. #endif
  233.             //return vec4(t,h.yzw);
  234.             return t;
  235.         t += h;
  236.     }
  237.     //return vec4(-1.0);
  238.     return -1;
  239. }
  240.  
  241. vec3 calcNormal(in vec3 pos)
  242. {
  243.     vec3 eps = vec3(.001,0.0,0.0);
  244.     return normalize(vec3(
  245.         inObj(pos+eps.xyy) - inObj(pos-eps.xyy),
  246.         inObj(pos+eps.yxy) - inObj(pos-eps.yxy),
  247.         inObj(pos+eps.yyx) - inObj(pos-eps.yyx)
  248.     ));
  249. }
  250.  
  251. //--------------------------------------------------------------------------------------------------------------------
  252. // main fuggveny
  253.  
  254. void main(void)
  255. {
  256.     //hal_num(2, 3);
  257.    
  258.     vec2 p = -1.0 + 2.0 * gl_FragCoord.xy / params[0].xy;
  259.     p.x *= 1.33;
  260.  
  261.     //scene
  262.     //melyik scene + 4 szabad param.
  263.     float scene = params[3].w;
  264.     vec4 scenep = params[4];
  265.    
  266.     // light
  267.     vec3 light = normalize(vec3(1,.8,-.6));
  268.  
  269.     float ctime = params[1].x;
  270.    
  271.     // camera
  272.    
  273.     vec3 cE = params[2].xyz;
  274.     vec3 cC = params[3].xyz;
  275.    
  276.     float rot = PI*(params[2].w/180.);  //rotation
  277.    
  278.     vec3 ww = normalize(cC - cE); //EC vektor
  279.    
  280.     vec3 cU = (rotate(ww, rot)*vec4(0,1,0,0)).xyz ; //up vektor
  281.    
  282.     vec3 uu = normalize(cross(cU , ww ));
  283.     vec3 vv = normalize(cross(ww,uu));
  284.     vec3 rd = normalize( p.x*uu + p.y*vv + 1.5*ww );
  285.  
  286.     vec3 col = vec3(0.0);   // background
  287.     //col = vec3(.5,.7,1);
  288.    
  289.     matrixok_kiszamol();
  290.    
  291.     // Raymarch
  292.     vec3 P = vec3(p,0);
  293.     //vec4 tmat = intersect(cE,rd,P);
  294.     float tmat = intersect(cE,rd,P);
  295.     //if( tmat>0.0 )
  296.     {
  297.         vec3 pos = cE + tmat*rd;
  298.         vec3 nor = calcNormal(pos);
  299.  
  300.         float dif1 = max(0.4 + 0.6*dot(nor,light),0.0);
  301.         float dif2 = max(0.4 + 0.6*dot(nor,vec3(-light.x,light.y,-light.z)),0.0);
  302.  
  303.         // shadow
  304. //#if 0
  305.         //float ldis = 4.0;
  306.         //vec3 SP;
  307.         //float shadow = intersect( pos + light*ldis, -light, SP);
  308.         //if( shadow>0.0 && shadow<(ldis-0.01) ) dif1=0.0;
  309. //#endif
  310.  
  311. // textura hozzaad     
  312.         //col = vec3(1.0,0.97,0.85);
  313.         float lum = 2.0*dif1 + 0.2*dif2 + (.5+0.5*nor.y);
  314.        
  315.         col = inTexture(tmat, P)*lum;
  316.         //col  = vec3(0.2,0.2,0.2) * lum;
  317.        
  318.         // gamma lighting
  319.         col = col*0.5+0.5*sqrt(col)*2.2;
  320.  
  321.         // gamma kod
  322.         float g = scenep.y; if (g<.001) g = 1;
  323.         if (scene < 2) col *= .75*exp((-0.5*1./g)*tmat); else col *= .75*exp(-0.05*tmat);
  324.         //col *= .75*exp((-0.5*1./scenep.y)*tmat.x);
  325.     }
  326.     //else {
  327.     //  col.r = 1;
  328.     //}
  329.    
  330.     //if (scene < 1) col = mix(col, vec3(1), pow(scenep.x,5));
  331.     col = mix(col, vec3(1), pow(scenep.x,5));
  332.    
  333.     gl_FragColor = vec4(col,1.0);
  334. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement