Advertisement
Guest User

Raytracing Example

a guest
Oct 1st, 2013
435
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. <!DOCTYPE html>
  2. <html>
  3.     <head>
  4.         <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  5.         <title>Ray Tracing Example</title>
  6.         <style>
  7.         html{
  8.             background: white;
  9.         }
  10.             body{
  11.                 background: white;
  12.                 position: relative;
  13.                 margin: 0 auto;
  14.  
  15.             }
  16.             #viewport{
  17.             width: 100%;
  18.             height: 100%;
  19.             }
  20.            
  21.                 </style>
  22.         <script type="x-shader/x-vertex" id="vertexshader">
  23. #define STEPS 50
  24.      varying float PointIntensity;
  25.      uniform vec3 camera;
  26.     uniform vec3 dimension;
  27.    
  28.    
  29.  
  30.    //determines if the position is inside the volume
  31.     bool inside(vec3 posVec){
  32.             bool value = false;
  33.            
  34.             if(posVec.x <0.0 ||posVec.x > dimension.x ){
  35.                 value = false;
  36.             }
  37.             else if(posVec.y <0.0 ||posVec.y > dimension.y ){
  38.                 value = false;
  39.             }
  40.             else if(posVec.z <0.0 ||posVec.z > dimension.z ){
  41.                 value = false;
  42.          }
  43.          else{
  44.             value = true;
  45.          }
  46.          return value;
  47.         }
  48.    
  49.  
  50.        
  51.        
  52.    
  53.     float getDensity(vec3 PointPos){
  54.    
  55.         float stepsize = 1.0;
  56.         float emptyStep = 15.0;
  57.        
  58.         vec3 leap;
  59.         bool hit = false;
  60.         float density = 0.000;
  61.         // Ray direction from the camera through the current point in the Plane
  62.         vec3 dir = PointPos- camera;
  63.         vec3 RayDirection = normalize(dir);
  64.         vec3 start = PointPos;  
  65.            
  66.         for(int i = 0; i<STEPS; i++){
  67.              
  68.              vec3 alteredPosition = start;
  69.              alteredPosition.x += 20.5;
  70.              alteredPosition.y += 20.5;
  71.              alteredPosition.z += 20.5;
  72.              
  73.             bool insideTest = inside(alteredPosition);
  74.            
  75.             if(insideTest){
  76.            
  77.              
  78.              // advance from the start position
  79.             start = start + RayDirection * stepsize;
  80.          
  81.               hit = true;
  82.            
  83.          }else{
  84.             leap = start + RayDirection * emptyStep;
  85.             bool tooFar = inside(leap);
  86.             if(tooFar){
  87.                 start = start + RayDirection * stepsize;
  88.             }else{
  89.                 start = leap;
  90.             }
  91.          }
  92.            
  93.         }
  94.         if(hit){
  95.             density = 1.000;
  96.         }
  97.        
  98.         return density;
  99.     }
  100.  
  101.    
  102.             void main() {
  103.      
  104.      
  105.         PointIntensity = getDensity(position);
  106.         vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );
  107.         gl_Position = projectionMatrix * mvPosition;
  108.  
  109.     }
  110.  
  111. </script>
  112.  
  113. <script type="x-shader/x-fragment" id="fragmentshader">
  114.  
  115.  
  116.    
  117.     varying float PointIntensity;
  118.    
  119.     void main() {
  120.        
  121.        //Rays that have traversed the volume (cube) should leave a red point on the viewplane, Rays that just went through empty space a black point
  122.            gl_FragColor= vec4(PointIntensity, 0.0, 0.0, 1.0);
  123.          
  124.          
  125.  
  126.     }
  127. </script>      
  128.        
  129.         <script src="ressources/three.min.js"></script>
  130.         <script src="ressources/TrackballControls.js"></script>
  131.         <script src="ressources/jquery-2.0.3.min.js"></script>
  132.        
  133.        
  134.         </head>
  135. <body>
  136.  
  137. <canvas id="viewport" style=" position: relative;">
  138. </canvas>
  139.  
  140. <script>
  141. //Dimensions of the volume (cube)
  142. var xDimension = 41.0;
  143. var yDimension = 41.0;
  144. var zDimension = 41.0;
  145.  
  146.  
  147.  var browserWidth = window.innerWidth;
  148.   var browserHeight = window.innerHeight;
  149.  
  150. $('#viewport').height(browserHeight);
  151. $('#viewport').width(browserWidth);
  152. var  camera, renderer, scene, Mesh, shaderMaterial;
  153.  
  154. init();
  155.  
  156.  
  157.  
  158.  
  159. function init(){
  160.  camera = new THREE.PerspectiveCamera( 60, browserWidth / browserHeight, 1, 500 );
  161.  
  162.         camera.position.z = 85;
  163.        
  164.         camera.lookAt(new THREE.Vector3(0,0,0));
  165.                  
  166.         scene = new THREE.Scene();
  167.          scene.fog = new THREE.Fog( 0x777777, 1, 500 );
  168.        
  169.        
  170.  
  171.  
  172.  
  173.  
  174.    
  175.     uniforms = {
  176.        
  177.    
  178.         camera: {type: "v3", value: camera.position},
  179.         dimension: {type: "v3", value: new THREE.Vector3(xDimension, yDimension, zDimension)},
  180.        
  181.        
  182.     };        
  183.        
  184.  
  185.     shaderMaterial = new THREE.ShaderMaterial( {
  186.  
  187.         uniforms:       uniforms,
  188.         vertexShader:   document.getElementById( 'vertexshader' ).textContent,
  189.         fragmentShader: document.getElementById( 'fragmentshader' ).textContent,
  190.         transparent: false,
  191.         wireframe: false
  192.  
  193.     });
  194.  
  195.  
  196.  
  197. shaderMaterial.needsUpdate = true,
  198. viewplane = new THREE.PlaneGeometry(60, 60, 250, 250);
  199.  
  200. Mesh = new THREE.Mesh(viewplane, shaderMaterial);
  201. Mesh.position.z = -55;
  202.  
  203.  
  204. camera.add(Mesh);
  205. scene.add(camera);
  206.  
  207.  
  208.  
  209.  
  210.  
  211. renderer = new THREE.WebGLRenderer({canvas: viewport});
  212.        
  213.         renderer.setClearColor( scene.fog.color, 1 );
  214.         renderer.setSize( browserWidth, browserHeight );
  215.    
  216.  
  217.        controls = new THREE.TrackballControls(camera);
  218.                 controls.target.set( 0, 0,0);
  219.              
  220.  
  221.                 controls.rotateSpeed = 0.4;
  222.                 controls.zoomSpeed = 1.2;
  223.                 controls.panSpeed = 0.4;
  224.  
  225.                 controls.noZoom = false;
  226.                 controls.noPan = false;
  227.  
  228.                 controls.staticMoving = true;
  229.                 controls.dynamicDampingFactor = 0.10;
  230.  
  231.                 controls.keys = [ 65, 83, 68 ];
  232.                
  233.                 animate();
  234.              
  235.                
  236. }
  237.  
  238.  function animate() {
  239.  
  240.         requestAnimationFrame( animate );
  241.        
  242.        shaderMaterial.uniforms[ 'camera' ].value = camera.position.clone();
  243.    
  244.       controls.update();
  245.        
  246.         renderer.render( scene, camera );
  247.      
  248.      
  249.     }
  250.  
  251.  
  252. </script>
  253. </body>
  254. </html>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement