4.3. Izrada mreže volumena sjene

 

            Da bi smo lakše shvatili kako se izrađuje volumen sjene, objašnjavanje ćemo izvršavati na jednom ilustrativnom primjeru. Recimo npr. da se naša mreža koja baca sjenu sastoji od 1000 trokuta i 1000 vrhova na koje djeluje 5 matrica (deformacijska mreža). Mreža volumena sjene sadržavati će sedam puta više trokuta i 2000 vrhova na koje djeluje dva puta više matrica. Prvih 1000 vrhova biti će jednaki originalnima, dok će ostalih 1000 biti njihova projicirana slika u smjeru sjene. Projekcija tih točaka će se vršiti s 5 novouvedenih matrica koje su jednake originalnim pomnoženim s projekcijskom matricom svijetla. Da bi smo takvu projekciju vrhova postigli indekse matrica koje posjeduje gornja polovica vrhova moramo uvećati za broj matrica (5). Tako npr. ako je neki vrh originalno deformiran 0., 1. i 3. matricom, moramo te indekse zamijeniti vrijednostima 5, 6 i 8. tako da postignemo projekciju.

 

Zašto sedam puta više trokuta?

 

            Kako ne vršimo proračuna volumena sjene za svaku novu sliku, svaki trokut mora biti zadužen za stvaranje svoje sjene. Dakle, kako svaki trokut baca svoju sjenu, svaki trokut mora imati i svoj vlastiti volumen sjene. Za svaki rub takvog trokuta (ima ih 3) sva nova trokuta su volumena sjene su stvorena tako da se na svaki trokut koji baca sjenu troši 6 trokuta volumena sjene. Dodatni sedmi trokut je dodan da se ispravi problem s vlastitim osjenjivanjem (područje A) i jednak je kao originalni. U slijedećem isječku običnog C koda objasniti ćemo kako se konstruira mreža volumena sjene uz pretpostavku da su vrhovi već stvoreni.

 

// POMOC //

// Broj trokuta originalne mreže

int triangleNumber;

// Broj vrhova originalne mreže

int  dotNumber;

// Polje indeksa vrhova za svaki trokut originalne mreže

short *indices;

// Polje indeksa vrhova za svaki trokut mreže volumena sjene

short *SMIndices;

// KOD //

SMIndices=(short*)malloc(7*triangleNumber*3*sizeof(short));

int i=0;

// Za svaki trokut, sedam trokuta je stvroreno

for(int r=0; r<indiceNumber; r++)

{

  // 1. rub trokuta = 2 nova trokuta volumena sjene

  SMIndices[i++]=indices[r*3+1];

  SMIndices[i++]=indices[r*3+0];

  SMIndices[i++]=indices[r*3+0]+dotNumber;

  SMIndices[i++]=indices[r*3+0]+dotNumber;

  SMIndices[i++]=indices[r*3+1]+dotNumber;

  SMIndices[i++]=indices[r*3+1];

  // 2. rub trokuta = 2 nova trokuta volumena sjene

  SMIndices[i++]=indices[r*3+2];

  SMIndices[i++]=indices[r*3+1];

  SMIndices[i++]=indices[r*3+1]+dotNumber;

  SMIndices[i++]=indices[r*3+1]+dotNumber;

  SMIndices[i++]=indices[r*3+2]+dotNumber;

  SMIndices[i++]=indices[r*3+2];

  // 3. rub trokuta = 2 nova trokuta volumena sjene

  SMIndices[i++]=indices[r*3+0];

  SMIndices[i++]=indices[r*3+2];

  SMIndices[i++]=indices[r*3+2]+dotNumber;

  SMIndices[i++]=indices[r*3+2]+dotNumber;

  SMIndices[i++]=indices[r*3+0]+dotNumber;

  SMIndices[i++]=indices[r*3+0];

  // 1 novi trokut volumena sjene – sedmi trokut

  SMIndices[i++]=indices[r*3+0];

  SMIndices[i++]=indices[r*3+1];

  SMIndices[i++]=indices[r*3+2];

}