Changeset 2735


Ignore:
Timestamp:
06/04/08 01:49:14 (16 years ago)
Author:
mattausch
Message:

added new importance sampling method for gvs

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

Legend:

Unmodified
Added
Removed
  • GTP/trunk/Lib/Vis/Preprocessing/scripts/run_gvs_vps.sh

    r2734 r2735  
    2525 
    2626#LOG_PREFIX=../src/SG08/rebut-arena-pixel2 
    27 LOG_PREFIX=../src/SG08/speedtest 
    28 LOG_PREFIX=../src/SG08/importance_5.0_10 
     27LOG_PREFIX=../src/SG08/probablyvis2 
    2928 
    3029ENVIRONMENT=gvs.env 
     
    4342-gvs_samples_per_pass=1000000 \ 
    4443-gvs_initial_samples=16 \ 
    45 -gvs_max_viewcells=300000 
    46 -gvs_min_contribution=10\ 
     44-gvs_max_viewcells=3 \ 
     45-gvs_min_contribution=100 \ 
    4746-gvs_per_viewcell=true \ 
    4847-preprocessor_detect_empty_viewspace+ \ 
    4948-preprocessor_snap_error_frames+ \ 
    50 -kd_pvs_area=1e-4 \ 
     49-kd_pvs_area=1e-5 \ 
    5150-view_cells_use_kd_pvs+ \ 
    5251-af_use_kd_pvs+ \ 
  • GTP/trunk/Lib/Vis/Preprocessing/src/GvsPreprocessor.cpp

    r2732 r2735  
    7070mCurrentViewCell(NULL), 
    7171mCurrentViewPoint(Vector3(0.0f, 0.0f, 0.0f)), 
    72 mOnlyRandomSampling(false) 
    73 //mOnlyRandomSampling(true) 
     72mOnlyRandomSampling(false), 
     73//mOnlyRandomSampling(true), 
     74mUseProbablyVisibleSampling(false) 
    7475{ 
    7576        Environment::GetSingleton()->GetIntValue("GvsPreprocessor.totalSamples", mTotalSamples); 
     
    798799        generationTimer.Entry(); 
    799800 
    800         ViewCellBorderBasedDistribution vcStrat(*this, mCurrentViewCell); 
    801         GenerateRays(DETERMINISTIC_GVS ? numSamples : numSamples / 16, *mDistribution, simpleRays, sInvalidSamples); 
     801        if (mUseProbablyVisibleSampling && (RandomValue(0, 1) > 0.5)) 
     802        { 
     803                ProbablyVisibleDistribution distr(*this, mCurrentViewCell, &mProbablyVisibleTriangles); 
     804                GenerateRays(numSamples, distr, simpleRays, sInvalidSamples); 
     805        } 
     806        else 
     807        { 
     808                GenerateRays(DETERMINISTIC_GVS ? numSamples : numSamples / 16, *mDistribution, simpleRays, sInvalidSamples); 
     809        } 
    802810 
    803811        generationTimer.Exit(); 
     
    814822                const bool pruneInvalidRays = false; 
    815823                //const bool pruneInvalidRays = true; 
     824 
    816825                CastRays(simpleRays, vssRays, castDoubleRays, pruneInvalidRays); 
    817826        } 
     
    14321441        mGvsStats.mRandomSamples = 0; 
    14331442        mGvsStats.mGvsSamples = 0; 
    1434  
     1443        mUseProbablyVisibleSampling = false; 
    14351444        //renderer->mPvsStat.currentPass = 0; 
     1445 
    14361446        mPass = 0; 
    14371447 
     
    14711481                newRandomSamples = CastInitialSamples(mInitialSamples); 
    14721482                 
     1483                //if (!mUseProbablyVisibleSampling && !mOnlyRandomSampling) 
    14731484                if (!mOnlyRandomSampling) 
    14741485                        newGvsSamples = ProcessQueue(); 
     
    15001511                        ++ mPass; 
    15011512                        mGvsStats.mPassContribution = mGvsStats.mTotalContribution - oldContribution; 
     1513 
     1514                        if (mGvsStats.mPassContribution < 2000) 
     1515                                mUseProbablyVisibleSampling = true; 
     1516                         
     1517                        if (mUseProbablyVisibleSampling) 
     1518                                PrepareProbablyVisibleSampling(); 
    15021519 
    15031520 
     
    19431960 
    19441961 
    1945 } 
     1962void GvsPreprocessor::PrepareProbablyVisibleSampling() 
     1963{ 
     1964         
     1965        // warning: using mailing! 
     1966        Intersectable::NewMail(); 
     1967 
     1968        mProbablyVisibleTriangles.clear(); 
     1969        CollectProbablyVisibleTriangles(mProbablyVisibleTriangles); 
     1970} 
     1971 
     1972 
     1973void GvsPreprocessor::CollectProbablyVisibleTriangles(ObjectContainer &triangles) 
     1974{ 
     1975        ObjectPvsIterator pit = mCurrentViewCell->GetPvs().GetIterator(); 
     1976 
     1977        static ObjectContainer tmpTriangles; 
     1978 
     1979        while (pit.HasMoreEntries()) 
     1980        {        
     1981                tmpTriangles.clear(); 
     1982 
     1983                KdIntersectable *kdObj = static_cast<KdIntersectable *>(pit.Next()); 
     1984                mKdTree->CollectObjectsWithDublicates(kdObj->GetItem(), tmpTriangles); 
     1985 
     1986                ObjectContainer::const_iterator oit, oit_end = tmpTriangles.end(); 
     1987 
     1988                for (oit = tmpTriangles.begin(); oit != oit_end; ++ oit) 
     1989                { 
     1990                        TriangleIntersectable *triObj = static_cast<TriangleIntersectable *>(*oit); 
     1991 
     1992                        // find objects which are not yet accounted for yet contained in kd pvs objects 
     1993                        if (!triObj->Mailed() && (triObj->mCounter < ACCOUNTED_OBJECT)) 
     1994                        { 
     1995                                triObj->Mail(); 
     1996                                triangles.push_back(triObj); 
     1997                        } 
     1998                } 
     1999        } 
     2000} 
     2001 
     2002 
     2003} 
  • GTP/trunk/Lib/Vis/Preprocessing/src/GvsPreprocessor.h

    r2731 r2735  
    281281                                                                   SimpleRayContainer &simpleRays); 
    282282 
     283        /** Collects triangles which are probably visible. Warning: returns 
     284                only unmailed objects. 
     285        */ 
     286        void CollectProbablyVisibleTriangles(ObjectContainer &triangles); 
     287 
     288        void PrepareProbablyVisibleSampling(); 
     289 
     290 
    283291        ////////////////////// 
    284292 
     
    323331 
    324332        Vector3 mCurrentViewPoint; 
     333 
     334        /// container for probably visible triangles 
     335        ObjectContainer mProbablyVisibleTriangles; 
     336 
     337        bool mUseProbablyVisibleSampling; 
    325338}; 
    326339 
  • GTP/trunk/Lib/Vis/Preprocessing/src/SamplingStrategy.cpp

    r2728 r2735  
    1  
    21#include "SamplingStrategy.h" 
    32#include "Ray.h" 
     
    1817#define USE_HALTON 1 
    1918 
     19 
    2020namespace GtpVisibilityPreprocessor { 
    2121 
     
    2727#endif 
    2828   
    29 //HaltonSequence SamplingStrategy::sHalton; 
    30  
    3129HaltonSequence ObjectBasedDistribution::sHalton; 
    3230HaltonSequence MixtureDistribution::sHalton; 
     
    3937HaltonSequence ViewCellBasedDistribution::sHalton; 
    4038HaltonSequence ViewCellBorderBasedDistribution::sHalton; 
     39HaltonSequence ProbablyVisibleDistribution::sHalton; 
     40 
     41 
    4142 
    4243SamplingStrategy::SamplingStrategy(Preprocessor &preprocessor):  
     
    575576  { 
    576577#ifdef USE_PERFTIMER 
    577         const float vcTime = viewCellCastTimer.TotalTime(); 
    578         const float pvsTime = pvsTimer.TotalTime(); 
    579         const float haltonTime = haltonTimer.TotalTime(); 
     578        const double vcTime = viewCellCastTimer.TotalTime(); 
     579        const double pvsTime = pvsTimer.TotalTime(); 
     580        const double haltonTime = haltonTimer.TotalTime(); 
    580581         
    581582        cout << "view cell cast time: " << vcTime << " s" << endl; 
     
    881882 
    882883 
    883 } 
    884  
    885  
     884bool ProbablyVisibleDistribution::GenerateSample(SimpleRay &ray) 
     885{        
     886        static Vector3 origin; 
     887        static Vector3 direction;  
     888        static Vector3 point; 
     889        static Vector3 normal; 
     890         
     891        float r[2]; 
     892        sHalton.GetNext(2, r); 
     893  
     894        r[0] *= (float)(*mObjects).size() - 1.0f; 
     895        const int i = (int)r[0]; 
     896  
     897        Intersectable *obj = (*mObjects)[i]; 
     898         
     899        obj->GetRandomSurfacePoint(point, normal); 
     900 
     901        // get point on view cell surface 
     902        if (1) 
     903                origin = mViewCell->GetBox().GetRandomSurfacePoint(); 
     904        else 
     905                origin = mViewCell->GetBox().GetUniformRandomSurfacePoint(); 
     906 
     907        direction = point - origin; 
     908   
     909        const float c = Magnitude(direction); 
     910   
     911        if (c <= Limits::Small)  
     912                return false; 
     913 
     914        ray = SimpleRay(origin, direction, PROBABLY_VISIBLE_DISTRIBUTION, 1.0f); 
     915 
     916        return true; 
     917} 
     918 
     919} 
     920 
     921 
  • GTP/trunk/Lib/Vis/Preprocessing/src/SamplingStrategy.h

    r2728 r2735  
    77#include "common.h" 
    88#include "Halton.h" 
     9#include "Containers.h" 
    910 
    1011 
     
    5253                FILTER_BASED_DISTRIBUTION, 
    5354                DIFFERENCE_SAMPLING_BASED_DISTRIBUTION, 
     55                PROBABLY_VISIBLE_DISTRIBUTION 
    5456        }; 
    5557 
     
    246248}; 
    247249 
     250 
     251class MixtureDistribution: public SamplingStrategy  
     252{ 
     253public: 
     254    
     255  // container for the distributions 
     256        std::vector<SamplingStrategy *> mDistributions; 
     257   
     258  MixtureDistribution(Preprocessor &preprocessor): 
     259        SamplingStrategy(preprocessor) 
     260  { 
     261  } 
     262 
     263  // has to called before first usage 
     264  void Init(); 
     265 
     266  // equalize distribution contributions 
     267  void 
     268  Reset(); 
     269   
     270  // add contributions of the sample to the strategies 
     271  void ComputeContributions(VssRayContainer &vssRays); 
     272 
     273  // update distributions with new rays 
     274  // warning: some rays can get deleted (if maintained internally by the 
     275  // particular distribution)! 
     276  void UpdateDistributions(VssRayContainer &vssRays); 
     277 
     278  void 
     279  UpdateRatios(); 
     280 
     281  // construct distribution mixture from a string describing the required distributions 
     282  bool 
     283  Construct(char *str); 
     284 
     285  virtual bool RequiresRays() { 
     286        for (int i=0; i < (int)mDistributions.size(); i++) 
     287          if (mDistributions[i]->RequiresRays()) 
     288                return true; 
     289        return false; 
     290  } 
     291   
     292  virtual int GenerateSamples(int number, SimpleRayContainer &rays, int &invalidSamples); 
     293   
     294private: 
     295 
     296        // Generate a new sample according to a mixture distribution 
     297        virtual bool GenerateSample(SimpleRay &ray); 
     298 
     299        // halton sequence generator for deciding between distributions 
     300        static HaltonSequence sHalton; 
     301}; 
     302 
     303 
    248304class ViewCellBasedDistribution: public SamplingStrategy 
    249305{ 
     
    268324 
    269325 
    270 class MixtureDistribution: public SamplingStrategy  
    271 { 
    272 public: 
    273     
    274   // container for the distributions 
    275         std::vector<SamplingStrategy *> mDistributions; 
    276    
    277   MixtureDistribution(Preprocessor &preprocessor): 
    278         SamplingStrategy(preprocessor) 
    279   { 
    280   } 
    281  
    282   // has to called before first usage 
    283   void Init(); 
    284  
    285   // equalize distribution contributions 
    286   void 
    287   Reset(); 
    288    
    289   // add contributions of the sample to the strategies 
    290   void ComputeContributions(VssRayContainer &vssRays); 
    291  
    292   // update distributions with new rays 
    293   // warning: some rays can get deleted (if maintained internally by the 
    294   // particular distribution)! 
    295   void UpdateDistributions(VssRayContainer &vssRays); 
    296  
    297   void 
    298   UpdateRatios(); 
    299  
    300   // construct distribution mixture from a string describing the required distributions 
    301   bool 
    302   Construct(char *str); 
    303  
    304   virtual bool RequiresRays() { 
    305         for (int i=0; i < (int)mDistributions.size(); i++) 
    306           if (mDistributions[i]->RequiresRays()) 
    307                 return true; 
    308         return false; 
    309   } 
    310    
    311   virtual int GenerateSamples(int number, SimpleRayContainer &rays, int &invalidSamples); 
    312    
    313 private: 
    314  
    315         // Generate a new sample according to a mixture distribution 
    316         virtual bool GenerateSample(SimpleRay &ray); 
    317  
    318         // halton sequence generator for deciding between distributions 
    319         static HaltonSequence sHalton; 
    320 }; 
    321  
    322326class ViewCellBorderBasedDistribution: public SamplingStrategy 
    323327{ 
     
    343347 
    344348 
     349class ProbablyVisibleDistribution: public SamplingStrategy 
     350{ 
     351public: 
     352        ProbablyVisibleDistribution(Preprocessor &preprocessor,  
     353                                        ViewCell *viewCell,  
     354                                                                ObjectContainer *objects) 
     355        : SamplingStrategy(preprocessor), mViewCell(viewCell), mObjects(objects) 
     356        { 
     357                mType = PROBABLY_VISIBLE_DISTRIBUTION; 
     358        } 
     359 
     360        void SetViewCell(ViewCell *vc) { mViewCell = vc; } 
     361 
     362private: 
     363 
     364        virtual bool GenerateSample(SimpleRay &ray); 
     365 
     366        ViewCell *mViewCell; 
     367        ObjectContainer *mObjects; 
     368 
     369        static HaltonSequence sHalton; 
     370}; 
     371 
     372 
    345373}; 
    346374 
  • GTP/trunk/Lib/Vis/Preprocessing/src/TestPreprocessor05.vcproj

    r2729 r2735  
    159159                                LinkIncremental="1" 
    160160                                AdditionalLibraryDirectories="&quot;$(QTDIR)\lib&quot;;..\src\GL;&quot;..\lib05\$(ConfigurationName)&quot;;..\..\..\..\..\..\NonGTP\Boost\lib;..\..\..\..\..\..\NonGTP\Zlib\lib;..\..\..\..\..\..\NonGTP\Devil\lib;&quot;..\MultiLevelRayTracing\RTScene\$(ConfigurationName)&quot;;&quot;..\MultiLevelRayTracing\RTWorld\$(ConfigurationName)&quot;;&quot;QtInterface\$(ConfigurationName)&quot;;&quot;..\..\..\..\..\..\NonGTP\Xerces\xerces-c_2_8_0\lib&quot;;&quot;$(CG_LIB_PATH)&quot;" 
    161                                 GenerateDebugInformation="false" 
     161                                GenerateDebugInformation="true" 
    162162                                SubSystem="1" 
    163163                                LargeAddressAware="2" 
Note: See TracChangeset for help on using the changeset viewer.