Advertisement
Guest User

Untitled

a guest
Oct 27th, 2016
55
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.72 KB | None | 0 0
  1. function shade(objPoint,ray,depth){
  2.  
  3. color = rgb(0,0,0);
  4. shadowRay = calc_shadowRay(objPoint,light);
  5.  
  6. if(!inShadow(shadowRay,objPoint))
  7. color = summvv(color,lighting_object(objPoint.closestPoint,objPoint.object,light,ray));
  8.  
  9. if(depth <= 3){
  10. if(objPoint.object.material.kr > 0.0 && objPoint.object.type == "sphera"){
  11. nHit = normalize(diff(objPoint.closestPoint,objPoint.object.o));
  12. outside = dot(nHit,ray.d) < 0;
  13. bs = prodvs(nHit,bias);
  14. reflectedRay = new Object();
  15. reflectedRay.o =(!outside)? diff(objPoint.closestPoint,bs):summvv(objPoint.closestPoint,bs);
  16. reflectedRay.d = normalize(calc_reflectedRay(ray,nHit));
  17. reflectionColor = trace(reflectedRay,++depth).color;
  18. color = summvv(color, prodvs(reflectionColor,objPoint.object.material.kr));
  19. }
  20.  
  21. if(objPoint.object.material.kt > 0.0 && objPoint.object.type == "sphera"){
  22. nHit = normalize(diff(objPoint.closestPoint,objPoint.object.o));
  23. outside = dot(nHit,ray.d) < 0;
  24. bs = prodvs(nHit,bias);
  25. fe = fresnel(ray,nHit);
  26.  
  27. reflectedRay = new Object();
  28. reflectedRay.o = (!outside)? diff(objPoint.closestPoint,bs):summvv(objPoint.closestPoint,bs);
  29. reflectedRay.d = normalize(calc_reflectedRay(ray,nHit));
  30. reflectionColor = trace(reflectedRay,++depth).color;
  31.  
  32. if(fe < 1){
  33. refractedRay = new Object();
  34. refractedRay.o = (outside)? diff(objPoint.closestPoint,bs):summvv(objPoint.closestPoint,bs);
  35. dirRefraction = calc_refractedRay(ray,nHit);
  36. refractedRay.d = normalize(dirRefraction);
  37. refractionColor = trace(refractedRay,++depth).color;
  38.  
  39. }
  40.  
  41. rfl = prodvs(reflectionColor,fe);
  42. rfr = prodvs(refractionColor,1-fe);
  43. finalColor = summvv(rfl,rfr);
  44. color = summvv(color,finalColor);
  45.  
  46. }
  47. }
  48.  
  49. function fresnel(_ray,nHit){
  50. cosi = clamp(dot(nHit,_ray.d),-1,1);
  51. etai = 1.0; etat = 1.3;
  52.  
  53. if(cosi > 0){
  54. temp = etai;
  55. etai = etat;
  56. etat = temp;
  57. }
  58.  
  59. eta = etai/etat;
  60. sint = eta * Math.sqrt(1 - cosi*cosi);
  61.  
  62. if(sint >= 1) return 1.0;
  63. else{
  64. cost = Math.sqrt(1 - sint*sint);
  65. cosi = Math.abs(cosi);
  66. Lperp = (etai*cosi - etat*cost)/(etai*cosi + etat*cost);
  67. Lparal = (etat*cosi - etai*cost)/(etat*cosi + etai*cost);
  68. return (Lperp*Lperp + Lparal*Lparal)/2.0;
  69. }
  70.  
  71. function calc_refractedRay(_ray,nHit){
  72. cosi = clamp(dot(nHit,_ray.d),-1,1);
  73. etai = 1.0; etat = 1.3;
  74.  
  75. if(cosi < 0) cosi = -cosi;
  76. else{
  77. nHit = prodvs(nHit,-1);
  78. temp = etai;
  79. etai = etat;
  80. etat = temp;
  81. }
  82.  
  83. eta = etai/etat;
  84. cost2 = 1 - eta*eta*(1 - cosi*cosi);
  85.  
  86. if(cost2 < 0) return;
  87. else return summvv(prodvs(_ray.d,eta) , prodvs(nHit , (eta*cosi - Math.sqrt(cost2))));
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement