Manta Interactive Ray Tracer Development Mailing List

Text archives Help


[MANTA] r522 - in branches/AFR/Engine/ImageTraversers: . AFR


Chronological Thread 
  • From: abhinav@sci.utah.edu
  • To: manta@sci.utah.edu
  • Subject: [MANTA] r522 - in branches/AFR/Engine/ImageTraversers: . AFR
  • Date: Tue, 30 Aug 2005 23:48:30 -0600 (MDT)

Author: abhinav
Date: Tue Aug 30 23:48:29 2005
New Revision: 522

Modified:
   branches/AFR/Engine/ImageTraversers/AFImageTraverser.cc
   branches/AFR/Engine/ImageTraversers/AFImageTraverser.h
   branches/AFR/Engine/ImageTraversers/AFR/kdtree.cc
   branches/AFR/Engine/ImageTraversers/AFR/tiles.cc
Log:
approximately fixed undersampling. not great but workable.
added jittering of samples always. may need to switch to conditional 
jittering in future where we jitter only when tgrads are very low.
Abe mentioned tgrads were unusually high. However I could not reproduce that 
on the simple scene I have.
Added spatial coherence, use commandline option -spatial. 

still has unstability issues with multiple threads.



Modified: branches/AFR/Engine/ImageTraversers/AFImageTraverser.cc
==============================================================================
--- branches/AFR/Engine/ImageTraversers/AFImageTraverser.cc     (original)
+++ branches/AFR/Engine/ImageTraversers/AFImageTraverser.cc     Tue Aug 30 
23:48:29 2005
@@ -54,6 +54,7 @@
   displayClientId( 0 ),
   visScale( 1.0 ),
   outputStreams( false ),
+  spatialCoherence( false ),
   //streamlock( "streamlock" ),
   tmode(SOLID)
 {
@@ -80,6 +81,9 @@
       }
       outputStreams = true;
     }
+    if (args[i] == "-spatial") {
+      spatialCoherence = true;
+    }
     if (args[i] == "-debug") {
       debug_window = true;
     }
@@ -578,10 +582,13 @@
     RayPacketData raydata;
     RayPacket rays(raydata, size, depth, flags);
     
+    int cx, cy;
+    //int tindex = kdtree[myID].getRandomSample(cx, cy, 
myRandomNumber[myID]);
+    int tindex = kdtree[myID].getPseudoRandomTile();
+    int coherenceCount=0;
     // Copy samples from the sampleQ into the fragment.
     for(i=0;i<size;i++) {
-      int cx, cy;
-      int tindex = kdtree[myID].getRandomSample(cx, cy, 
myRandomNumber[myID]);
+      kdtree[myID].getRandomSamplefromTile(tindex, cx, cy, 
myRandomNumber[myID]);
       // cout << "f+i = " << f+i << endl;
       newSample[myID][f+i].viewCoord[0] = cx;
       newSample[myID][f+i].viewCoord[1] = cy;
@@ -592,22 +599,33 @@
                        
       // cout << "raytracing: " << cx << ", " << cy << endl;
       // we will jitter later, now just add 0.5 <TODO>
+      double jitterx, jittery;
+      jitterx = myRandomNumber[myID].genfrand();
+      jittery = myRandomNumber[myID].genfrand();
       if(xres>yres) // let the smaller dimension be mapped to [-1,1]
         {
-          px = (double)(-1.0 + 
2.0*(double)newSample[myID][f+i].viewCoord[0]/(double)yres); 
-          py = (double)(-1.0 + 
2.0*(double)newSample[myID][f+i].viewCoord[1]/(double)yres);
+          px = (double)(-1.0 + 
2.0*((double)newSample[myID][f+i].viewCoord[0]+jitterx)/(double)yres); 
+          py = (double)(-1.0 + 
2.0*((double)newSample[myID][f+i].viewCoord[1]+jittery)/(double)yres);
         }
       else
         {
-          px = (double)(-1.0 + 
2.0*(double)newSample[myID][f+i].viewCoord[0]/(double)xres); 
-          py = (double)(-1.0 + 
2.0*(double)newSample[myID][f+i].viewCoord[1]/(double)xres);
+          px = (double)(-1.0 + 
2.0*((double)newSample[myID][f+i].viewCoord[0]+jitterx)/(double)xres); 
+          py = (double)(-1.0 + 
2.0*((double)newSample[myID][f+i].viewCoord[1]+jittery)/(double)xres);
         }  
                                
+      if(px<-1.0) px = -1.0; if(px>1.0) px = 1.0;
+      if(py<-1.0) py = -1.0; if(py>1.0) py = 1.0;
       // samples_done[context.proc] ++;
       samples_done[context.proc].addOne();
       
       // Specify the position and color pointer for the packet element.
       rays.setPixel(i, 0, px, py, &color[i]);
+      coherenceCount++;
+      if(!spatialCoherence || 
coherenceCount>=kdtree[myID].getTileSize(tindex)/10)
+      {
+        tindex = kdtree[myID].getPseudoRandomTile();
+       coherenceCount=0;
+      }
     }
     
     
