Manta Interactive Ray Tracer Development Mailing List

Text archives Help


[Manta] r1948 - trunk/Engine/ImageTraversers


Chronological Thread 
  • From: arobison@sci.utah.edu
  • To: manta@sci.utah.edu
  • Subject: [Manta] r1948 - trunk/Engine/ImageTraversers
  • Date: Wed, 26 Dec 2007 19:19:00 -0700 (MST)

Author: arobison
Date: Wed Dec 26 19:18:58 2007
New Revision: 1948

Modified:
   trunk/Engine/ImageTraversers/DeadlineImageTraverser.cc
   trunk/Engine/ImageTraversers/DeadlineImageTraverser.h
Log:
Adding a "FIFOluminance" priority mode which will switch between FIFO mode and
luminance variance mode once a certain tilesize has been reached.  This
is adjustable through the "FIFOCutoff" parameter which defaults to 1.0,
meaning that the image will be sampled in FIFO mode to 1spp and then switch
to luminance variance mode.



Modified: trunk/Engine/ImageTraversers/DeadlineImageTraverser.cc
==============================================================================
--- trunk/Engine/ImageTraversers/DeadlineImageTraverser.cc      (original)
+++ trunk/Engine/ImageTraversers/DeadlineImageTraverser.cc      Wed Dec 26 
19:18:58 2007
@@ -76,6 +76,7 @@
   reset_every_frame = false;
   converged = false;
   ShowTimeSupersample = false;
+  FIFO_cutoff = 1.f;
 
   float frameRate = 15;
   ypacketsize = 1;
@@ -110,8 +111,13 @@
         priority = LuminanceVariance;
       else if(priorityString == "contrast")
         priority = Contrast;
+      else if(priorityString == "FIFOluminance")
+        priority = FIFO_to_LumVar;
       else
         throw IllegalArgument("DeadlineImageTraverser -priority, bad 
priority", i, args);
+    } else if(arg == "-FIFOCutoff") {
+      if(!getArg(i, args, FIFO_cutoff))        
+        throw IllegalArgument("DeadlineImageTraverser -FIFOCutoff", i, args);
     } else if(arg == "-refinmentRatio"){
       if(!getResolutionArg(i, args, xrefinementRatio, yrefinementRatio))
         throw IllegalArgument("DeadlineImageTraverser -refinement", i, args);
@@ -632,32 +638,64 @@
     image->setValid(true);
 }
 
+float DeadlineImageTraverser::computeLuminancePriority(Tile* tile, const 
Fragment& frag) const
+{
+  double sum = 0;
+  double sum2 = 0;
+  for(int i=frag.begin();i<frag.end();i++){
+    Color::ComponentType luminance = frag.getColor(i).luminance();
+    sum += luminance;
+    sum2 += luminance * luminance;
+  }
+  int n = frag.end()-frag.begin();
+  Color::ComponentType variance = (sum2 - sum * sum/n)/(n);
+  return variance * tile->xmag * tile->ymag;
+}
+
+float DeadlineImageTraverser::computeContrastPriority(Tile* tile, const 
Fragment& frag) const
+{
+  Color::ComponentType min, max;
+  min = max = frag.getColor(frag.begin()).luminance();
+  for(int i=frag.begin()+1;i<frag.end();i++){
+    Color::ComponentType luminance = frag.getColor(i).luminance();
+    if(luminance < min)
+      min = luminance;
+    if(luminance > max)
+      max = luminance;
+  }
+  return (max-min)/(max+min) * tile->xmag  * tile->ymag ;  
+}
+
+float DeadlineImageTraverser::computeFIFOPriority(Tile* tile, const 
Fragment& frag) const
+{
+  return tile->xmag * tile->ymag;
+}
+
 void DeadlineImageTraverser::computePriority(Tile* tile, const Fragment& 
frag) const
 {
-  if(priority == LuminanceVariance){
-    double sum = 0;
-    double sum2 = 0;
-    for(int i=frag.begin();i<frag.end();i++){
-      Color::ComponentType luminance = frag.getColor(i).luminance();
-      sum += luminance;
-      sum2 += luminance * luminance;
-    }
-    int n = frag.end()-frag.begin();
-    Color::ComponentType variance = (sum2 - sum * sum/n)/(n);
-    tile->priority = variance * tile->xmag * tile->ymag;
-  } else if(priority == Contrast){
-    Color::ComponentType min, max;
-    min = max = frag.getColor(frag.begin()).luminance();
-    for(int i=frag.begin()+1;i<frag.end();i++){
-      Color::ComponentType luminance = frag.getColor(i).luminance();
-      if(luminance < min)
-        min = luminance;
-      if(luminance > max)
-        max = luminance;
-    }
-    tile->priority = (max-min)/(max+min) * tile->xmag  * tile->ymag ;
-  } else {
-    tile->priority = tile->xmag * tile->ymag;
+  switch(priority) {
+  case LuminanceVariance:
+    tile->priority = computeLuminancePriority(tile, frag);
+    break;
+
+  case Contrast:
+    tile->priority = computeLuminancePriority(tile, frag);
+    break;
+
+  case FIFO:
+    tile->priority = computeFIFOPriority(tile, frag);
+    break;
+
+  case FIFO_to_LumVar:
+    if(tile->xmag < FIFO_cutoff || tile->ymag < FIFO_cutoff)
+      tile->priority = computeLuminancePriority(tile, frag);
+    else
+      tile->priority = computeFIFOPriority(tile, frag);
+    break;
+
+  default:
+    throw InternalError("Bad priority in computePriority");
+    break;
   }
 }
 

Modified: trunk/Engine/ImageTraversers/DeadlineImageTraverser.h
==============================================================================
--- trunk/Engine/ImageTraversers/DeadlineImageTraverser.h       (original)
+++ trunk/Engine/ImageTraversers/DeadlineImageTraverser.h       Wed Dec 26 
19:18:58 2007
@@ -103,14 +103,18 @@
     bool converged;
     double StartFrameTime;
     enum PriorityScheme {
-      FIFO, LuminanceVariance, Contrast
+      FIFO, LuminanceVariance, Contrast, FIFO_to_LumVar
     };
     PriorityScheme priority;
+    float FIFO_cutoff;
 
     void insertIntoQueue(Tile* tile, size_t thread_id);
     void insertIntoQueue(vector<Tile*>& tiles, size_t thread_id);
     Tile* popFromQueue(size_t thread_id);
 
+    float computeLuminancePriority(Tile* tile, const Fragment& frag) const;
+    float computeContrastPriority(Tile* tile, const Fragment& frag) const;
+    float computeFIFOPriority(Tile* tile, const Fragment& frag) const;
     void computePriority(Tile* tile, const Fragment& frag) const;
   };
 }




  • [Manta] r1948 - trunk/Engine/ImageTraversers, arobison, 12/26/2007

Archive powered by MHonArc 2.6.16.

Top of page