Changeset 1891


Ignore:
Timestamp:
12/13/06 23:12:27 (17 years ago)
Author:
bittner
Message:

combined preprocessor

Location:
GTP/trunk/Lib/Vis/Preprocessing/src
Files:
2 added
9 edited

Legend:

Unmodified
Added
Removed
  • GTP/trunk/Lib/Vis/Preprocessing/src/Makefile

    r1884 r1891  
    11############################################################################# 
    22# Makefile for building: preprocessor 
    3 # Generated by qmake (2.00a) (Qt 4.1.2) on: st 13. XII 00:50:24 2006 
     3# Generated by qmake (2.00a) (Qt 4.1.2) on: st 13. XII 23:09:08 2006 
    44# Project:  preprocessor.pro 
    55# Template: app 
  • GTP/trunk/Lib/Vis/Preprocessing/src/PreprocessorFactory.cpp

    r1486 r1891  
    66#include "RenderSampler.h" 
    77#include "GvsPreprocessor.h" 
     8#include "CombinedPreprocessor.h" 
    89 
    910 
     
    1718                return new VssPreprocessor(); 
    1819        } 
    19          
     20 
     21        if (preprocessorType == "combined") 
     22        { 
     23                return new CombinedPreprocessor(); 
     24        } 
     25 
    2026        if (preprocessorType == "rss") 
    2127        { 
  • GTP/trunk/Lib/Vis/Preprocessing/src/RssPreprocessor.cpp

    r1884 r1891  
    435435  Randomize(0); 
    436436 
    437   if (1) { 
     437  if (0) { 
    438438        Exporter *exporter = Exporter::GetExporter("samples.wrl"); 
    439439    exporter->SetFilled(); 
     
    501501  char *curr = buff; 
    502502  mUseRssTree = false; 
     503 
    503504  while (1) { 
    504505        char *e = strchr(curr,'+'); 
     
    542543  mMixtureDistribution->Init(); 
    543544  bool oldGenerator = false; 
     545 
     546  const int batch = 100000; 
    544547   
    545548  if (mLoadInitialSamples) { 
     
    579582           
    580583        } else { 
    581           const int batch = 1000; 
    582584          for (int i=0; i < mInitialSamples; i+=batch) { 
    583585                rays.clear(); 
  • GTP/trunk/Lib/Vis/Preprocessing/src/RssTree.cpp

    r1884 r1891  
    2929#include "SceneGraph.h" 
    3030#include "SamplingStrategy.h" 
     31#include "ViewCellsManager.h" 
    3132 
    3233 
     
    27332734// if small very high importance of the last sample 
    27342735// if 1.0f then weighs = 1 1/2 1/3 1/4 
    2735 float passSampleWeightDecay = 1.0f; 
     2736float passSampleWeightDecay = 2.0f; 
    27362737//float passSampleWeightDecay = 1000.0f; 
    27372738 
     
    27402741{ 
    27412742  int passDiff = mCurrentPass - pass; 
     2743  if (passDiff < 0) { 
     2744        cerr<<"Error: passdif < 0"<<passDiff<<endl; 
     2745        exit(1); 
     2746  } 
    27422747  float weight; 
    2743   if (0)  
     2748  if (1)  
    27442749        weight = 1.0f/(passDiff + passSampleWeightDecay); 
    27452750  else  
     
    27882793RssTree::ComputeImportance(RssTreeLeaf *leaf)  
    27892794{ 
    2790 #if 1 
     2795#if 0 
    27912796  if (leaf->mTotalRays) 
    27922797        leaf->mImportance = leaf->mTotalContribution / leaf->mTotalRays; 
     
    28562861         
    28572862        if (sumWeights != 0.0f) { 
     2863#if 1 
    28582864          leaf->mImportance = 
    2859                         sqr(((weightAbsContributions*sumContributions + 
    2860                                                 (1.0f - weightAbsContributions)*sumRelContributions)/sumWeights)); 
    2861            
    2862           //      leaf->mImportance = 
    2863           //            (weightAbsContributions*maxContribution + 
    2864           //             (1.0f - weightAbsContributions)*maxRelContribution)/sumWeights; 
    2865            
     2865                pow(((weightAbsContributions*sumContributions + 
     2866                          (1.0f - weightAbsContributions)*sumRelContributions)/sumWeights), 3); 
     2867#else  
     2868          leaf->mImportance = 
     2869                (weightAbsContributions*maxContribution + 
     2870                 (1.0f - weightAbsContributions)*maxRelContribution)/sumWeights; 
     2871#endif 
    28662872        } else 
    28672873          leaf->mImportance = 0.0f; 
     
    28772883RssTreeNode::GetImportance()  const 
    28782884{ 
    2879   //  return sqr(mImportance); 
     2885  // return mImportance*mImportance; 
    28802886  return mImportance; 
    28812887} 
     
    31203126  float r[5]; 
    31213127 
    3122   if (mRssTree == NULL) 
    3123         return false; 
    3124    
    31253128  mHalton.GetNext(5, r); 
    31263129 
    3127   SimpleRayContainer rays; 
    3128   mRssTree->GenerateRay(r, rays); 
    3129   ray = rays[0]; 
    3130    
    3131   return false; 
     3130  if (mRssTree == NULL) { 
     3131        // use direction based distribution 
     3132        Vector3 origin, direction; 
     3133        mPreprocessor.mViewCellsManager->GetViewPoint(origin, Vector3(r[0], r[1], r[2])); 
     3134         
     3135        direction = UniformRandomVector(r[3], r[4]); 
     3136 
     3137        const float pdf = 1.0f; 
     3138        ray = SimpleRay(origin, direction, RSS_BASED_DISTRIBUTION, pdf); 
     3139         
     3140  } else { 
     3141         
     3142        SimpleRayContainer rays; 
     3143        mRssTree->GenerateRay(r, rays); 
     3144        ray = rays[0]; 
     3145  } 
     3146   
     3147  return true; 
    31323148} 
    31333149 
     
    31413157        /// compute view cell contribution of rays if view cells manager already constructed 
    31423158        //  mViewCellsManager->ComputeSampleContributions(mVssRays, true, false); 
    3143          
    31443159        mRssTree->Construct(mPreprocessor.mObjects, vssRays); 
    31453160        mRssTree->stat.Print(mPreprocessor.mStats); 
     
    31473162         
    31483163  } else { 
     3164        mRssTree->SetPass(mPass); 
    31493165        Debug<<"Adding rays...\n"<<flush; 
    31503166        mRssTree->AddRays(vssRays); 
  • GTP/trunk/Lib/Vis/Preprocessing/src/SamplingStrategy.cpp

    r1888 r1891  
    55#include "ViewCellsManager.h" 
    66#include "AxisAlignedBox3.h" 
    7  
     7#include "RssTree.h" 
    88 
    99namespace GtpVisibilityPreprocessor { 
     
    475475  for (int i=0; i < mDistributions.size(); i++) { 
    476476        // small non-zero value 
    477         mDistributions[i]->mRays = 1; 
     477        mDistributions[i]->mTotalRays = 0; 
    478478        // unit contribution per ray 
    479         mDistributions[i]->mContribution = 1.0f; 
     479        mDistributions[i]->mTotalContribution = 0.0f; 
    480480  } 
    481481  UpdateRatios(); 
     
    490490 
    491491  // pickup a distribution 
    492   for (int i=0; i < mDistributions.size(); i++) 
     492  for (int i=0; i < mDistributions.size()-1; i++) 
    493493        if (r < mDistributions[i]->mRatio) 
    494494          break; 
    495    
     495 
    496496  return mDistributions[i]->GenerateSample(ray); 
    497497} 
     
    505505  VssRayContainer::iterator it = vssRays.begin(); 
    506506 
     507  for (i=0; i < mDistributions.size(); i++) { 
     508        mDistributions[i]->mContribution = 0; 
     509        mDistributions[i]->mRays = 0; 
     510  } 
     511 
    507512  for(; it != vssRays.end(); ++it) { 
    508513        VssRay *ray = *it; 
    509         for (i=0; i < mDistributions.size()-1; i++) 
     514        for (i=0; i < mDistributions.size()-1; i++) { 
    510515          if (mDistributions[i]->mType == ray->mDistribution) 
    511516                break; 
     517        } 
     518  
    512519        float contribution = 
    513           mPreprocessor.mViewCellsManager->ComputeSampleContributions(vssRays, true, false); 
     520          mPreprocessor.mViewCellsManager->ComputeSampleContribution(*ray, true, false); 
    514521        mDistributions[i]->mContribution += contribution; 
    515522        mDistributions[i]->mRays ++; 
     523 
     524        mDistributions[i]->mTotalContribution += contribution; 
     525        mDistributions[i]->mTotalRays ++; 
    516526  } 
    517527 
    518528  // now update the distributions with all the rays 
    519   for (i=0; i < mDistributions.size(); i++) 
     529  for (i=0; i < mDistributions.size(); i++) { 
    520530        mDistributions[i]->Update(vssRays); 
     531  } 
    521532   
    522533   
     
    531542  int i; 
    532543  for (i=0; i < mDistributions.size(); i++) { 
    533         float importance = mDistributions[i]->mContribution/mDistributions[i]->mRays; 
     544        cout<<i<<": c="<<mDistributions[i]->mContribution<< 
     545          " rays="<<mDistributions[i]->mRays<<endl; 
     546        float importance = 0.0f; 
     547        if (mDistributions[i]->mRays != 0) { 
     548          importance = pow(mDistributions[i]->mContribution/mDistributions[i]->mRays, 3); 
     549        } 
     550        if (importance < Limits::Small) 
     551          importance = Limits::Small; 
    534552        mDistributions[i]->mRatio = importance; 
    535553        sum += importance; 
    536554  } 
    537    
     555 
     556  const float minratio = 0.05f; 
     557  float threshold = minratio*sum; 
     558  for (i=0; i < mDistributions.size(); i++) { 
     559        if (mDistributions[i]->mRatio < threshold) { 
     560          sum += threshold - mDistributions[i]->mRatio; 
     561          mDistributions[i]->mRatio = threshold; 
     562        } 
     563  } 
    538564   
    539565  mDistributions[0]->mRatio /= sum; 
     566         
    540567  for (i=1; i < mDistributions.size(); i++) { 
    541568        float r = mDistributions[i]->mRatio / sum; 
     
    548575  cout<<endl; 
    549576} 
    550 } 
    551  
    552  
     577 
     578 
     579 
     580bool 
     581MixtureDistribution::Construct(char *str) 
     582{ 
     583  char *curr = str; 
     584 
     585  while (1) { 
     586        char *e = strchr(curr,'+'); 
     587        if (e!=NULL) { 
     588          *e=0; 
     589        } 
     590         
     591        if (strcmp(curr, "rss")==0) { 
     592          mDistributions.push_back(new RssBasedDistribution(mPreprocessor)); 
     593        } else 
     594          if (strcmp(curr, "object")==0) { 
     595                mDistributions.push_back(new ObjectBasedDistribution(mPreprocessor)); 
     596          } else 
     597                if (strcmp(curr, "spatial")==0) { 
     598                  mDistributions.push_back(new SpatialBoxBasedDistribution(mPreprocessor)); 
     599                } else 
     600                  if (strcmp(curr, "global")==0) { 
     601                        mDistributions.push_back(new GlobalLinesDistribution(mPreprocessor)); 
     602                  } else 
     603                        if (strcmp(curr, "direction")==0) { 
     604                          mDistributions.push_back(new DirectionBasedDistribution(mPreprocessor)); 
     605                        } else 
     606                          if (strcmp(curr, "object_direction")==0) { 
     607                                mDistributions.push_back(new ObjectDirectionBasedDistribution(mPreprocessor)); 
     608                          } else 
     609                                if (strcmp(curr, "reverse_object")==0) { 
     610                                  mDistributions.push_back(new ReverseObjectBasedDistribution(mPreprocessor)); 
     611                                } else 
     612                                  if (strcmp(curr, "reverse_viewspace_border")==0) { 
     613                                        mDistributions.push_back(new ReverseViewSpaceBorderBasedDistribution(mPreprocessor)); 
     614                                  }  
     615         
     616        if (e==NULL) 
     617          break; 
     618        curr = e+1; 
     619  } 
     620 
     621  Init(); 
     622  return true; 
     623} 
     624 
     625} 
     626 
     627 
  • GTP/trunk/Lib/Vis/Preprocessing/src/SamplingStrategy.h

    r1888 r1891  
    7373        int mRays; 
    7474        float mContribution; 
    75         float mTime; 
    76         float mRatio; 
    7775 
    7876  int mTotalRays; 
    7977  float mTotalContribution; 
     78 
     79  float mTime; 
     80        float mRatio; 
     81 
    8082protected: 
    8183 
     
    159161  SpatialBoxBasedDistribution(Preprocessor &preprocessor): 
    160162        SamplingStrategy(preprocessor){ 
    161         mType = DIRECTION_BOX_BASED_DISTRIBUTION; 
     163        mType = SPATIAL_BOX_BASED_DISTRIBUTION; 
    162164  } 
    163165   
     
    172174         ViewSpaceBorderBasedDistribution(Preprocessor &preprocessor): 
    173175           SamplingStrategy(preprocessor){ 
    174            mType = SPATIAL_BOX_BASED_DISTRIBUTION; 
     176           mType = VIEWSPACE_BORDER_BASED_DISTRIBUTION; 
    175177         } 
    176178          
     
    185187         ReverseViewSpaceBorderBasedDistribution(Preprocessor &preprocessor): 
    186188           SamplingStrategy(preprocessor){ 
    187            mType = SPATIAL_BOX_BASED_DISTRIBUTION; 
     189           mType = REVERSE_VIEWSPACE_BORDER_BASED_DISTRIBUTION; 
    188190         } 
    189191          
     
    199201 public: 
    200202  ViewCellBorderBasedDistribution(Preprocessor &preprocessor): 
    201         SamplingStrategy(preprocessor) {} 
     203        SamplingStrategy(preprocessor) { 
     204        mType = VIEWCELL_BORDER_BASED_DISTRIBUTION; 
     205 
     206  } 
    202207   
    203208  virtual bool GenerateSample(SimpleRay &ray); 
     
    261266  UpdateRatios(); 
    262267 
     268  // construct distribution mixyure from a string describing the required distributions 
     269  bool 
     270  Construct(char *str); 
     271 
    263272   
    264273}; 
  • GTP/trunk/Lib/Vis/Preprocessing/src/ViewCellsManager.cpp

    r1889 r1891  
    3030 
    3131#define KD_PVS_AREA (1e-5f) 
    32  
    33  
    3432 
    3533namespace GtpVisibilityPreprocessor { 
  • GTP/trunk/Lib/Vis/Preprocessing/src/default.env

    r1884 r1891  
    4848#       type sampling 
    4949#       type vss 
    50         type rss 
     50#       type rss 
     51        type combined 
    5152#       type render 
    5253        detectEmptyViewSpace true 
     
    8889} 
    8990 
     91 
    9092RssPreprocessor { 
    9193 
    9294#       distributions rss+spatial+object_direction 
    93         distributions object_direction+spatial 
     95        distributions rss+object_direction+spatial+object+direction 
    9496#       distributions object_direction 
    9597 
    96         samplesPerPass 1000 
     98        samplesPerPass 200000 
    9799        initialSamples 2000000 
    98100        vssSamples 50000000 
    99         vssSamplesPerPass 2000000 
     101        vssSamplesPerPass 500000 
    100102        useImportanceSampling true 
    101103 
     
    133135        maxCostRatio 1.0 
    134136        maxRayContribution 1.0 
    135         maxRays         1000000 
     137        maxRays         10000000 
    136138        maxTotalMemory  400 
    137139        maxStaticMemory 200 
  • GTP/trunk/Lib/Vis/Preprocessing/src/preprocessor.pro

    r1883 r1891  
    109109InternalRayCaster.cpp IntelRayCaster.cpp \ 
    110110RayCaster.cpp PreprocessorFactory.cpp GvsPreprocessor.cpp \ 
    111 Trackball.cpp ObjExporter.cpp SubdivisionCandidate.cpp QtGlViewer.cpp Mailable.cpp 
     111Trackball.cpp ObjExporter.cpp SubdivisionCandidate.cpp QtGlViewer.cpp \ 
     112Mailable.cpp \ 
     113CombinedPreprocessor.cpp 
    112114 
    113115 
Note: See TracChangeset for help on using the changeset viewer.