POV » photons

Versione 12 del 29.9.08, 21:11
 


Chatbox:
And all is quiet....

image:11
Senza l'uso di photons
image:12
Con l'uso di photons

Alcuni effetti quali le caustiche dovute a riflessioni e rifrazioni non si riescono a generare tramite un backward ray tracing , per farne il rendering e' necessario utilizzare la tecnica del photon mapping .
Questa tecnica , inventata da Henrik Wann Jensen (il PDF di un suo articolo sull'argomento), utilizza un preprocesso di forward ray tracing per ottenerle.
In breve, dei raggi di luce in quantita' discreta (fotoni) vengono tracciati dalle sorgenti luminose verso gli oggetti della scena, questi raggi passano attraverso o rimbalazno su alcuni degli oggetti e le intersezioni tra i raggi e gli oggetti vengono salvate in una mappa. Queste informazioni verranno in seguito utilizzate per stimare qual e' il contributo delle caustiche di riflessione e rifrazione sull'illuminazione di vari oggetti interessati.

In una scena possiamo suddividere gli oggetti in alcune categorie:

star gli oggetti che mostrano le caustiche generate dai fotoni
star gli oggetti che generano le caustiche a causa di riflessione e/o rifrazione

Alcuni oggetti apparterranno alla prima, altri alla seconda, alcuni potrebbero appartenere anche ad entrambe e ci saranno oggetti che non appartengono a nessuna delle due.

In POV Ray tutti gli oggetti per default appartengono alla prima categoria, ma e' possibile escludere un oggetto specificando photons{collect off} nella definizione dell'oggetto. Escludere oggetti dal processo di rendering delle caustiche quando non necessario permette di velocizzare l'elaborazione e diminuire la quantita' di memoria usata.

Per includere gli oggetti che generano caustiche nella seconda categoria e' necessario specificarlo nella loro definizione facendoli diventare dei target.

Oltre ad impostarli come target e' necessario definire se l'interazione con i fotoni avviene per riflessione o rifrazione oppure entrambe. Per un oggetto con riflessione e rifrazione nella definizione dell'oggetto deve essere inserito il codice:

photons{
  target
  reflection on
  refraction on
}

Di solito un oggetto che genera caustiche non e' necessario che appartenga anche alla prima categoria, quindi e' possibile impostare anche collect off.

In certi casi puo' essere necessario abilitare riflessione e rifrazione di fotoni anche su oggetti che non sono dei target, questo per permettere ai fotoni indiretti di continuare il loro cammino dopo aver colpito questi
oggetti.

Dopo aver specificato i photons per gli oggetti e' necessario abilitare il photon mapping nella sezione global_settings della scena:

photons {
  spacing <photon_spacing> | count <photons_to_shoot>
  [gather <min_gather>, <max_gather>]
  [media <max_steps> [,<factor>]]
  [jitter <jitter_amount>]
  [max_trace_level <photon_trace_level>]
  [adc_bailout <photon_adc_bailout>]
  [save_file "filename" | load_file "filename"]
  [autostop <autostop_fraction>]
  [expand_thresholds <percent_increase>, <expand_min>]
  [radius <gather_radius>,<multiplier>,
          <gather_radius_media>,<multiplier>]
}

Per esempio:

global_settings {
  photons {
      spacing 0.02               
    }
}

Ove, tramite spacing, viene definita la distanza media dei fotoni sulle superfici. Un'altra possibilita' e' di usare count per specificare il numero di fotoni da usare.

Per una spiegazione dettagliata vedere l'help di POV Ray

L'immagine qui sopra e' stata realizzata con il seguente codice:

#declare Photons=on;
#ifndef(Photons)
        #declare Photons=off;
#end
global_settings {
  assumed_gamma 1.0
  max_trace_level 5
  #if (Photons)          // global photon block
    photons {
      spacing 0.02
    }
  #end
}
// ----------------------------------------
camera {
  right x*image_width/image_height
  location  <0,2.5,-4.75>
  look_at   <0,0.65,0>
}
box{<-10,0,-10>,<10,15,10>
  texture {
    pigment { color rgb <1.0, 0.8, 0.6> }
  }
}
light_source{
        <9,14,9>
        color rgb 1.3
        spotlight
        point_at <0,0,0>
        radius 15
        falloff 30        
}
#declare p1=pigment {rgbt 1};
#declare p2=pigment {color rgbt <1,0.4,0.1,1>};
#declare in=interior {
    ior 1.5
    fade_power 1001
    fade_distance 0.9
    fade_color <0.5,0.8,0.6>
  }
#declare fi=finish {
      ambient 0.0
      diffuse 0.05
      specular 0.6
      roughness 0.005
      reflection {
        0.1, 1.0
        fresnel on
      }
      conserve_energy
    }
#declare M_G1=material {
  texture {
    pigment {p1}
    finish {fi}
  }         
  interior{in}
}             
#declare M_G2=material {
  texture {
    pigment {p2}
    finish {fi}
  }         
  interior{in}
}             
#declare M_V=    // Glass material
material {
  texture {
    pigment {rgbt <1,0.6,0.3,0.5>}
    finish {
      ambient 0.0
      //diffuse 0.075
      specular 0.25
      roughness 0.005
      reflection {
        0.1, 0.6
        fresnel on
      }
      conserve_energy
    }
  }
  interior {
    ior 1.34
    fade_power 1001
    fade_distance 0.9
    fade_color <0.9,0.4,0.6>
  }
}
#declare M_V1=    // Glass material
material {
  texture {
    pigment {rgbt <1,0.9,0.8,0.75>}
    finish {
      ambient 0.0
      //diffuse 0.075
      specular 0.05
      
     
      roughness 0.05
      reflection {
        0.1, 0.35
        
        fresnel on
      }
      conserve_energy
    }
  }
  interior {
    ior 1.1
    fade_power 2
    fade_distance 1.5
    fade_color <0.9,0.8,0.6>
    dispersion 1.01
    dispersion_samples 3
  }
}
union{
        union{
                cylinder{0,<0,0.05,0>,0.75}
                cylinder{<0,0.05,0>,<0,1,0>,0.06}
                difference{
                        cone{<0,1,0>,0.1,
                        <0,2,0>,1
                        }
                        cone{<0,1.01,0>,0.01,
                        <0,2.01,0>,0.99
                        }
                }                
                material { M_G1 }
        }                    
        difference{
        cone{<0,1,0>,0.01,
             <0,2,0>,0.99
        }
        box{<-2,1.9,-2>,<2,3,2>}
             material { M_V }
        }                   
  photons { 
    target 1.0
    refraction on
    reflection on
  }
  translate<-1.2,0,0>
}
                   
union{             
        difference{
                cylinder{<0,0,0>,  <0,2,0>,0.7}
                cylinder{<0,0.2,0>,<0,3,0>,0.69}
                material { M_G1 }
        }       
        cylinder{<0,0.2,0>,<0,1.7,0>,0.69
                material { M_V1 }
        }       
  photons {  // photon block for an object
    target 1.0
    refraction on
    reflection on
  }                
  translate<1.2,0,0>
        
}
#local i=0;
#while(i<5)
        sphere{0,0.25
               translate<-1.5+i*0.6,0.25,-2>               
               material{M_G2}                
                  photons {  // photon block for an object
                    target 1.0
                    refraction on
                    reflection on
                  }               
        }               
        #local i=i+1;
#end

Commentare la linea con #declare Photons=on; per fare il rendering senza il photon mapping.

Tags:
POV   povray