//////////////////////////////////////////////////////////////////////////

Modified: branches/AFR/Engine/ImageTraversers/AFImageTraverser.h
==============================================================================
--- branches/AFR/Engine/ImageTraversers/AFImageTraverser.h      (original)
+++ branches/AFR/Engine/ImageTraversers/AFImageTraverser.h      Tue Aug 30 
23:48:29 2005
@@ -90,6 +90,7 @@
                        // number of fragments a chunk is divided into. It is 
divided equally amongst all clients
                        int numFragments;
                        bool outputStreams;
+                       bool spatialCoherence;
                        string streamfilename;
                        FILE **streamfile;
                        //SCIRun::Mutex streamlock;

Modified: branches/AFR/Engine/ImageTraversers/AFR/kdtree.cc
==============================================================================
--- branches/AFR/Engine/ImageTraversers/AFR/kdtree.cc   (original)
+++ branches/AFR/Engine/ImageTraversers/AFR/kdtree.cc   Tue Aug 30 23:48:29 
2005
@@ -23,7 +23,7 @@
 {
        A = 1.0;
        // B is calculated such that the oldest sample after 2/3rd sec  
weight >=0.01
-       float decaytime = 400000.0*1.0/((float)samplingrate*3.0);
+       float decaytime = 400000.0*2.0/((float)samplingrate*3.0);
        B = -1.0*log(0.01)/decaytime;
        //cout << "samplingrate = " << samplingrate << endl;
        //B = -1.0*log(0.01)/(2.0/3.0);

Modified: branches/AFR/Engine/ImageTraversers/AFR/tiles.cc
==============================================================================
--- branches/AFR/Engine/ImageTraversers/AFR/tiles.cc    (original)
+++ branches/AFR/Engine/ImageTraversers/AFR/tiles.cc    Tue Aug 30 23:48:29 
2005
@@ -116,7 +116,7 @@
 float Tile::getUnderSampling(float currenttime, int samplingrate, Tile *tree)
 {
        float meanGlobalAge = 
0.5*(float)tree[1].num_pixels/(float)samplingrate;
-       float uerror = (currenttime - 
sum_tstamps.getMean())*0.16/meanGlobalAge - 1.0;
+       float uerror = (currenttime - 
sum_tstamps.getMean())*0.33/meanGlobalAge - 1.0;
        if(uerror>1.0) uerror = 1.0;
        if(uerror<0.0) uerror = 0.0;
        return uerror;
@@ -129,7 +129,7 @@
        //      +0.25*getOcclusionMeasure(tree, nTiles))*num_pixels ;
        //error =        
2.0*(intensity.getVariance()+AMBIENT_ERROR)*num_pixels; 
        error =  2.0*(r.getVariance() + g.getVariance() + b.getVariance() + 
AMBIENT_ERROR)*num_pixels; 
-       //error += 0.25*getUnderSampling(currenttime, samplingrate, 
tree)*num_pixels; 
+       error += 0.25*getUnderSampling(currenttime, samplingrate, 
tree)*num_pixels; 
        error += 0.25*getOcclusionMeasure(tree, nTiles)*num_pixels;
 }
 
@@ -214,7 +214,8 @@
        tGradient.addElement(newsampleset->tgrad, wt_new, ratio);
        
        sum_tstamps.addElement(stime, wt_new, ratio);
-       sum_tstamps.addElement(4.0*stime, wt_new, 1.0);
+       //sum_tstamps.addElement(4.0*stime, wt_new, 1.0);
+       //sum_tstamps.addElement(temptime, 
getWeight(A,B,currenttime-temptime), 1.0);
        
        float occ = (newsampleset->isOccluded())? 1.0 : 0.0;
        occlusion.addElement(occ, wt_new, ratio);




  • [MANTA] r522 - in branches/AFR/Engine/ImageTraversers: . AFR, abhinav, 08/30/2005

Archive powered by MHonArc 2.6.16.

Top of page