Τι είναι το ray tracing και το χρειαζόμαστε στα παιχνίδια; Δεδομένα Rand() και παγκόσμιας παραγωγής. Εξειδικευμένος επιταχυντής για ανίχνευση ακτίνων

Πρόσφατα, στο Διαδίκτυο, βρήκα τον ιχνηλάτη ακτίνων στην επαγγελματική κάρτα του Paul Huckbert. Για όσους δεν γνωρίζουν, αυτό είναι ένα πολύ διάσημο πρόβλημα, που προτάθηκε αρχικά από τον Paul Huckbert στις 4 Μαΐου 1984 στο comp.graphics. Η ουσία του είναι να γράψει μια επίδειξη της μεθόδου ρίψης ακτίνων, που θα... ταίριαζε επαγγελματική κάρτα(διαβάστε περισσότερα για αυτό στην ενότητα Ray Tracing του Graphics Gems IV)!

Η έκδοση του Andrew Kensler είναι μια από τις πιο εντυπωσιακές και όμορφες υλοποιήσεις αυτού του προβλήματος που έχω δει. Από περιέργεια, αποφάσισα να το ψάξω. Σε αυτό το άρθρο θα γράψω όλα όσα μπορούσα να καταλάβω ο ίδιος.

Η πίσω όψη της επαγγελματικής κάρτας

Αυτός είναι ο ίδιος ο κώδικας:

#περιλαμβάνω // κάρτα > aek.ppm #include #περιλαμβάνω typedef int i;typedef float f;struct v( f x,y,z;v operator+(v r)(return v(x+r.x ,y+r.y,z+r.z);)v operator*(f r)(return v( x*r,y*r,z*r);)f τελεστής%(v r)(return x*r.x+y*r.y+z*r.z;)v()()v τελεστής^(v r) (return v(y*r.z-z*r.y,z*r.x-x*r.z,x*r. y-y*r.x);)v(f a,f b,f c)(x=a;y=b;z=c ;)v τελεστής!()(return*this*(1/sqrt(*this%* this));));i G=(247570,280596,280600, 249748,18578,18577,231184,16,16) ;f R()( return(f)rand()/RAND_MAX;)i T(v o,v d,f &t,v&n)(t=1e9;i m=0;f p=-o.z/d.z;if(.01 0)(f s=-b-sqrt(q);if(s .01)t=s,n=!(p+d*t),m=2;))επιστροφή m;)v S(v o,v d)(f t ;v n;i m=T(o,d,t, n);if(!m)return v(.7, .6,1)*pow(1-d.z,4);v h=o+d*t,l=!(v(9+R(),9 +R(),16)+h*-1),r=d+n*(n%d*-2);f b=l% n;if(b<0||T(h,l,t,n))b=0;f p=pow(l%r*(b >0),99);if(m&1)(h=h*.2;return((i)(ceil(h.x)+ceil(h.y))&1?v(3,1,1):v(3,3 ,3))*(b *.2+.1);)return v(p,p,p)+S(h,r)*.5;)i main()(printf("P6 512 512 255 " );v g=!v (-6,-16,0),a=!(v(0,0,1)^g)*.002,b=!(g^a)*.002,c=( a+b)*-256+g;for(i y=512;y--;) for(i x=512;x--;)(v p(13,13,13);for(i r =64;r- -;)(v t=a*(R()-.5)*99+b*(R()-.5)* 99;p=S(v(17,16,8)+t,!(t *-1+(a*(R()+x)+b *(y+R())+c)*16))*3,5+p;)printf("%c%c%c" ,(i )p.x,(i)p.y,(i)p.z);))

Ο παραπάνω κώδικας φαίνεται… τρομακτικός, αλλά μεταγλωττίζεται και εκτελείται χωρίς προβλήματα! Μπορείτε να το αποθηκεύσετε στην επιφάνεια εργασίας σας ως card.cpp, να ανοίξετε μια κονσόλα και να πληκτρολογήσετε:

C++ -O3 -o card card.cpp ./card > card.ppm

Μετά από 27 δευτερόλεπτα, η ακόλουθη εικόνα θα εμφανιστεί στην οθόνη:

Χαρακτηριστικά επαγγελματικής κάρτας Ray Tracer

Οι δυνατότητες είναι απλά εκπληκτικές!

  • ένας κόσμος που αποτελείται από αυστηρά οργανωμένες σφαίρες.
  • ανάγλυφο πάτωμα?
  • ουρανός με κλίση?
  • μαλακές σκιές?
  • OMG, βάθος πεδίου! Αστειεύεσαι?!

Και όλα αυτά στη μία πλευρά της επαγγελματικής κάρτας! Ας δούμε πώς λειτουργεί.

Διανυσματική τάξη

Ας δούμε το πρώτο μέρος του κώδικα:

#περιλαμβάνω // κάρτα > aek.ppm #include #περιλαμβάνω typedef int i;typedef float f;struct v( f x,y,z;v operator+(v r)(return v(x+r.x ,y+r.y,z+r.z);)v operator*(f r)(return v( x*r,y*r,z*r);)f τελεστής%(v r)(return x*r.x+y*r.y+z*r.z;)v()()v τελεστής^(v r) (return v(y*r.z-z*r.y,z*r.x-x*r.z,x*r. y-y*r.x);)v(f a,f b,f c)(x=a;y=b;z=c ;) v operator!())(return*this*(1/sqrt(*this%* this));));

Το κύριο κόλπο εδώ είναι η μείωση λέξεις-κλειδιά int και float τύπους σε i και f χρησιμοποιώντας typedef . Ένα άλλο κόλπο που μπορεί να χρησιμοποιηθεί για να μειώσει την ποσότητα του κώδικα είναι η κλάση v, η οποία χρησιμοποιείται όχι μόνο ως διάνυσμα, αλλά και για την επεξεργασία pixel.

#περιλαμβάνω // κάρτα > aek.ppm #include #περιλαμβάνω typedef int i; // Εξοικονόμηση χώρου μειώνοντας το int σε i typedef float f; // Εξοικονομήστε ακόμη περισσότερο χώρο με f αντί για float // Κλάση διανύσματος με δομή κατασκευής και τελεστών v( f x,y,z; // Τρεις διανυσματικές συντεταγμένες v operator+(v r)(return v(x+r.x,y+r.y, z +r.z);) // Άθροισμα διανυσμάτων v τελεστής*(f r)(return v(x*r,y*r,z*r);) // Κλιμάκωση διανυσμάτων f operator%(v r)(return x* r.x +y*r.y+z*r.z;) // Το γινόμενο κουκίδων των διανυσμάτων v()() // Κενός κατασκευαστής v τελεστής^(v r)(return v(y*r.z-z*r.y,z*r.x- x* r.z,x*r.y-y*r.x);) // Διασταυρούμενο γινόμενο διανυσμάτων v(f a,f b,f c)(x=a;y=b;z=c;) // Κατασκευαστής v τελεστής!() )(return * this*(1 /sqrt(*this%*this));) // Ομαλοποίηση διανύσματος );

Δεδομένα Rand() και παγκόσμιας παραγωγής

i G=(247570,280596,280600, 249748,18578,18577,231184,16,16);f R())( return(f)rand()/RAND_MAX;)

Ο ακόλουθος κώδικας εξοικονομεί επίσης πολύ χώρο δηλώνοντας μια συνάρτηση R που επιστρέφει μια τυχαία τιμή float μεταξύ 0 και 1. Αυτό είναι χρήσιμο για στοχαστική δειγματοληψία, χρησιμοποιείται για εφέ θολώματος και απαλές σκιές.

Ο πίνακας G περιέχει τη θέση των σφαιρών στον κόσμο που κωδικοποιούνται από ακέραιους αριθμούς. Το σύνολο όλων των αριθμών είναι ένα διάνυσμα bit 9 σειρών και 19 στηλών.

Εδώ είναι ο παραπάνω κώδικας, αλλά μορφοποιημένος και σχολιασμένος:

// Ένα σύνολο θέσεων σφαίρας που περιγράφει τον κόσμο // Όλοι αυτοί οι αριθμοί είναι ουσιαστικά ένα διάνυσμα bit i G=(247570,280596,280600,249748,18578,18577,231184,16,16); // Γεννήτρια τυχαίων αριθμών που επιστρέφει αριθμό κινητής υποδιαστολής στην περιοχή 0-1 f R())(return(f)rand()/RAND_MAX;)

Κύρια μέθοδος

i main())(printf("P6 512 512 255 ");v g=!v (-6,-16,0),a=!(v(0,0,1)^g)*.002,b = !(g^a)*.002,c=(a+b)*-256+g;for(i y=512;y--;) for(i x=512;x--;)(v p(13 , 13,13);for(i r =64;r--;)(v t=a*(R()-.5)*99+b*(R()-.5)* 99;p=S( v (17,16,8)+t,!(t*-1+(a*(R()+x)+b *(y+R())+c)*16))*3,5+p; ) printf("%c%c%c" ,(i)p.x,(i)p.y,(i)p.z);))

Κύρια μέθοδοςχρησιμοποιεί την απλή, γνωστή μορφή εικόνας PPM που βασίζεται σε κείμενο. Η εικόνα αποτελείται από μια κεφαλίδα της μορφής P6 [Width] [Hight] [Maximum Value] ακολουθούμενη από την τιμή RGB κάθε pixel.

Για κάθε εικονοστοιχείο της εικόνας, το πρόγραμμα λαμβάνει δείγματα (S) του χρώματος 64 ακτίνων, συγκεντρώνει το αποτέλεσμα και το βγάζει στο stdout.

Αυτός ο κώδικας αλλάζει επίσης ελαφρώς κάθε συντεταγμένη αρχής ακτίνας και την κατεύθυνσή της. Αυτό γίνεται για να δημιουργηθεί η επίδραση του βάθους πεδίου.

Εδώ είναι ο παραπάνω κώδικας, αλλά μορφοποιημένος και σχολιασμένος:

// Κύρια λειτουργία. Εμφανίζει μια εικόνα. // Η χρήση του προγράμματος είναι απλή: ./card > erk.ppm i main())( printf("P6 512 512 255"); // PPM header // Ο τελεστής "!" κανονικοποιεί το διάνυσμα v g=!v( -6,- 16,0), // Κατεύθυνση κάμερας a=!(v(0,0,1)^g)*.002, // Διάνυσμα υπεύθυνο για το ύψος της κάμερας... b=!(g^a )*.002 , // Δεξί διάνυσμα που λήφθηκε χρησιμοποιώντας το διασταυρούμενο γινόμενο c=(a+b)*-256+g; // WTF; Εδώ https:// news.ycombinator.com/item?id=6425965 γράφεται για αυτό με περισσότερες λεπτομέρειες. for(i y=512;y--;) // Για κάθε στήλη for(i x=512;x--;)( // Για κάθε pixel στη σειρά // Χρησιμοποιήστε μια κλάση διανύσματος για αποθήκευση το χρώμα σε RGB v p(13, 13,13); // Το τυπικό χρώμα pixel είναι σχεδόν μαύρο // Πετάξτε 64 ακτίνες από κάθε pixel για(i r=64;r--;)( // Αλλάξτε ελαφρά αριστερά/δεξιά και πάνω /κάτω οι συντεταγμένες της αρχής της ακτίνας (για εφέ βάθους πεδίου) v t=a*(R()-.5)*99+b*(R()-.5)*99; // Εκχωρήστε το εστιακό τοποθετήστε την κάμερα στο v(17,16,8) και ρίξτε τη δέσμη / / Συσσωρεύστε το χρώμα που επιστράφηκε στη μεταβλητή t p=S(v(17,16,8)+t, // Αρχή της ακτίνας!(t *-1+(a*(R()+x)+b*(y+R ())+c)*16) // Κατεύθυνση δέσμης με ελαφρά παραμόρφωση // για την επίδραση της στοχαστικής δειγματοληψίας)*3,5+p ; // +p για συσσώρευση χρώματος ) printf("%c%c%c",(i)p.x,(i)p.y,(i)p.z); ) )

Κέντημα

v S(v o,v d)(f t ;v n;i m=T(o,d,t,n);if(!m)return v(.7, .6,1)*pow(1-d.z,4) ;v h=o+d*t,l=!(v(9+R(),9+R(),16)+h*-1),r=d+n*(n%d*-2) ;f b=l% n;αν(β<0||T(h,l,t,n))b=0;f p=pow(l%r*(b >0),99);if(m&1)(h=h*.2;return((i)(ceil(h.x)+ceil(h.y))&1?v(3,1,1):v(3,3 ,3))*(b *.2+.1);)return v(p,p,p)+S(h,r)*.5;)

Το Sampler S είναι μια συνάρτηση που επιστρέφει το χρώμα ενός pixel με βάση τις δεδομένες συντεταγμένες του σημείου έναρξης της ακτίνας o και την κατεύθυνσή του d. Εάν χτυπήσει τη σφαίρα, τότε αυτοκαλείται αναδρομικά και διαφορετικά (αν η δέσμη δεν έχει εμπόδια στο πέρασμά της) ανάλογα με την κατεύθυνση, επιστρέφει είτε το χρώμα του ουρανού είτε το χρώμα του δαπέδου (με βάση την καρό υφή της ).

Σημειώστε την κλήση στη συνάρτηση R κατά τον υπολογισμό της κατεύθυνσης του φωτός. Αυτό δημιουργεί το αποτέλεσμα των «μαλακών σκιών».

Εδώ είναι ο παραπάνω κώδικας, αλλά μορφοποιημένος και σχολιασμένος:

// (S)δειγματοληψία του κόσμου και επιστρέψτε το χρώμα των εικονοστοιχείων με // ακτίνα που ξεκινά από το σημείο o (Προέλευση) και έχει κατεύθυνση d (Κατεύθυνση) v S(v o,v d)( f t; v n; // Ελέγξτε αν η ακτίνα συγκρούεται με κάτι i m=T(o,d,t,n); if(!m) // m==0 // Η σφαίρα δεν βρέθηκε και η ακτίνα ανεβαίνει: δημιουργήστε το χρώμα του ουρανού επιστροφή v(.7 ,. 6,1)*pow(1-d.z,4); // Ίσως η ακτίνα αγγίζει τη σφαίρα v h=o+d*t, // h είναι η συντεταγμένη τομής l=!(v(9+R() ,9+R (),16)+h*-1), // "l" = κατεύθυνση φωτός (με ελαφρά παραμόρφωση για εφέ απαλής σκιάς) r=d+n*(n%d*-2); // r = μισό διάνυσμα / / Υπολογίστε τον συντελεστή Lambert f b=l%n; // Υπολογίστε τον συντελεστή φωτισμού (συντελεστής Lambert > 0 ή είμαστε στη σκιά); if(b<0||T(h,l,t,n)) b=0; // Рассчитываем цвет p (с учетом диффузии и отражения света) f p=pow(l%r*(b>0),99); if(m&1)( // m == 1 h=h*.2; // Η σφαίρα δεν αγγίχθηκε και η δέσμη κατεβαίνει στο πάτωμα: δημιουργήστε την επιστροφή χρώματος δαπέδου((i)(οροφή(h.x)+ ceil(h.y ))&1?v(3,1,1):v(3,3,3))*(b*.2+.1); ) // m == 2 Η σφαίρα χτυπήθηκε: δημιουργήστε ένα ακτίνα που αναπηδά από την επιφανειακή σφαίρα επιστροφή v(p,p,p)+S(h,r)*.5; // Εξασθένηση του χρώματος κατά 50% καθώς αναπηδά από την επιφάνεια (*.5) )

Ιχνηλάτης

i T(v o,v d,f &t,v&n)(t=1e9;i m=0;f p=-o.z/d.z;if(.01 0)(f s=-b-sqrt(q);if(s .01)t=s,n=!(p+d*t),m=2;))επιστροφή m;)

Η συνάρτηση T (Tracer) είναι υπεύθυνη για τη ρίψη μιας δέσμης από ένα δεδομένο σημείο (o) σε μια δεδομένη κατεύθυνση (d). Επιστρέφει έναν ακέραιο που είναι ο κωδικός για το αποτέλεσμα της ρίψης της ακτίνας. 0 - η δοκός πήγε στον ουρανό, 1 - η δοκός πήγε στο πάτωμα, 2 - η δέσμη χτύπησε τη σφαίρα. Εάν η σφαίρα χτυπήθηκε, η συνάρτηση ενημερώνει τις μεταβλητές t (η παράμετρος που χρησιμοποιείται για τον υπολογισμό της απόστασης διέλευσης) και n (το μισό διάνυσμα όταν αναπηδά από τη σφαίρα).

Εδώ είναι ο παραπάνω κώδικας, αλλά μορφοποιημένος και σχολιασμένος:

// Δοκιμή τομής γραμμής // Επιστροφή 2 εάν χτυπήθηκε η σφαίρα (καθώς και η απόσταση τομής t και ημιδιάνυσμα n). // Επιστροφή 0 αν η ακτίνα δεν χτυπήσει τίποτα και ανέβει στον ουρανό // Επιστροφή 1 αν η ακτίνα δεν χτυπήσει τίποτα και κατέβει στο πάτωμα i T(v o,v d,f& t,v& n)( t=1e9; i m=0; f p=-o.z/d.z; εάν(.01 0)( // Ναι. Υπολογίστε την απόσταση από την κάμερα στη σφαίρα f s=-b-sqrt(q); if(s .01) // Αυτή είναι η ελάχιστη απόσταση, αποθηκεύστε την. Και επίσης // υπολογίστε το διάνυσμα της αναπηδούσας ακτίνας και γράψτε το σε "n" t=s, n=!(p+d*t), m=2; ) ) επιστροφή m; )

Αριθμός Leet

Πολλοί προγραμματιστές προσπάθησαν να συντομεύσουν τον κώδικα ακόμη περισσότερο. Ο ίδιος ο συγγραφέας συμφώνησε με την έκδοση που παρέχεται σε αυτό το άρθρο. Ξέρεις γιατί?

Fabien$ wc card.cpp 35 95 1337 card.cpp - πολλά μαθηματικά, αλλά όλα εξηγούνται με μεγάλη λεπτομέρεια και ξεκάθαρα.

Ο αλγόριθμος μοιάζει με αυτό: μια ακτίνα εκπέμπεται από ένα εικονικό μάτι μέσω κάθε pixel της εικόνας και βρίσκεται το σημείο τομής της με την επιφάνεια της σκηνής (για να απλοποιήσουμε την παρουσίαση, δεν λαμβάνουμε υπόψη τα ογκομετρικά εφέ όπως η ομίχλη). Οι ακτίνες που εκπέμπονται από το μάτι ονομάζονται πρωτογενείς. Ας υποθέσουμε ότι η πρωτογενής ακτίνα τέμνει κάποιο αντικείμενο 1 στο σημείο Η1 (Εικ. 1).

Εικόνα 1. Αλγόριθμος ανίχνευσης ακτίνων.

Στη συνέχεια, πρέπει να προσδιορίσετε για κάθε πηγή φωτός εάν αυτό το σημείο είναι ορατό από αυτήν. Ας υποθέσουμε προς το παρόν ότι όλες οι πηγές φωτός είναι σημειακές. Στη συνέχεια, για κάθε σημειακή πηγή φωτός, μια ακτίνα σκιάς εκπέμπεται από το σημείο Η1 προς αυτήν. Αυτό σας επιτρέπει να πείτε εάν ένα δεδομένο σημείο φωτίζεται από μια συγκεκριμένη πηγή. Εάν η ακτίνα σκιάς τέμνεται με άλλα αντικείμενα που βρίσκονται πιο κοντά από την πηγή χρώματος, σημαίνει ότι το σημείο H1 βρίσκεται στη σκιά αυτής της πηγής και δεν χρειάζεται να φωτιστεί. Διαφορετικά, υπολογίζουμε τον φωτισμό σύμφωνα με κάποιο τοπικό μοντέλο (Fong, Cook-Torrance κ.λπ.). Ο φωτισμός από όλες τις ορατές (από το σημείο H1) πηγές φωτός προστίθεται μαζί. Περαιτέρω, εάν το υλικό του αντικειμένου 1 έχει ανακλαστικές ιδιότητες, μια ανακλώμενη ακτίνα εκπέμπεται από το σημείο Η1 και ολόκληρη η διαδικασία ανίχνευσης επαναλαμβάνεται αναδρομικά για αυτό. Παρόμοιες ενέργειες πρέπει να εκτελούνται εάν το υλικό έχει διαθλαστικές ιδιότητες.

// Αλγόριθμοςίχνηακτίνες

//

float3 RayTrace (const Ray & ray )

{

float3 color(0,0,0);

Hit hit = RaySceneIntersection(ray);

εάν (! χτυπήσει .υπάρχει )

χρώμα επιστροφής ;

float3 hit_point = ray .pos + ray .dir *hit .t ;

για (int i =0;i

εάν (Ορατό (hit_point , φώτα ))

χρώμα += Σκιά (χτύπημα, φώτα);

if (πατήστε .material .reflection > 0)

{

Ray reflRay = ανακλώ(ακτίνα, χτύπημα);

color += χτυπήστε .material .reflection*RayTrace (reflRay );

}

εάν (χτύπησε .material .διάθλαση > 0)

{

Ray refrRay = διάθλαση(ακτίνα, χτύπημα);

color += χτυπήστε .material .refraction *RayTrace ( refrRay );

}

ΕΠΙΣΤΡΟΦΗχρώμα;

}

Λίστα 1. Αλγόριθμος ανίχνευσης ακτίνων προς τα πίσω.

Ας εξηγήσουμε το τμήμα του προγράμματος (Λίστα 1). Η δέσμη αντιπροσωπεύεται από δύο διανύσματα. Το πρώτο διάνυσμα είναι το pos, το σημείο στο οποίο εκπέμπεται η δέσμη. Το δεύτερο είναι dir - η κανονικοποιημένη κατεύθυνση της ακτίνας. Το χρώμα είναι ένα διάνυσμα τριών αριθμών - μπλε, κόκκινο, πράσινο. Στην αρχή της συνάρτησης RayTrace, μετράμε την τομή της ακτίνας με τη σκηνή (που αναπαρίσταται απλώς ως λίστα αντικειμένων προς το παρόν) και αποθηκεύουμε ορισμένες πληροφορίες σχετικά με τη διασταύρωση στη μεταβλητή hit και την απόσταση από τη διασταύρωση στο χτύπημα .t μεταβλητή. Στη συνέχεια, εάν η ακτίνα χάσει και δεν υπάρχει διασταύρωση, πρέπει να επιστρέψετε το χρώμα του φόντου (στην περίπτωσή μας, μαύρο). Εάν βρεθεί μια τομή, υπολογίζουμε το σημείο τομής hit_point χρησιμοποιώντας την εξίσωση ακτίνων (ισοδύναμη με την εξίσωση γραμμής με τη συνθήκη t>0). Αφού υπολογίσουμε το σημείο τομής σε συντεταγμένες του κόσμου, αρχίζουμε να υπολογίζουμε τις σκιές. Αφήστε τις πηγές να βρίσκονται στη διάταξη των φώτων. Στη συνέχεια περνάμε από ολόκληρο τον πίνακα σε ένα βρόχο και για κάθε πηγή φωτός ελέγχουμε (με την ίδια ανίχνευση ακτίνων) αν η φωτεινή πηγή είναι ορατή από ένα δεδομένο hit_point. Εάν είναι ορατό, προσθέτουμε φωτισμό από αυτήν την πηγή, που υπολογίζεται χρησιμοποιώντας κάποιο τοπικό μοντέλο (για παράδειγμα, το μοντέλο Phong). Στη συνέχεια, εάν το υλικό του αντικειμένου που χτύπησε η ακτίνα έχει ανακλαστικές ή διαθλαστικές ιδιότητες, ανιχνεύουμε τις ακτίνες αναδρομικά, πολλαπλασιάζουμε το χρώμα που προκύπτει με τον αντίστοιχο συντελεστή ανάκλασης ή διάθλασης και το προσθέτουμε στο χρώμα που προκύπτει. Οι συντελεστές ανάκλασης και διάθλασης μπορούν να είναι είτε μονόχρωμοι είτε έγχρωμοι. Όλα εξαρτώνται από το μαθηματικό μοντέλο που χρησιμοποιείται για την αναπαράσταση των υλικών.

Μερικές φορές οι ακτίνες σκιάς είναι χρωματιστές. Τέτοιες ακτίνες χρησιμοποιούνται εάν υπάρχει πιθανότητα ένα αντικείμενο να αποφραχθεί από ένα άλλο διαφανές αντικείμενο. Σε αυτή την περίπτωση, υπολογίζεται το πάχος της διαδρομής της ακτίνας σκιάς μέσα στο διαφανές αντικείμενο και η σκιά μπορεί να αποκτήσει οποιαδήποτε απόχρωση (αν το αντικείμενο έχει). Φυσικά, οι σκιές που υπολογίζονται με αυτόν τον τρόπο είναι σωστές μόνο εάν το διαφανές αντικείμενο που ρίχνει τη σκιά έχει δείκτη διάθλασης πολύ κοντά στη μονάδα (υποθέτουμε ότι ο δείκτης διάθλασης του αέρα είναι 1).

Εάν δεν συμβαίνει αυτό, τότε ένα σύνθετο σχέδιο που ονομάζεται καυστικό θα σχηματιστεί κάτω από το διαφανές αντικείμενο. Τα καυστικά υπολογίζονται χωριστά χρησιμοποιώντας τη μέθοδο του χάρτη φωτονίων. Χαρακτηριστικό παράδειγμα καυστικού είναι μια ηλιαχτίδα από ένα ποτήρι νερό όταν ο ήλιος λάμπει μέσα από αυτό.

Θα πρέπει να σημειωθεί ότι η ανίχνευση οπισθίων ακτίνων όπως περιγράφεται εδώ δεν είναι μια φωτορεαλιστική τεχνική απόδοσης. Επιπλέον, σε σύγκριση με τη μέθοδο ραστεροποίησης, σας επιτρέπει να υπολογίζετε σωστά μόνο καθαρές αντανακλάσεις, διαθλάσεις και να εξαλείφετε το ψευδώνυμο με μεγάλο αριθμό ακτίνων ανά pixel (που είναι αργό). Για να αποκτήσετε το πλήρες φάσμα των ορατών εφέ, είναι απαραίτητο να χρησιμοποιήσετε πιο πολύπλοκους αλγόριθμους, οι οποίοι, ωστόσο, βασίζονται ειδικά στην ανίχνευση ακτίνων.

Εικόνα 2. Εικόνα ιχνηλάτησης ακτίνων.

Ακόμη και με ανάλυση εικόνας 1024x768, ο αριθμός των πρωταρχικών ακτίνων είναι 786432 - δηλαδή πλησιάζει το ένα εκατομμύριο. Κάθε μία από αυτές τις ακτίνες μπορεί να πάει βαθιά σε αναδρομή, αυξάνοντας τον αριθμό των ιχνηθετημένων ακτίνων αρκετές φορές. Ο αριθμός των υπολογισμών που πρέπει να γίνουν είναι τεράστιος και η ανίχνευση ακτίνων είναι συνήθως αρκετά αργή. Επιπλέον, η μερίδα του λέοντος του χρόνου του επεξεργαστή δαπανάται στην αναζήτηση διασταυρώσεων. Επομένως, το θέμα της απόδοσης εδώ είναι στην πρώτη θέση. Υπάρχουν κατηγορίες αλγορίθμων που μπορούν να επιταχύνουν την αναζήτηση διασταυρώσεων κατά τάξεις μεγέθους. Ο λόγος ποιότητας/ταχύτητας είναι το κύριο κριτήριο κατά την επιλογή ορισμένων αλγορίθμων, αλλά οι αποτελεσματικοί αλγόριθμοι σε κάθε περίπτωση προσπαθούν να χρησιμοποιήσουν τη συνοχή των ακτίνων με τη μία ή την άλλη μορφή. Δείτε το Fast Ray Tracing για περισσότερες λεπτομέρειες.

Μέθοδοι ανίχνευσης ακτίνων (ακτίνα Ιχνηλασία) Σήμερα θεωρούνται οι πιο ισχυρές και ευέλικτες μέθοδοι για τη δημιουργία ρεαλιστικών εικόνων. Υπάρχουν πολλά παραδείγματα εφαρμογής αλγορίθμων ανίχνευσης για υψηλής ποιότητας εμφάνιση των πιο περίπλοκων τρισδιάστατων σκηνών. Μπορεί να σημειωθεί ότι η καθολικότητα των μεθόδων ανίχνευσης οφείλεται σε μεγάλο βαθμό στο γεγονός ότι βασίζονται σε απλές και σαφείς έννοιες που αντικατοπτρίζουν την εμπειρία μας στην αντίληψη του κόσμου γύρω μας.

Ρύζι. 8.12. Μοντέλα ανάκλασης: α – ιδανικός καθρέφτης, β – ατελής καθρέφτης, γ – διάχυτος, δ – άθροισμα διάχυτου και κατοπτρικού, δ – αντίστροφος, f – άθροισμα διάχυτου, κατοπτρικού και αντίστροφου

Πώς βλέπουμε τη γύρω πραγματικότητα; Πρώτα, πρέπει να αποφασίσουμε τι μπορούμε γενικά να δούμε. Αυτό μελετάται σε ειδικούς κλάδους, και σε κάποιο βαθμό, αυτό είναι ένα φιλοσοφικό ερώτημα. Αλλά εδώ θα υποθέσουμε ότι τα γύρω αντικείμενα έχουν τις ακόλουθες ιδιότητες σε σχέση με το φως:

    ακτινοβολώ;

    αντανακλούν και απορροφούν?

    περάσουν από τον εαυτό τους.

Ρύζι. 8.13. Ακτινοβολία - α - ομοιόμορφα προς όλες τις κατευθύνσεις, β - κατευθυνόμενη

Κάθε μία από αυτές τις ιδιότητες μπορεί να περιγραφεί από κάποιο σύνολο χαρακτηριστικών. Για παράδειγμα, η ακτινοβολία μπορεί να χαρακτηριστεί από ένταση, κατεύθυνση, φάσμα. Η ακτινοβολία μπορεί να προέρχεται από μια σχετικά σημειακή πηγή (ένα μακρινό αστέρι) ή από μια πηγή διάχυτου φωτός (ας πούμε, από τηγμένη λάβα που εκρήγνυται από έναν ηφαιστειακό κρατήρα). Η ακτινοβολία μπορεί να διαδοθεί κατά μήκος μιας αρκετά στενής δέσμης (εστιασμένη δέσμη λέιζερ) ή σε κώνο (προβολέας), ή ομοιόμορφα προς όλες τις κατευθύνσεις (Ήλιος) ή κάτι άλλο. Η ιδιότητα ανάκλασης (απορρόφηση) μπορεί να περιγραφεί από τα χαρακτηριστικά της διάχυτης σκέδασης και της κατοπτρικής ανάκλασης. Η διαφάνεια μπορεί να περιγραφεί από την εξασθένηση της έντασης και τη διάθλαση.

Η κατανομή της φωτεινής ενέργειας κατά μήκος των πιθανών κατευθύνσεων των ακτίνων φωτός μπορεί να εμφανιστεί χρησιμοποιώντας διανυσματικά διαγράμματα, στα οποία το μήκος των διανυσμάτων αντιστοιχεί στην ένταση (Εικ. 8.12 - 8.14).

Στις προηγούμενες παραγράφους, έχουμε ήδη εξοικειωθεί με τους τύπους αντανάκλασης που αναφέρονται πιο συχνά - κατοπτρικός και διάχυτος. Λιγότερο συχνά στη βιβλιογραφία αναφέρεται το ανάποδο κάτοπτρο ή αντι-καθρέφτη απόήττα,στην οποία η μέγιστη ένταση ανάκλασης αντιστοιχεί στην κατεύθυνση προς την πηγή. Ορισμένοι τύποι βλάστησης στην επιφάνεια της Γης, που παρατηρούνται από ένα ύψος ορυζώνων, έχουν ανάκλαση αντίστροφου καθρέφτη.

Δύο ακραίες, εξιδανικευμένες περιπτώσεις διάθλασης φαίνονται στο Σχ. 8.13.

Ορισμένα πραγματικά αντικείμενα διαθλούν τις ακτίνες με πολύ πιο σύνθετους τρόπους, όπως το γυαλί που καλύπτεται από πάγο.

Ένα και το αυτό αντικείμενο της πραγματικότητας μπορεί να γίνει αντιληπτό ως πηγή φωτός ή μπορεί, όταν το δούμε διαφορετικά, να θεωρηθεί αντικείμενο που μόνο αντανακλά και μεταδίδει φως. Για παράδειγμα, ένας θόλος συννεφιασμένου ουρανού σε κάποια τρισδιάστατη σκηνή μπορεί να μοντελοποιηθεί ως εκτεταμένη (κατανεμημένη) πηγή φωτός, ενώ σε άλλα μοντέλα ο ίδιος ουρανός λειτουργεί ως ημιδιαφανές μέσο που φωτίζεται από την κατεύθυνση του Ήλιου.

Ρύζι. 8.14. Διάθλαση α – ιδανική, β – διάχυτη

Γενικά, κάθε αντικείμενο περιγράφεται από κάποιο συνδυασμό των παραπάνω τριών ιδιοτήτων. Ως άσκηση, προσπαθήστε να δώσετε ένα παράδειγμα ενός αντικειμένου που έχει ταυτόχρονα τρεις από αυτές τις ιδιότητες - εκπέμπει φως και, ταυτόχρονα, αντανακλά και μεταδίδει φως από άλλες πηγές. Η φαντασία σας θα βρει πιθανώς άλλα παραδείγματα εκτός, ας πούμε, από το καυτό γυαλί.

Τώρα ας δούμε πώς σχηματίζεται μια εικόνα μιας σκηνής που περιέχει πολλά χωροαντικείμενα. Θα υποθέσουμε ότι οι ακτίνες φωτός αναδύονται από σημεία στην επιφάνεια (όγκος) των εκπεμπόμενων αντικειμένων. Μπορούμε να ονομάσουμε τέτοιες ακτίνες πρωτεύουσες - φωτίζουν όλα τα άλλα.

Ένα σημαντικό σημείο είναι η υπόθεση ότι μια δέσμη φωτός στον ελεύθερο χώρο διαδίδεται κατά μήκος μιας ευθείας γραμμής (αν και τα αίτια πιθανής καμπυλότητας μελετώνται και σε ειδικές ενότητες της φυσικής). Αλλά σε γεωμετρική οπτικήΥποτίθεται ότι η δέσμη φωτός διαδίδεται σε ευθεία γραμμή μέχρι να συναντήσει μια ανακλώσα επιφάνεια ή το όριο ενός διαθλαστικού μέσου. Έτσι θα πιστέψουμε.

Αμέτρητες πρωτογενείς ακτίνες προέρχονται από πηγές ακτινοβολίας σε διαφορετικές κατευθύνσεις (ακόμη και μια δέσμη λέιζερ δεν μπορεί να εστιαστεί τέλεια - παρόλα αυτά, το φως θα διαδοθεί όχι σε μια τέλεια λεπτή γραμμή, αλλά σε έναν κώνο, μια δέσμη ακτίνων). Μερικές ακτίνες πέφτουν στον ελεύθερο χώρο και κάποιες (υπάρχουν επίσης αμέτρητες) πέφτουν σε άλλα αντικείμενα. Εάν η δέσμη προσκρούσει σε ένα διαφανές αντικείμενο, τότε, διαθλώντας, προχωρά περισσότερο, ενώ απορροφάται μέρος της φωτεινής ενέργειας. Ομοίως, εάν μια κατοπτρικά ανακλαστική επιφάνεια συναντηθεί στη διαδρομή της δέσμης, τότε αλλάζει επίσης κατεύθυνση και απορροφάται μέρος της φωτεινής ενέργειας. Εάν το αντικείμενο είναι καθρέφτη και διαφανές ταυτόχρονα (για παράδειγμα, συνηθισμένο γυαλί), τότε θα υπάρχουν ήδη δύο δοκοί - σε αυτήν την περίπτωση, η δοκός λέγεται ότι έχει χωριστεί.

Μπορεί να ειπωθεί ότι ως αποτέλεσμα της πρόσκρουσης σε αντικείμενα των πρωτογενών ακτίνων, προκύπτουν δευτερεύουσες ακτίνες. Αμέτρητες δευτερεύουσες ακτίνες πηγαίνουν στον ελεύθερο χώρο, αλλά μερικές από αυτές χτυπούν άλλα αντικείμενα. Έτσι, επανειλημμένα ανακλώμενες και διαθλούμενες, μεμονωμένες ακτίνες φωτός έρχονται στο σημείο της παρατήρησης - το ανθρώπινο μάτι ή το οπτικό σύστημα της κάμερας. Προφανώς, ένα μέρος των πρωτογενών ακτίνων απευθείας από τις πηγές ακτινοβολίας μπορεί επίσης να φτάσει στο σημείο παρατήρησης. Έτσι, η εικόνα της σκηνής σχηματίζεται από κάποιο σύνολο ακτίνων φωτός.

Το χρώμα των επιμέρους σημείων της εικόνας καθορίζεται από το φάσμα και την ένταση των πρωτογενών ακτίνων των πηγών ακτινοβολίας, καθώς και από την απορρόφηση της φωτεινής ενέργειας σε αντικείμενα που συναντώνται στη διαδρομή των αντίστοιχων ακτίνων.

Ρύζι. 8.15. Σχέδιο ανίχνευσης ακτίνων προς τα πίσω

Η άμεση εφαρμογή αυτού του μοντέλου απεικόνισης ακτίνων φαίνεται δύσκολη. Μπορείτε να προσπαθήσετε να αναπτύξετε έναν αλγόριθμο για την κατασκευή μιας εικόνας χρησιμοποιώντας την καθορισμένη μέθοδο. Σε έναν τέτοιο αλγόριθμο, είναι απαραίτητο να προβλεφθεί μια απαρίθμηση όλων των πρωταρχικών ακτίνων και να προσδιοριστεί ποιες από αυτές χτυπούν τα αντικείμενα και την κάμερα. Στη συνέχεια, επαναλάβετε όλες τις δευτερεύουσες ακτίνες και λάβετε επίσης υπόψη μόνο αυτές που χτυπούν αντικείμενα και την κάμερα. Και ούτω καθεξής. Αυτή η μέθοδος μπορεί να ονομαστεί ευθείαανίχνευση ακτίνων. Η πρακτική αξία μιας τέτοιας μεθόδου είναι αμφίβολη. Πράγματι, πώς να λάβετε υπόψη τον άπειρο αριθμό ακτίνων που πηγαίνουν προς όλες τις κατευθύνσεις; Προφανώς, η πλήρης απαρίθμηση ενός άπειρου αριθμού ακτίνων είναι κατ' αρχήν αδύνατη. Ακόμα κι αν το μειώσουμε κατά κάποιον τρόπο σε έναν πεπερασμένο αριθμό πράξεων (για παράδειγμα, διαιρούμε ολόκληρη τη σφαίρα των κατευθύνσεων σε γωνιακούς τομείς και λειτουργούμε όχι με απείρως λεπτές γραμμές, αλλά με τομείς), το κύριο μειονέκτημα της μεθόδου παραμένει - πολλές περιττές πράξεις σχετίζεται με τον υπολογισμό των ακτίνων, οι οποίες στη συνέχεια δεν χρησιμοποιούνται. Έτσι, ούτως ή άλλως, εμφανίζεται στην παρούσα στιγμή.

Μέθοδος οπισθοδρόμηση rays σας επιτρέπει να μειώσετε σημαντικά την αναζήτηση για ακτίνες φωτός. Η μέθοδος αναπτύχθηκε στη δεκαετία του '80, τα έργα θεωρούνται θεμελιώδη Witte-daΚαι Κέι. Σύμφωνα με αυτή τη μέθοδο, οι ακτίνες παρακολουθούνται όχι από πηγές φωτός, αλλά προς την αντίθετη κατεύθυνση - από το σημείο παρατήρησης.Με αυτόν τον τρόπο λαμβάνονται υπόψη μόνο εκείνες οι ακτίνες που συμβάλλουν στο σχηματισμό της εικόνας.

Ας δούμε πώς μπορείτε να αποκτήσετε μια εικόνα ράστερ κάποιας τρισδιάστατης σκηνής χρησιμοποιώντας το backtracing. Ας υποθέσουμε ότι το επίπεδο προβολής χωρίζεται σε πολλά τετράγωνα - pixel. Ας επιλέξουμε μια κεντρική προβολή με κέντρο εξαφάνισης σε μια ορισμένη απόσταση από το επίπεδο προβολής. Ας σχεδιάσουμε μια ευθεία γραμμή από το κέντρο εξαφάνισης μέχρι το μέσο του τετραγώνου (pixel) του επιπέδου προβολής (Εικ. 8.15). Αυτή θα είναι η κύρια ακτίνα οπίσθιου ίχνους. Εάν η ευθεία γραμμή αυτής της ακτίνας χτυπήσει ένα ή περισσότερα αντικείμενα στη σκηνή, τότε επιλέξτε το πλησιέστερο σημείο τομής. Για να προσδιορίσετε το χρώμα ενός εικονοστοιχείου εικόνας, πρέπει να λάβετε υπόψη τις ιδιότητες του αντικειμένου, καθώς και ποια ακτινοβολία φωτός πέφτει στο αντίστοιχο σημείο του αντικειμένου.

Ρύζι. 8.16. Backtracing για αντικείμενα που έχουν κατοπτρικές και διαθλαστικές ιδιότητες

Εάν το αντικείμενο αντικατοπτρίζεται (τουλάχιστον εν μέρει), τότε κατασκευάζουμε μια δευτερεύουσα ακτίνα - την προσπίπτουσα ακτίνα, θεωρώντας την προηγούμενη, πρωτογενή, ιχνηλατημένη ακτίνα ως ακτίνα ανάκλασης. Παραπάνω, εξετάσαμε την κατοπτρική ανάκλαση και λάβαμε τύπους για το διάνυσμα της ανακλώμενης ακτίνας λαμβάνοντας υπόψη τα διανύσματα κανονικής και προσπίπτουσας ακτίνας. Αλλά εδώ γνωρίζουμε το διάνυσμα της ανακλώμενης ακτίνας, αλλά πώς μπορούμε να βρούμε το διάνυσμα της προσπίπτουσας ακτίνας; Για να το κάνετε αυτό, μπορείτε να χρησιμοποιήσετε τον ίδιο τύπο κατοπτρικής ανάκλασης, αλλά ορίζοντας το απαιτούμενο διάνυσμα προσπίπτουσας ακτίνας ως την ανακλώμενη ακτίνα. Δηλαδή η αντανάκλαση είναι αντίθετη.

Για έναν ιδανικό καθρέφτη, αρκεί να ανιχνεύσουμε στη συνέχεια μόνο το επόμενο σημείο τομής της δευτερεύουσας ακτίνας με κάποιο αντικείμενο. Τι σημαίνει ο όρος «τέλειος καθρέφτης»; Θα υποθέσουμε ότι ένας τέτοιος καθρέφτης έχει μια τέλεια ίση στιλβωμένη επιφάνεια, επομένως μια ανακλώμενη ακτίνα αντιστοιχεί μόνο σε μία προσπίπτουσα ακτίνα. Ο καθρέφτης μπορεί να σκοτεινιάσει, δηλαδή να απορροφήσει μέρος της φωτεινής ενέργειας, αλλά εξακολουθεί να τηρείται ο κανόνας: μία ακτίνα προσπίπτει, μία ανακλάται. Μπορείτε επίσης να σκεφτείτε έναν «ατελή καθρέφτη». Αυτό θα σήμαινε ότι η επιφάνεια είναι ανώμαλη. Η κατεύθυνση της ανακλώμενης ακτίνας θα αντιστοιχεί σε πολλές προσπίπτουσες ακτίνες (ή αντίστροφα, μια προσπίπτουσα ακτίνα δημιουργεί πολλές ανακλώμενες ακτίνες), οι οποίες σχηματίζουν έναν ορισμένο κώνο, πιθανώς ασύμμετρο, με άξονα κατά μήκος της γραμμής της προσπίπτουσας ακτίνας ενός ιδανικού καθρέφτη. Ο κώνος αντιστοιχεί σε έναν ορισμένο νόμο κατανομής έντασης, ο απλούστερος από τον οποίο περιγράφεται από το μοντέλο Phong - το συνημίτονο της γωνίας που ανυψώνεται σε μια ορισμένη ισχύ. Ένας ατελής καθρέφτης περιπλέκει πολύ την ιχνηλάτηση - πρέπει να εντοπίσετε όχι μία, αλλά πολλές προσπίπτουσες ακτίνες και να λάβετε υπόψη τη συμβολή της ακτινοβολίας από άλλα αντικείμενα ορατά από ένα δεδομένο σημείο.

Εάν το αντικείμενο είναι διαφανές, τότε είναι απαραίτητο να κατασκευαστεί μια νέα ακτίνα, μια που, όταν διαθλαστεί, θα παρήγαγε την προηγούμενη ιχνηλατημένη ακτίνα. Εδώ μπορείτε επίσης να επωφεληθείτε από την αναστρεψιμότητα, η οποία ισχύει και για τη διάθλαση. Για να υπολογίσετε το διάνυσμα της επιθυμητής ακτίνας, μπορείτε να εφαρμόσετε τους τύπους που συζητήθηκαν παραπάνω για το διάνυσμα της διαθλαστικής ακτίνας, υποθέτοντας ότι η διάθλαση συμβαίνει προς την αντίθετη κατεύθυνση (Εικ. 8.16).

Εάν ένα αντικείμενο έχει τις ιδιότητες της διάχυτης ανάκλασης και διάθλασης, τότε, στη γενική περίπτωση, όπως για έναν μη ιδανικό καθρέφτη, είναι απαραίτητο να εντοπιστούν οι ακτίνες που προέρχονται από όλα τα υπάρχοντα αντικείμενα. Για τη διάχυτη ανάκλαση, η ένταση του ανακλώμενου φωτός είναι γνωστό ότι είναι ανάλογη με το συνημίτονο της γωνίας μεταξύ του διανύσματος ακτίνας από την πηγή φωτός και του κανονικού. Εδώ, η πηγή φωτός μπορεί να είναι οποιοδήποτε αντικείμενο ορατό από ένα δεδομένο σημείο που μπορεί να μεταδώσει φωτεινή ενέργεια.

Εάν αποδειχθεί ότι η τρέχουσα ακτίνα οπισθοδρόμησης δεν τέμνει κανένα αντικείμενο, αλλά κατευθύνεται στον ελεύθερο χώρο, τότε η ανίχνευση για αυτήν την ακτίνα τελειώνει.

Οι ακτίνες αναδρομής με τη μορφή που τις θεωρήσαμε εδώ, αν και μειώνει την αναζήτηση, δεν μας επιτρέπει να απαλλαγούμε από τον άπειρο αριθμό των ακτίνων που αναλύθηκαν. Στην πραγματικότητα, αυτή η μέθοδος μας επιτρέπει να λάβουμε αμέσως μία κύρια ακτίνα ανάδρομης για κάθε σημείο στην εικόνα. Ωστόσο, μπορεί να υπάρχει ήδη ένας άπειρος αριθμός δευτερευουσών ακτίνων ανάκλασης. Έτσι, για παράδειγμα, εάν ένα αντικείμενο μπορεί να αντανακλά φως από οποιοδήποτε άλλο αντικείμενο και εάν αυτά τα άλλα αντικείμενα είναι αρκετά μεγάλα, τότε ποια σημεία των αντικειμένων που εκπέμπουν πρέπει να ληφθούν υπόψη για να κατασκευαστούν οι αντίστοιχες ακτίνες, για παράδειγμα, σε διάχυτη ανάκλαση ? Προφανώς, όλα τα σημεία.

Στην πρακτική εφαρμογή της μεθόδου backtracing εισάγονται περιορισμοί. Ορισμένοι από αυτούς είναι απαραίτητοι για να μπορέσουμε να λύσουμε το πρόβλημα της σύνθεσης εικόνας κατ' αρχήν και ορισμένοι περιορισμοί μπορούν να βελτιώσουν σημαντικά την απόδοση της ανίχνευσης. Παραδείγματα τέτοιων περιορισμών.

1. Μεταξύ όλων των ειδών αντικειμένων ξεχωρίζουν κάποια, τα οποία θα ονομάσουμε πηγές φως.Οι πηγές φωτός μπορούν μόνο να εκπέμπουν φως, αλλά δεν μπορούν να το ανακλάσουν ή να το διαθλάσουν (θα εξετάσουμε μόνο σημείοπηγές φωτός).

2. Οι ιδιότητες των ανακλαστικών επιφανειών περιγράφονται από το άθροισμα δύο συστατικών - της διάχυτης και της κατοπτρικής.

3. Με τη σειρά του, η κερδοσκοπία περιγράφεται επίσης από δύο συνιστώσες. Πρώτα (αντανάκλαση) λαμβάνει υπόψη τις αντανακλάσεις από άλλα αντικείμενα που δεν είναι πηγές φωτός. Κατασκευάζεται μόνο μία κατοπτρικά ανακλώμενη δέσμη r για περαιτέρω ιχνηλάτηση Δεύτερο συστατικό ( Κατοπτρικός ) σημαίνει λάμψη από πηγές φωτός. Για να γίνει αυτό, οι ακτίνες κατευθύνονται σε όλες τις πηγές φωτός και προσδιορίζονται οι γωνίες που σχηματίζονται από αυτές τις ακτίνες με την κατοπτρικά ανακλώμενη ακτίνα ιχνηλάτησης. (r). Στον κατοπτρισμό, το χρώμα ενός σημείου επιφάνειας καθορίζεται από το χρώμα αυτού που αντανακλάται. Στην πιο απλή περίπτωση, ο καθρέφτης δεν έχει το δικό του χρώμα επιφάνειας.

4. Με τη διάχυτη ανάκλαση λαμβάνονται υπόψη μόνο οι ακτίνες από πηγές φωτός. Οι ακτίνες από κατοπτρικά ανακλαστικές επιφάνειες αγνοούνται. Εάν μια δέσμη που κατευθύνεται σε μια δεδομένη πηγή φωτός καλύπτεται από άλλο αντικείμενο, τότε αυτό το σημείο του αντικειμένου βρίσκεται στη σκιά. Στη διάχυτη ανάκλαση, το χρώμα ενός φωτισμένου σημείου σε μια επιφάνεια καθορίζεται από το εγγενές χρώμα της επιφάνειας και το χρώμα των πηγών φωτός.

5. Για διαφανές (1gap5rage()Τα αντικείμενα συνήθως δεν λαμβάνουν υπόψη την εξάρτηση του δείκτη διάθλασης από το μήκος κύματος. Μερικές φορές η διαφάνεια μοντελοποιείται γενικά χωρίς διάθλαση, δηλαδή την κατεύθυνση της διαθλασμένης δέσμης Εγώ συμπίπτει με την κατεύθυνση της προσπίπτουσας δέσμης.

    Για να ληφθεί υπόψη ο φωτισμός των αντικειμένων από το φως που διασκορπίζεται από άλλα αντικείμενα, εισάγεται ένα στοιχείο φόντου (στοbient).

7. Για να ολοκληρωθεί η ανίχνευση, εισάγεται κάποια οριακή τιμή φωτισμού, η οποία δεν θα πρέπει πλέον να συμβάλλει στο χρώμα που προκύπτει ή ο αριθμός των επαναλήψεων είναι περιορισμένος.

Σύμφωνα με Ασπρομοντέλατο χρώμα ενός συγκεκριμένου σημείου ενός αντικειμένου καθορίζεται από τη συνολική ένταση

ΕΓΩ() = KaIa()ΝΤΟ() + KdId()ΝΤΟ() + KsIs() + KrIr() + KtIt()

όπου λ είναι το μήκος κύματος,

C (λ) - το καθορισμένο αρχικό χρώμα του σημείου αντικειμένου,

K a, K d, Ks, Kr και K t - συντελεστές που λαμβάνουν υπόψη τις ιδιότητες ενός συγκεκριμένου αντικειμένου μέσω των παραμέτρων του οπίσθιου φωτισμού, της διάχυτης σκέδασης, της κατοπτρότητας, της ανάκλασης και της διαφάνειας,

Εγώ ένα - ένταση φωτισμού φόντου,

Εγώ ρε - η ένταση που λαμβάνεται υπόψη για τη διάχυτη σκέδαση,

Εγώ μικρό - η ένταση που λαμβάνεται υπόψη για την κερδοσκοπία,

Εγώ r - την ένταση της ακτινοβολίας που έρχεται κατά μήκος της ανακλώμενης δέσμης,

Εγώ t - την ένταση της ακτινοβολίας που έρχεται κατά μήκος της διαθλασμένης δέσμης.

Ένταση οπίσθιου φωτισμού (1 ΕΝΑ ) για κάποιο αντικείμενο είναι συνήθως μια σταθερά. Ας γράψουμε τύπους για άλλες εντάσεις. Για διάχυτη αντανάκλαση

Εγώ ρε =

Οπου Εγώ Εγώ (λ) - ένταση ακτινοβολίας Εγώ- ro πηγή φωτός, θ Εγώ- η γωνία μεταξύ της κανονικής προς την επιφάνεια του αντικειμένου και της κατεύθυνσης προς Εγώ- vi Πηγή φωτός.

Για αντικατοπτρισμό:

Εγώ ρε =

Οπου R- εκθέτης από ένα έως αρκετές εκατοντάδες (σύμφωνα με το μοντέλο του Phong), α Εγώείναι η γωνία μεταξύ της ανακλώμενης δέσμης (backtracing) και της κατεύθυνσης προς την r "-η πηγή φωτός.

Η ένταση της ακτινοβολίας που διέρχεται κατά μήκος της ανακλώμενης δέσμης ( Εγώ r), καθώς και κατά μήκος μιας διαθλασμένης ακτίνας ( Εγώ t ) , πολλαπλασιάζεται με έναν παράγοντα που λαμβάνει υπόψη την εξασθένηση της έντασης ανάλογα με την απόσταση που διανύει η δέσμη. Αυτός ο συντελεστής γράφεται στη μορφή μι - ρεΟπου ρε- διανυθείσα απόσταση, – παράμετρος εξασθένησης που λαμβάνει υπόψη τις ιδιότητες του μέσου στο οποίο διαδίδεται η δέσμη.

Για την κύρια ακτίνα, είναι απαραίτητο να ρυθμίσετε την κατεύθυνση που αντιστοιχεί στην επιλεγμένη προβολή. Εάν η προβολή είναι κεντρική, τότε οι πρωτεύουσες ακτίνες αποκλίνουν από ένα κοινό σημείο· για μια παράλληλη προβολή, οι πρωτεύουσες ακτίνες είναι παράλληλες. Η ακτίνα μπορεί να προσδιοριστεί, για παράδειγμα, από τις συντεταγμένες των σημείων έναρξης και τέλους του τμήματος, τις συντεταγμένες του σημείου έναρξης και της κατεύθυνσης ή με κάποιον άλλο τρόπο. Η ρύθμιση της κύριας ακτίνας καθορίζει μοναδικά την προβολή εικονιζόμενη σκηνή . Με την ανίχνευση αντίστροφης ακτίνας, οποιοσδήποτε μετασχηματισμός συντεταγμένων δεν είναι καθόλου απαραίτητος. Η προβολή λαμβάνεται αυτόματα - περιλαμβάνοντας όχι μόνο επίπεδη, αλλά και, για παράδειγμα, κυλινδρική ή σφαιρική. Αυτή είναι μια από τις εκδηλώσεις της ευελιξίας της μεθόδου ανίχνευσης.

Κατά την ανίχνευση ακτίνων, είναι απαραίτητο να προσδιοριστούν τα σημεία τομής μιας ευθείας γραμμής ακτίνων με αντικείμενα. Η μέθοδος για τον προσδιορισμό του σημείου τομής εξαρτάται από το είδος του αντικειμένου και πώς αναπαρίσταται σε ένα συγκεκριμένο γραφικό σύστημα. Έτσι, για παράδειγμα, για αντικείμενα που παρουσιάζονται με τη μορφή πολύεδρων και πολυγωνικών ματιών, μπορείτε να χρησιμοποιήσετε γνωστές μεθόδους για τον προσδιορισμό του σημείου τομής μιας γραμμής και ενός επιπέδου, που εξετάζονται στην αναλυτική γεωμετρία. Ωστόσο, εάν το καθήκον είναι να προσδιοριστεί η τομή μιας ακτίνας με μια όψη, τότε είναι επίσης απαραίτητο το σημείο τομής που βρέθηκε να βρίσκεται μέσα στο περίγραμμα της όψης.

Υπάρχουν διάφοροι τρόποι για να ελέγξετε εάν ένα αυθαίρετο σημείο ανήκει σε ένα πολύγωνο. Ας εξετάσουμε δύο ποικιλίες ουσιαστικά της ίδιας μεθόδου (Εικ. 8.17).

Πρώτος τρόπος.Βρίσκονται όλα τα σημεία όπου το περίγραμμα τέμνει την οριζόντια γραμμή, η οποία αντιστοιχεί στη συντεταγμένη Υ του δεδομένου σημείου. Τα σημεία τομής ταξινομούνται με αύξουσα σειρά τιμών συντεταγμένων Χ. Τα ζεύγη σημείων τομής σχηματίζουν τμήματα. Αν το σημείο που ελέγχεται ανήκει σε ένα από τα τμήματα (για αυτό συγκρίνονται οι συντεταγμένες Χ του δεδομένου σημείου και τα άκρα των τμημάτων), τότε είναι εσωτερικό.

Ρύζι. 8.17. Ένα σημείο είναι εσωτερικό εάν: a - το σημείο ανήκει σε ένα τέμνον τμήμα, β - ο αριθμός των τομών είναι περιττός

Δεύτερος τρόπος.Καθορίζεται ένα σημείο που βρίσκεται στην ίδια οριζόντια γραμμή με το υπό δοκιμή σημείο και απαιτείται να βρίσκεται εκτός του περιγράμματος του πολυγώνου. Το ευρεθέν εξωτερικό σημείο και το σημείο δοκιμής είναι τα άκρα του οριζόντιου τμήματος. Καθορίζονται τα σημεία τομής αυτού του τμήματος με το περίγραμμα του πολυγώνου. Εάν ο αριθμός των τομών είναι περιττός, αυτό σημαίνει ότι το σημείο δοκιμής είναι εσωτερικό.

Εάν η ακτίνα τέμνει πολλά αντικείμενα, τότε επιλέγεται το πλησιέστερο σημείο στην κατεύθυνση της τρέχουσας ακτίνας.

Ας βγάλουμε γενικά συμπεράσματα σχετικά με τη μέθοδο ανίχνευσης αντίστροφης ακτίνας.

Θετικά χαρακτηριστικά

1. Καθολικότητα της μεθόδου, δυνατότητα εφαρμογής της για σύνθεση εικόνας μάλλον πολύπλοκων χωρικών σχημάτων. Ενσωματώνει πολλούς νόμους της γεωμετρικής οπτικής. Απλώς υλοποιούνται διάφορες προβολές.

2. Ακόμη και οι περικομμένες εκδόσεις αυτής της μεθόδου σάς επιτρέπουν να αποκτήσετε αρκετά ρεαλιστικές εικόνες. Για παράδειγμα, εάν περιοριστείτε μόνο στις πρωτεύουσες ακτίνες (από το σημείο προβολής), τότε αυτό έχει ως αποτέλεσμα την αφαίρεση αόρατων σημείων. Η ανίχνευση μιας ή δύο δευτερευουσών ακτίνων δίνει σκιές, ιδιομορφία και διαφάνεια.

3. Όλοι οι μετασχηματισμοί συντεταγμένων (αν υπάρχουν) είναι γραμμικοί, επομένως είναι αρκετά εύκολο να δουλέψετε με υφές.

4. Για ένα εικονοστοιχείο μιας εικόνας ράστερ, μπορείτε να ανιχνεύσετε πολλές ακτίνες σε κοντινή απόσταση και, στη συνέχεια, να μετρήσετε το χρώμα τους για να εξαλείψετε το φαινόμενο της σκάλας (antialiasing).

5. Εφόσον ο υπολογισμός ενός μόνο σημείου εικόνας εκτελείται ανεξάρτητα από άλλα σημεία, αυτό μπορεί να χρησιμοποιηθεί αποτελεσματικά κατά την εφαρμογή αυτής της μεθόδου σε παράλληλα υπολογιστικά συστήματα στα οποία οι ακτίνες μπορούν να ανιχνευθούν ταυτόχρονα.

Ελαττώματα

1. Προβλήματα με τη μοντελοποίηση διάχυτης ανάκλασης και διάθλασης

2. Για κάθε σημείο της εικόνας, είναι απαραίτητο να εκτελεστούν πολλές υπολογιστικές πράξεις. Η ανίχνευση ακτίνων είναι ένας από τους πιο αργούς αλγόριθμους σύνθεσης εικόνας.

Ξέρω ότι είναι λίγο απογοητευτικό. Πού είναι αντανακλάσεις, σκιές και όμορφα εμφάνιση? Θα τα πάρουμε όλα, γιατί μόλις ξεκινήσαμε. Αλλά είναι μια καλή αρχή - οι σφαίρες μοιάζουν με κύκλους, κάτι που είναι καλύτερο από το να μοιάζουν με γάτες. Δεν μοιάζουν με σφαίρες επειδή έχουμε χάσει ένα σημαντικό στοιχείο που επιτρέπει στους ανθρώπους να προσδιορίζουν το σχήμα ενός αντικειμένου - πώς αλληλεπιδρά με το φως.

Φωτισμός

Το πρώτο βήμα για να προσθέσουμε «ρεαλισμό» στην απόδοση της σκηνής μας είναι να προσομοιώσουμε τον φωτισμό. Ο φωτισμός είναι ένα απίστευτα πολύπλοκο θέμα, γι' αυτό θα παρουσιάσω ένα πολύ απλοποιημένο μοντέλο που είναι αρκετό για τους σκοπούς μας. Ορισμένα μέρη αυτού του μοντέλου δεν είναι καν μια προσέγγιση των φυσικών μοντέλων, είναι απλά γρήγορα και φαίνονται καλά.

Θα ξεκινήσουμε με μερικές απλοποιητικές υποθέσεις που θα κάνουν τη ζωή μας πιο εύκολη.

Αρχικά, θα δηλώσουμε ότι όλος ο φωτισμός είναι λευκός. Αυτό θα μας επιτρέψει να χαρακτηρίσουμε οποιαδήποτε πηγή φωτός με έναν μόνο πραγματικό αριθμό i, που ονομάζεται λάμψηφωτισμός. Η προσομοίωση έγχρωμου φωτισμού δεν είναι τόσο δύσκολη (χρειάζεστε μόνο τρεις τιμές φωτεινότητας, μία ανά κανάλι και υπολογίζοντας όλα τα χρώματα και τον φωτισμό ανά κανάλι), αλλά για να κάνουμε τη δουλειά μας πιο εύκολη, δεν θα το κάνω.

Δεύτερον, θα απαλλαγούμε από την ατμόσφαιρα. Αυτό σημαίνει ότι τα φώτα δεν γίνονται λιγότερο φωτεινά, ανεξάρτητα από το εύρος τους. Η εξασθένηση της φωτεινότητας του φωτός ανάλογα με την απόσταση δεν είναι επίσης πολύ δύσκολη στην εφαρμογή, αλλά για λόγους σαφήνειας θα την παραλείψουμε προς το παρόν.

Πηγές φωτός

Το φως πρέπει από κάπουυποκρίνομαι. Σε αυτή την ενότητα θα ορίσουμε τρεις διαφορετικούς τύπους πηγών φωτός.

σημειακές πηγές

σημειακή πηγήεκπέμπει φως από ένα σταθερό σημείο του χώρου που ονομάζεται του θέση. Το φως εκπέμπεται ομοιόμορφα προς όλες τις κατευθύνσεις. γι' αυτό λέγεται και πανκατευθυντικός φωτισμός. Επομένως, μια σημειακή πηγή χαρακτηρίζεται πλήρως από τη θέση και τη φωτεινότητά της.

Ένας λαμπτήρας πυρακτώσεως είναι ένα καλό πραγματικό παράδειγμα του τι είναι κατά προσέγγιση μια σημειακή πηγή φωτός. Αν και ένας λαμπτήρας πυρακτώσεως δεν εκπέμπει φως από ένα μόνο σημείο και δεν είναι απόλυτα πανκατευθυντικός, η προσέγγιση είναι αρκετά καλή.

Ας ορίσουμε ένα διάνυσμα ως την κατεύθυνση από το σημείο P στη σκηνή προς την πηγή φωτός Q. Αυτό το διάνυσμα, καλείται διάνυσμα φωτός, ισούται απλώς με . Σημειώστε ότι επειδή το Q είναι σταθερό και το P μπορεί να είναι οποιοδήποτε σημείο της σκηνής, γενικά θα είναι διαφορετικό για κάθε σημείο της σκηνής.

Πηγές κατεύθυνσης

Εάν μια σημειακή πηγή είναι μια καλή προσέγγιση μιας λάμπας πυρακτώσεως, τότε ποια είναι μια καλή προσέγγιση του Ήλιου;

Αυτή είναι μια δύσκολη ερώτηση και η απάντηση εξαρτάται από το τι θέλετε να αποδώσετε.

Στην κλίμακα του ηλιακού συστήματος, ο Ήλιος μπορεί χονδρικά να θεωρηθεί σημειακή πηγή. Εξάλλου, εκπέμπει φως από ένα σημείο (αν και αρκετά μεγάλο) και το εκπέμπει προς όλες τις κατευθύνσεις, άρα ταιριάζει και στις δύο απαιτήσεις.

Ωστόσο, αν η σκηνή σας διαδραματίζεται στη Γη, τότε αυτή δεν είναι πολύ καλή προσέγγιση. Ο ήλιος είναι τόσο μακριά που κάθε ακτίνα φωτός θα έχει στην πραγματικότητα την ίδια κατεύθυνση (Σημείωση: αυτή η προσέγγιση ισχύει στην κλίμακα μιας πόλης, αλλά όχι σε μεγαλύτερες αποστάσεις - στην πραγματικότητα, οι αρχαίοι Έλληνες ήταν σε θέση να υπολογίσουν την ακτίνα η Γη με εκπληκτική ακρίβεια βασισμένη σε διαφορετικές κατευθύνσεις το ηλιακό φως σε διαφορετικά μέρη). Αν και είναι δυνατό να προσεγγιστεί αυτό με μια σημειακή πηγή πολύ μακριά από τη σκηνή, αυτή η απόσταση και η απόσταση μεταξύ των αντικειμένων στη σκηνή είναι τόσο διαφορετικά σε μέγεθος που μπορεί να προκύψουν σφάλματα ακρίβειας.

Για τέτοιες περιπτώσεις θα ορίσουμε κατευθυντικές πηγές φωτισμού. Όπως οι σημειακές πηγές, μια κατευθυντική πηγή έχει φωτεινότητα, αλλά σε αντίθεση με τις σημειακές πηγές, δεν έχει θέση. Αντίθετα, έχει κατεύθυνση. Μπορείτε να το αντιληφθείτε ως μια απείρως μακρινή σημειακή πηγή, που λάμπει προς μια συγκεκριμένη κατεύθυνση.

Στην περίπτωση των σημειακών πηγών, πρέπει να υπολογίσουμε ένα νέο διάνυσμα φωτός για κάθε σημείο P στη σκηνή, αλλά σε αυτή την περίπτωση δίνεται. Στη σκηνή με τον Ήλιο και τη Γη θα είναι ίσο με .

φωτισμός περιβάλλοντος

Είναι δυνατόν να μοντελοποιήσουμε οποιοδήποτε φωτισμό του πραγματικού κόσμου ως σημειακή ή κατευθυντική πηγή; Σχεδόν πάντα ναι (Σημείωση: αλλά αυτό δεν χρειάζεται να είναι εύκολο· ο φωτισμός περιοχής (σκεφτείτε μια πηγή πίσω από έναν διαχύτη) μπορεί να προσεγγιστεί από πολλές σημειακές πηγές στην επιφάνειά του, αλλά αυτό είναι πολύπλοκο, πιο ακριβό υπολογιστικά και τα αποτελέσματα είναι όχι ιδανικό.). Είναι επαρκείς αυτοί οι δύο τύποι πηγών για τους σκοπούς μας; Δυστυχώς όχι.

Φανταστείτε τι συμβαίνει στη Σελήνη. Η μόνη σημαντική πηγή φωτός κοντά είναι ο Ήλιος. Δηλαδή, το «μπροστινό μισό» της Σελήνης σε σχέση με τον Ήλιο λαμβάνει όλο τον φωτισμό, ενώ το «πίσω μισό» βρίσκεται σε απόλυτο σκοτάδι. Το βλέπουμε από διαφορετικές οπτικές γωνίες στη Γη, και αυτό το φαινόμενο δημιουργεί αυτό που ονομάζουμε «φάσεις» της Σελήνης.

Ωστόσο, η κατάσταση στη Γη είναι λίγο διαφορετική. Ακόμη και τα σημεία που δεν λαμβάνουν φως απευθείας από μια πηγή φωτός δεν είναι εντελώς στο σκοτάδι (απλώς κοιτάξτε το πάτωμα κάτω από το τραπέζι). Πώς φτάνουν οι ακτίνες φωτός σε αυτά τα σημεία εάν η «όψη» των πηγών φωτός εμποδίζεται από κάτι;

Όπως ανέφερα στην ενότητα Έγχρωμα μοντέλαΌταν το φως χτυπά ένα αντικείμενο, ένα μέρος του απορροφάται, αλλά το υπόλοιπο διασκορπίζεται στη σκηνή. Αυτό σημαίνει ότι το φως μπορεί να προέρχεται όχι μόνο από πηγές φωτός, αλλά και από άλλα αντικείμενα που το λαμβάνουν από πηγές φωτός και το διασκορπίζουν πίσω. Γιατί όμως να σταματήσουμε εκεί; Ο διάχυτος φωτισμός, με τη σειρά του, πέφτει σε κάποιο άλλο αντικείμενο, μέρος του απορροφάται και ένα μέρος του σκορπίζεται ξανά στη σκηνή. Με κάθε αντανάκλαση, το φως χάνει μέρος της φωτεινότητάς του, αλλά θεωρητικά μπορείτε να συνεχίσετε επί άπειρον(Σημείωση: Στην πραγματικότητα όχι, επειδή το φως είναι κβαντικής φύσης, αλλά αρκετά κοντά.)

Αυτό σημαίνει ότι πρέπει να λάβετε υπόψη την πηγή φωτός κάθε αντικείμενο. Όπως μπορείτε να φανταστείτε, αυτό αυξάνει σημαντικά την πολυπλοκότητα του μοντέλου μας, επομένως δεν θα ακολουθήσουμε αυτόν τον δρόμο (Σημείωση: μπορείτε τουλάχιστον να ψάξετε στο Google Global Illumination και να δείτε τις υπέροχες εικόνες.).

Αλλά εξακολουθούμε να μην θέλουμε κάθε αντικείμενο να είναι είτε απευθείας φωτισμένο είτε εντελώς σκοτεινό (εκτός αν αποδίδουμε ένα μοντέλο του ηλιακού συστήματος). Για να ξεπεράσουμε αυτό το εμπόδιο, θα ορίσουμε έναν τρίτο τύπο πηγών φωτός, που ονομάζεται φωτισμός περιβάλλοντος, το οποίο χαρακτηρίζεται μόνο από φωτεινότητα. Πιστεύεται ότι φέρει την άνευ όρων συμβολή του φωτισμού σε κάθε σημείο της σκηνής. Αυτή είναι μια τεράστια απλοποίηση της εξαιρετικά πολύπλοκης αλληλεπίδρασης μεταξύ των φώτων και των επιφανειών σκηνής, αλλά λειτουργεί.

Φωτισμός ενός σημείου

Γενικά, μια σκηνή θα έχει μία πηγή φωτός περιβάλλοντος (επειδή το φως του περιβάλλοντος έχει μόνο τιμή φωτεινότητας και οποιοσδήποτε αριθμός από αυτές θα συνδυαστεί ασήμαντα σε μια μοναδική πηγή φωτός περιβάλλοντος) και έναν αυθαίρετο αριθμό σημειακών και κατευθυντικών φώτων.

Για να υπολογίσουμε τον φωτισμό ενός σημείου, πρέπει απλώς να υπολογίσουμε την ποσότητα φωτός που συνεισφέρει κάθε πηγή και να τα αθροίσουμε για να πάρουμε έναν αριθμό που αντιπροσωπεύει τη συνολική ποσότητα φωτισμού που λαμβάνει το σημείο. Μπορούμε στη συνέχεια να πολλαπλασιάσουμε το χρώμα της επιφάνειας σε αυτό το σημείο με αυτόν τον αριθμό για να πάρουμε το σωστά φωτισμένο χρώμα.

Λοιπόν, τι συμβαίνει όταν μια ακτίνα φωτός με κατεύθυνση από μια κατευθυντική ή σημειακή πηγή χτυπά το σημείο P κάποιου αντικειμένου στη σκηνή μας;

Διαισθητικά, μπορούμε να ταξινομήσουμε τα αντικείμενα σε δύο γενικές κατηγορίες με βάση το πώς συμπεριφέρονται με το φως: "ματ" και "γυαλιστερό". Δεδομένου ότι τα περισσότερα από τα αντικείμενα γύρω μας μπορούν να θεωρηθούν «ματ», θα ξεκινήσουμε με αυτά.

Διάχυτη σκέδαση

Όταν μια ακτίνα φωτός πέφτει πάνω σε ένα ματ αντικείμενο, λόγω της ανομοιομορφίας της επιφάνειάς του στο μικροσκοπικό επίπεδο, αντανακλά την ακτίνα στη σκηνή ομοιόμορφα προς όλες τις κατευθύνσεις, δηλαδή προκύπτει μια «σκεδαζόμενη» («διάχυτη») ανάκλαση .

Για να το επαληθεύσετε, κοιτάξτε προσεκτικά κάποιο ματ αντικείμενο, για παράδειγμα, έναν τοίχο: αν μετακινηθείτε κατά μήκος του τοίχου, το χρώμα του δεν αλλάζει. Δηλαδή, το φως που βλέπετε να ανακλάται από ένα αντικείμενο είναι το ίδιο ανεξάρτητα από το πού κοιτάξετε το αντικείμενο.

Από την άλλη πλευρά, η ποσότητα του ανακλώμενου φωτός εξαρτάται από τη γωνία μεταξύ της δέσμης φωτός και της επιφάνειας. Αυτό είναι διαισθητικά σαφές - η ενέργεια που μεταφέρεται από τη δέσμη, ανάλογα με τη γωνία, θα πρέπει να κατανέμεται σε μια μικρότερη ή μεγαλύτερη επιφάνεια, δηλαδή, η ενέργεια ανά μονάδα επιφάνειας που αντανακλάται στη σκηνή θα είναι υψηλότερη ή χαμηλότερη, αντίστοιχα:

Για να το εκφράσουμε μαθηματικά, ας χαρακτηρίσουμε τον προσανατολισμό μιας επιφάνειας από αυτόν κανονικό διάνυσμα. Ένα κανονικό διάνυσμα, ή απλά «κανονικό», είναι ένα διάνυσμα κάθετο στην επιφάνεια σε κάποιο σημείο. Είναι επίσης ένα μοναδιαίο διάνυσμα, δηλαδή το μήκος του είναι 1. Θα το ονομάσουμε αυτό το διάνυσμα .

Μοντελοποίηση διάχυτης ανάκλασης

Έτσι, μια ακτίνα φωτός με κατεύθυνση και φωτεινότητα πέφτει σε μια επιφάνεια με κανονική . Ποιο μέρος αντανακλάται πίσω στη σκηνή ως συνάρτηση του , και ;

Για μια γεωμετρική αναλογία, ας σκεφτούμε τη φωτεινότητα του φωτός ως το «πλάτος» της δέσμης. Η ενέργειά του κατανέμεται σε μια επιφάνεια μεγέθους. Όταν και έχουν την ίδια κατεύθυνση, δηλαδή, η δέσμη είναι κάθετη στην επιφάνεια, πράγμα που σημαίνει ότι η ενέργεια που ανακλάται ανά μονάδα επιφάνειας είναι ίση με την προσπίπτουσα ενέργεια ανά μονάδα επιφάνειας.< . С другой стороны, когда угол между и приближается к , приближается к , то есть энергия на единицу площади приближается к 0; . Но что происходит в промежутках?

Η κατάσταση φαίνεται στο παρακάτω διάγραμμα. Ξέρουμε, και? Πρόσθεσα γωνίες και , καθώς και κουκκίδες και , για να διευκολύνω τις σημειώσεις που σχετίζονται με αυτό το διάγραμμα.

Δεδομένου ότι τεχνικά μια δέσμη φωτός δεν έχει πλάτος, θα υποθέσουμε επομένως ότι όλα συμβαίνουν σε μια απειροελάχιστη επίπεδη περιοχή της επιφάνειας. Ακόμα κι αν είναι η επιφάνεια μιας σφαίρας, η εν λόγω περιοχή είναι τόσο απειροελάχιστη που είναι σχεδόν επίπεδη σε σχέση με το μέγεθος της σφαίρας, όπως ακριβώς η Γη εμφανίζεται επίπεδη σε μικρές κλίμακες.

Μια ακτίνα φωτός με πλάτος χτυπά μια επιφάνεια σε ένα σημείο υπό γωνία. Η κανονική σε ένα σημείο ισούται με , και η ενέργεια που μεταφέρεται από τη δέσμη κατανέμεται σε . Πρέπει να υπολογίσουμε.

Μία από τις γωνίες είναι ίση με , και η άλλη είναι ίση με . Τότε η τρίτη γωνία είναι ίση με . Πρέπει όμως να σημειωθεί ότι σχηματίζουν και ορθή γωνία, δηλαδή θα πρέπει επίσης να είναι . Ως εκ τούτου, :

Ας δούμε ένα τρίγωνο. Οι γωνίες του είναι ίσες με , και . Η πλευρά είναι ίση και η πλευρά είναι ίση.

Και τώρα... έρχεται να σώσει η τριγωνομετρία! A-priory ; αντικαθιστούμε με , και με , και παίρνουμε


αυτό που μετατρέπεται σε
Έχουμε σχεδόν τελειώσει. - είναι η γωνία μεταξύ και , δηλαδή, μπορεί να εκφραστεί ως
Και τελικά
Έτσι, έχουμε μια πολύ απλή εξίσωση που συσχετίζει το ανακλώμενο μέρος του φωτός με τη γωνία μεταξύ της κανονικής προς την επιφάνεια και της κατεύθυνσης του φωτός.

Σημειώστε ότι σε γωνίες μεγαλύτερη αξίαγίνεται αρνητικός. Εάν χρησιμοποιήσουμε αυτήν την τιμή χωρίς δισταγμό, το αποτέλεσμα θα είναι πηγές φωτός αφαιρετικόςφως. Αυτό δεν έχει κανένα φυσικό νόημα. μια μεγαλύτερη γωνία σημαίνει απλώς ότι το φως φτάνει στην πραγματικότητα πίσωεπιφάνεια, και δεν συμβάλλει στο φωτισμό του φωτιζόμενου σημείου. Δηλαδή, αν γίνει αρνητικό, τότε το θεωρούμε ίσο με .

Εξίσωση διάχυτης ανάκλασης

Μπορούμε τώρα να διατυπώσουμε μια εξίσωση για να υπολογίσουμε τη συνολική ποσότητα φωτός που λαμβάνεται από ένα σημείο με ένα κανονικό σε μια σκηνή με φωτεινότητα περιβάλλοντος και σημειακές ή κατευθυντικές πηγές φωτός με φωτεινότητα και διανύσματα φωτός είτε γνωστά (για κατευθυντικές πηγές) είτε υπολογισμένα για P (για σημειακές πηγές):
Αξίζει να επαναλάβουμε ξανά ότι οι όροι με τους οποίους δεν πρέπει να προστεθούν στον φωτισμό του σημείου.

Κανονικά σφαιρών

Το μόνο μικρό πράγμα που λείπει εδώ είναι από πού προέρχονται τα κανονικά;

Αυτή η ερώτηση είναι πολύ πιο περίπλοκη από όσο φαίνεται, όπως θα δούμε στο δεύτερο μέρος του άρθρου. Ευτυχώς, για την περίπτωση που εξετάζουμε υπάρχει μια πολύ απλή λύση: το κανονικό διάνυσμα οποιουδήποτε σημείου της σφαίρας βρίσκεται σε μια ευθεία γραμμή που διέρχεται από το κέντρο της σφαίρας. Δηλαδή, αν το κέντρο της σφαίρας είναι , τότε η κατεύθυνση της κανονικής προς το σημείο είναι ίση με:

Γιατί έγραψα «κανονική σκηνοθεσία» και όχι «κανονική»; Εκτός από το ότι είναι κάθετο στην επιφάνεια, το κανονικό πρέπει να είναι μοναδιαίο διάνυσμα. αυτό θα ίσχυε αν η ακτίνα της σφαίρας ήταν ίση με , κάτι που δεν ισχύει πάντα. Για να υπολογίσουμε την ίδια την κανονική, πρέπει να διαιρέσουμε το διάνυσμα με το μήκος του, λαμβάνοντας έτσι το μήκος:


Αυτό έχει ως επί το πλείστον θεωρητικό ενδιαφέρον επειδή η εξίσωση φωτισμού που γράφτηκε παραπάνω περιλαμβάνει τη διαίρεση με το , αλλά μια καλή προσέγγιση θα ήταν να δημιουργηθούν "αληθινοί" κανονικοί. Αυτό θα διευκολύνει τη δουλειά μας στο μέλλον.

Απόδοση με διάχυτη αντανάκλαση

Ας τα μεταφράσουμε όλα αυτά σε ψευδοκώδικα. Αρχικά, ας προσθέσουμε μερικά φώτα στη σκηνή:

Φως ( τύπος = ένταση περιβάλλοντος = 0,2 ) φως ( τύπος = ένταση σημείου = 0,6 θέση = (2, 1, 0) ) φως ( τύπος = κατευθυντική ένταση = 0,2 κατεύθυνση = (1, 4, 4) )
Σημειώστε ότι η φωτεινότητα συνοψίζεται εύκολα σε , επειδή η εξίσωση φωτισμού υποδηλώνει ότι κανένα σημείο δεν μπορεί να έχει φωτεινότητα φωτός μεγαλύτερη από μία. Αυτό σημαίνει ότι δεν θα καταλήξουμε σε περιοχές που είναι «εκτεθειμένες πάρα πολύ».

Η εξίσωση φωτισμού είναι αρκετά εύκολο να μετατραπεί σε ψευδοκώδικα:

ComputeLighting(P, N) ( i = 0,0 για το φως στη σκηνή. Φώτα ( αν είναι φως. τύπος == περιβάλλοντος ( i += φως. ένταση ) αλλιώς ( αν φως. τύπος == σημείο L = φως. θέση - P αλλιώς L = φως.κατεύθυνση n_dot_l = dot(N, L) εάν n_dot_l > 0 i += light.intensity*n_dot_l/(length(N)*length(L)) ) return i )
Και το μόνο που απομένει είναι να χρησιμοποιήσετε το ComputeLighting στο TraceRay. Θα αντικαταστήσουμε τη συμβολοσειρά που επιστρέφει το χρώμα της σφαίρας

Επιστροφή closest_sphere.color
σε αυτό το κομμάτι:

P = O + closest_t*D # υπολογισμός της τομής N = P - closest_sphere.center # υπολογισμός της κανονικής της σφαίρας στο σημείο τομής N = N / μήκος(N) επιστροφή closest_sphere.color*ComputeLighting(P, N)
Για πλάκα, ας προσθέσουμε μια μεγάλη κίτρινη σφαίρα:

Σφαίρα ( χρώμα = (255, 255, 0) # Κίτρινο κέντρο = (0, -5001, 0) ακτίνα = 5000 )
Ενεργοποιούμε το renderer, και ιδού, οι σφαίρες τελικά αρχίζουν να μοιάζουν με σφαίρες!

Αλλά περιμένετε, πώς η μεγάλη κίτρινη σφαίρα μετατράπηκε σε ένα επίπεδο κίτρινο πάτωμα;

Δεν ήταν έτσι, απλά είναι τόσο μεγάλη σε σχέση με τις άλλες τρεις, και η κάμερα είναι τόσο κοντά της που φαίνεται επίπεδη. Όπως ακριβώς ο πλανήτης μας φαίνεται επίπεδος όταν στεκόμαστε στην επιφάνειά του.

Αντανάκλαση από λεία επιφάνεια

Τώρα στρέφουμε την προσοχή μας στα «λαμπερά» αντικείμενα. Σε αντίθεση με τα «ματ» αντικείμενα, τα «λαμπερά» αντικείμενα αλλάζουν την εμφάνισή τους όταν τα κοιτάς από διαφορετικές γωνίες.

Ας πάρουμε μια μπάλα μπιλιάρδου ή ένα μόλις πλυμένο αυτοκίνητο. Αυτά τα αντικείμενα παρουσιάζουν ένα συγκεκριμένο μοτίβο διάδοσης φωτός, συνήθως με φωτεινές περιοχές που φαίνονται να κινούνται όταν περπατάτε γύρω τους. Σε αντίθεση με τα ματ αντικείμενα, το πώς αντιλαμβάνεστε την επιφάνεια αυτών των αντικειμένων εξαρτάται στην πραγματικότητα από την άποψή σας.

Σημειώστε ότι οι κόκκινες μπάλες του μπιλιάρδου παραμένουν κόκκινες αν κάνετε μερικά βήματα πίσω, αλλά οι φωτεινές Λευκή κηλίδα, δίνοντάς τους μια «λαμπερή» εμφάνιση, φαίνεται να συγκινείται. Αυτό σημαίνει ότι το νέο εφέ δεν αντικαθιστά τη διάχυτη ανάκλαση, αλλά τη συμπληρώνει.

Γιατί συμβαίνει αυτό? Μπορούμε να ξεκινήσουμε με το γιατί συμβαίνει αυτό Δενεμφανίζεται σε ματ αντικείμενα. Όπως είδαμε στο προηγούμενη ενότηταΌταν μια ακτίνα φωτός χτυπά την επιφάνεια ενός ματ αντικειμένου, διασκορπίζεται ομοιόμορφα πίσω στη σκηνή προς όλες τις κατευθύνσεις. Διαισθητικά, αυτό οφείλεται στην ανομοιομορφία της επιφάνειας του αντικειμένου, δηλαδή, στο μικροσκοπικό επίπεδο, μοιάζει με πολλές μικρές επιφάνειες που κατευθύνονται σε τυχαίες κατευθύνσεις:

Τι γίνεται όμως αν η επιφάνεια δεν είναι τόσο ανώμαλη; Ας πάρουμε το άλλο άκρο - έναν τέλεια γυαλισμένο καθρέφτη. Όταν μια ακτίνα φωτός χτυπά έναν καθρέφτη, αντανακλάται σε μία μόνο κατεύθυνση, η οποία είναι συμμετρική προς τη γωνία πρόσπτωσης σε σχέση με την κανονική του καθρέφτη. Αν ονομάσουμε την κατεύθυνση του ανακλώμενου φωτός και συμφωνήσουμε ότι δείχνει επίπηγή φωτός, έχουμε την ακόλουθη κατάσταση:

Ανάλογα με τον βαθμό «γυαλίσματος» της επιφάνειας, είναι λίγο πολύ σαν καθρέφτης. δηλαδή παίρνουμε αντανάκλαση «καθρέφτη» (specular reflection, από το λατινικό «speculum», δηλαδή «καθρέφτης»).

Για έναν τέλεια γυαλισμένο καθρέφτη, η προσπίπτουσα ακτίνα φωτός αντανακλάται σε μία μόνο κατεύθυνση. Αυτό είναι που μας επιτρέπει να βλέπουμε καθαρά αντικείμενα στον καθρέφτη: για κάθε προσπίπτουσα ακτίνα υπάρχει μία μόνο ανακλώμενη ακτίνα. Αλλά δεν είναι κάθε αντικείμενο τέλεια γυαλισμένο. Αν και τα περισσότερα απότο φως αντανακλάται προς την κατεύθυνση, μέρος του αντανακλάται σε κατευθύνσεις κοντά στο. όσο πιο κοντά στο , τόσο περισσότερο φως αντανακλάται προς αυτή την κατεύθυνση. Η "λαμπρότητα" ενός αντικειμένου καθορίζει πόσο γρήγορα μειώνεται το ανακλώμενο φως καθώς απομακρύνεται από:

Μας ενδιαφέρει να υπολογίσουμε πόσο φως αντανακλάται πίσω προς την οπτική μας γωνία (επειδή αυτό είναι το φως που χρησιμοποιούμε για να προσδιορίσουμε το χρώμα κάθε σημείου). Αν το "διάνυσμα προβολής" δείχνει από την κάμερα και είναι η γωνία μεταξύ και , τότε αυτό έχουμε:

Όταν αντανακλάται όλο το φως. Το φως δεν αντανακλάται. Όπως και με τη διάχυτη ανάκλαση, χρειαζόμαστε μια μαθηματική έκφραση για να προσδιορίσουμε τι συμβαίνει σε ενδιάμεσες τιμές του .

Προσομοίωση αντανάκλασης «καθρέφτη».

Θυμάστε πώς ανέφερα νωρίτερα ότι δεν βασίζονται όλα τα μοντέλα σε φυσικά μοντέλα; Λοιπόν, εδώ είναι ένα παράδειγμα αυτού. Το παρακάτω μοντέλο είναι αυθαίρετο, αλλά χρησιμοποιείται επειδή είναι εύκολο να υπολογιστεί και φαίνεται καλό.

Ας το πάρουμε. Έχει καλές ιδιότητες: , , και οι τιμές μειώνονται σταδιακά από έως κατά μήκος μιας πολύ όμορφης καμπύλης:

Πληροί όλες τις απαιτήσεις για τη λειτουργία καθρέφτη, οπότε γιατί να μην το χρησιμοποιήσετε;

Μας λείπει όμως μια ακόμη λεπτομέρεια. Σε αυτή τη σύνθεση, όλα τα αντικείμενα λάμπουν εξίσου. Πώς να αλλάξετε την εξίσωση για να πάρετε διάφορους βαθμούςλάμψη?

Μην ξεχνάτε ότι αυτή η γυαλάδα είναι ένα μέτρο του πόσο γρήγορα μειώνεται η συνάρτηση ανάκλασης καθώς αυξάνετε. Ένας πολύ απλός τρόπος για να αποκτήσετε διαφορετικές καμπύλες φωτός είναι να υπολογίσετε την ισχύ κάποιου θετικού εκθέτη. Δεδομένου ότι , είναι προφανές ότι ? δηλαδή, συμπεριφέρεται ακριβώς όπως, μόνο «ήδη». Εδώ για διαφορετικές έννοιες :

Όσο μεγαλύτερη είναι η τιμή, τόσο πιο «στενό» γίνεται το χαρακτηριστικό στη γειτονιά του , και τόσο πιο λαμπερό εμφανίζεται το αντικείμενο.

Συνήθως καλείται δείκτης ανάκλασης, και είναι ιδιότητα της επιφάνειας. Δεδομένου ότι το μοντέλο δεν βασίζεται στη φυσική πραγματικότητα, οι τιμές μπορούν να προσδιοριστούν μόνο με δοκιμή και σφάλμα, δηλαδή προσαρμόζοντας τις τιμές μέχρι να αρχίσουν να φαίνονται "φυσικές" (Σημείωση: για να χρησιμοποιήσετε ένα μοντέλο που βασίζεται στη φυσική, δείτε τη συνάρτηση ανάκλασης δύο ακτίνων (DRF) )).

Ας τα βάλουμε όλα μαζί. Η δέσμη πέφτει στην επιφάνεια σε σημείο όπου η κανονική είναι ίση με και ο δείκτης ανάκλασης είναι . Πόσο φως θα αντανακλάται στην κατεύθυνση θέασης;

Έχουμε ήδη αποφασίσει ότι αυτή η τιμή είναι ίση με , όπου είναι η γωνία μεταξύ και , η οποία με τη σειρά της αντανακλάται σε σχέση με . Δηλαδή, το πρώτο βήμα θα είναι ο υπολογισμός από και .

Μπορούμε να αποσυντεθεί σε δύο διανύσματα και , έτσι ώστε , όπου είναι παράλληλη και κάθετη:

Αυτή είναι μια προβολή στο ? από τις ιδιότητες του βαθμωτού προϊόντος και με βάση το γεγονός ότι, το μήκος αυτής της προβολής είναι ίσο με . Έχουμε καθορίσει ότι θα είναι παράλληλη, επομένως .

Γιατί μπορούμε να το πάρουμε αμέσως.

Τώρα ας δούμε ? δεδομένου ότι είναι συμμετρικό για , η παράλληλη συνιστώσα του είναι ίδια με αυτή του , και η κάθετη συνιστώσα του είναι αντίθετη με αυτή του ? αυτό είναι :

Αντικαθιστώντας τις εκφράσεις που λήφθηκαν νωρίτερα, παίρνουμε


και απλοποιώντας λίγο, παίρνουμε

Η έννοια της αντανάκλασης «καθρέφτη».

Τώρα είμαστε έτοιμοι να γράψουμε την εξίσωση ανάκλασης «καθρέφτη»:

Όπως και με τον διάχυτο φωτισμό, αυτό μπορεί να είναι αρνητικό και πάλι θα πρέπει να το αγνοήσουμε. Επίσης, δεν χρειάζεται κάθε αντικείμενο να είναι γυαλιστερό. για τέτοια αντικείμενα (τα οποία θα αναπαραστήσουμε μέσω ) η τιμή "specularity" δεν θα υπολογιστεί καθόλου.

Απόδοση με αντανακλάσεις «καθρέφτη».

Ας προσθέσουμε στη σκηνή τις αντανακλάσεις «καθρέφτη» που έχουμε δουλέψει. Αρχικά, ας κάνουμε μερικές αλλαγές στην ίδια τη σκηνή:

Σφαίρα ( κέντρο = (0, -1, 3) ακτίνα = 1 χρώμα = (255, 0, 0) # Κόκκινη κατοπτρική = 500 # Γυαλιστερή ) σφαίρα ( κέντρο = (-2, 1, 3) ακτίνα = 1 χρώμα = ( 0, 0, 255) # Μπλε κατοπτρικό = 500 # Γυαλιστερό ) σφαίρα ( κέντρο = (2, 1, 3) ακτίνα = 1 χρώμα = (0, 255, 0) # Πράσινο κατοπτρικό = 10 # Λίγο γυαλιστερό ) σφαίρα ( χρώμα = (255, 255, 0) # Κίτρινο κέντρο = (0, -5001, 0) ακτίνα = 5000 κατοπτρική = 1000 # Πολύ γυαλιστερό )
Στον κώδικα, πρέπει να αλλάξουμε το ComputeLighting έτσι ώστε να υπολογίζει την τιμή "specularity" εάν χρειάζεται και να την προσθέτει στον συνολικό φωτισμό. Σημειώστε ότι τώρα απαιτεί και:

ComputeLighting(P, N, V, s) ( i = 0,0 για φως στη σκηνή. Φώτα ( εάν φως. τύπος == περιβάλλοντος ( i += φως. ένταση ) αλλιώς ( αν φως. τύπος == σημείο L = φως. θέση - P other L = light.direction # Diffuse n_dot_l = dot(N, L) if n_dot_l > 0 i += light.intensity*n_dot_l/(length(N)*length(L)) # Specularity if s != -1 ( R = 2*N*dot(N, L) - L r_dot_v = dot(R, V) εάν r_dot_v >
Τέλος, πρέπει να αλλάξουμε το TraceRay ώστε να περάσει τις νέες παραμέτρους ComputeLighting. φανερός; λαμβάνεται από τα δεδομένα της σφαίρας. Τι γίνεται όμως; είναι ένα διάνυσμα που δείχνει από το αντικείμενο προς την κάμερα. Ευτυχώς, στο TraceRay έχουμε ήδη ένα διάνυσμα που κατευθύνεται από την κάμερα στο αντικείμενο - αυτή είναι η κατεύθυνση της ανιχνευόμενης ακτίνας! Δηλαδή είναι απλό.

Εδώ είναι ο νέος κώδικας TraceRay με αντανάκλαση "καθρέφτη":

TraceRay(O, D, t_min, t_max) ( closest_t = inf closest_sphere = NULL για σφαίρα στη σκηνή. Spheres ( t1, t2 = IntersectRaySphere (O, D, sphere) εάν t1 in και t1< closest_t closest_t = t1 closest_sphere = sphere if t2 in and t2 < closest_t closest_t = t2 closest_sphere = sphere } if closest_sphere == NULL return BACKGROUND_COLOR P = O + closest_t*D # Вычисление пересечения N = P - closest_sphere.center # Вычисление нормали сферы в точке пересечения N = N / length(N) return closest_sphere.color*ComputeLighting(P, N, -D, sphere.specular) }
Και εδώ είναι η ανταμοιβή μας για όλη αυτή την ταχυδακτυλουργία με διανύσματα:

Σκιές

Όπου υπάρχει φως και αντικείμενα πρέπει να υπάρχουν και σκιές. Πού είναι λοιπόν οι σκιές μας;

Ας ξεκινήσουμε με μια πιο θεμελιώδη ερώτηση. Γιατί πρέπεινα είναι σκιές; Οι σκιές εμφανίζονται όπου υπάρχει φως, αλλά οι ακτίνες του δεν μπορούν να φτάσουν στο αντικείμενο επειδή υπάρχει άλλο αντικείμενο στο πέρασμά τους.

Θα παρατηρήσετε ότι στην προηγούμενη ενότητα μας ενδιέφεραν οι γωνίες και τα διανύσματα, αλλά εξετάσαμε μόνο την πηγή φωτός και το σημείο που πρέπει να χρωματίσουμε και αγνοήσαμε εντελώς οτιδήποτε άλλο συμβαίνει στη σκηνή - όπως ένα αντικείμενο που μπαίνει μέσα ο ΤΡΟΠΟΣ.

Αντίθετα πρέπει να προσθέσουμε κάποια λογική που λέει " εάν υπάρχει ένα αντικείμενο μεταξύ του σημείου και της πηγής, τότε δεν χρειάζεται να προσθέσετε φωτισμό που προέρχεται από αυτήν την πηγή".

Θέλουμε να επισημάνουμε δύο επόμενες περιπτώσεις:

Φαίνεται ότι έχουμε όλα τα εργαλεία που χρειαζόμαστε για να το κάνουμε αυτό.

Ας ξεκινήσουμε με την πηγή κατεύθυνσης. Ξέρουμε ; αυτό είναι το σημείο που μας ενδιαφέρει. Ξέρουμε ; αυτό είναι μέρος της αναγνώρισης της πηγής φωτός. Έχοντας και , μπορούμε να ορίσουμε μια ακτίνα, δηλαδή , η οποία περνά από ένα σημείο σε μια απείρως μακρινή πηγή φωτός. Αυτή η ακτίνα τέμνει άλλο αντικείμενο; Αν όχι, τότε δεν υπάρχει τίποτα μεταξύ του σημείου και της πηγής, δηλαδή μπορούμε να υπολογίσουμε τον φωτισμό από αυτή την πηγή και να τον προσθέσουμε στον συνολικό φωτισμό. Εάν διασταυρωθεί, τότε αγνοούμε αυτήν την πηγή.

Γνωρίζουμε ήδη πώς να υπολογίσουμε την πλησιέστερη τομή μεταξύ μιας ακτίνας και μιας σφαίρας. το χρησιμοποιούμε για να εντοπίσουμε ακτίνες από την κάμερα. Μπορούμε και πάλι να το χρησιμοποιήσουμε για να υπολογίσουμε την πλησιέστερη τομή μεταξύ της ακτίνας φωτός και της υπόλοιπης σκηνής.

Ωστόσο, οι παράμετροι είναι ελαφρώς διαφορετικές. Αντί να ξεκινούν από την κάμερα, οι ακτίνες εκπέμπονται από το . Η σκηνοθεσία δεν είναι , αλλά . Και μας ενδιαφέρουν οι διασταυρώσεις με τα πάντα μετά σε άπειρη απόσταση? αυτό σημαίνει ότι και .

Μπορούμε να αντιμετωπίσουμε τις σημειακές πηγές με πολύ παρόμοιο τρόπο, με δύο εξαιρέσεις. Πρώτον, δεν προσδιορίζεται, αλλά είναι πολύ εύκολο να υπολογιστεί από τη θέση πηγής και . Δεύτερον, μας ενδιαφέρουν τυχόν διασταυρώσεις που ξεκινούν από , αλλά μόνο μέχρι (αλλιώς, αντικείμενα πίσωη πηγή φωτός θα μπορούσε να δημιουργήσει σκιές!). δηλαδή στην προκειμένη περίπτωση και .

Υπάρχει μια ακραία περίπτωση που πρέπει να εξετάσουμε. Ας πάρουμε ένα δοκάρι. Αν ψάξουμε για διασταυρώσεις που ξεκινούν από το , τότε πιθανότατα θα βρούμε στο , γιατί πραγματικά βρίσκεται στη σφαίρα, και ; Με άλλα λόγια, κάθε αντικείμενο θα ρίξει σκιές στον εαυτό του (Σημείωση: πιο συγκεκριμένα, θέλουμε να αποφύγουμε μια κατάσταση στην οποία ένα σημείο, και όχι ολόκληρο το αντικείμενο, ρίχνει μια σκιά στον εαυτό του· ένα αντικείμενο με σχήμα πιο περίπλοκο από μια σφαίρα (δηλαδή οποιοδήποτε κοίλο αντικείμενο) μπορεί να ρίξει αληθινές σκιές στον εαυτό του!

Ο απλούστερος τρόπος για να το αντιμετωπίσετε είναι να χρησιμοποιήσετε το small ως το κάτω όριο αντί για το . Γεωμετρικά, θέλουμε να βεβαιωθούμε ότι η ακτίνα ξεκινά ελαφρώς μακριά από την επιφάνεια, δηλαδή κοντά στο , αλλά όχι ακριβώς στο . Δηλαδή, για κατευθυντικές πηγές το διάστημα θα είναι , και για σημειακές πηγές - .

Απόδοση με σκιές

Ας το μετατρέψουμε σε ψευδοκώδικα.

ΣΕ προηγούμενη έκδοσηΤο TraceRay υπολόγισε την πλησιέστερη τομή ακτίνας-σφαίρας και στη συνέχεια υπολόγισε τον φωτισμό στη διασταύρωση. Πρέπει να εξαγάγουμε τον πλησιέστερο κωδικό τομής γιατί θέλουμε να τον χρησιμοποιήσουμε ξανά για να υπολογίσουμε τις σκιές:

ClosestIntersection(O, D, t_min, t_max) ( closest_t = inf closest_sphere = NULL για σφαίρα στη σκηνή. Spheres ( t1, t2 = IntersectRaySphere(O, D, sphere) εάν t1 in και t1< closest_t closest_t = t1 closest_sphere = sphere if t2 in and t2 < closest_t closest_t = t2 closest_sphere = sphere } return closest_sphere, closest_t }
Ως αποτέλεσμα, το TraceRay είναι πολύ πιο απλό:

TraceRay(O, D, t_min, t_max) ( κοντινότερη_σφαίρα, πλησιέστερη_t = Κοντινή τομή(O, D, t_min, t_max) εάν η πλησιέστερη_σφαίρα == NULL επιστροφή BACKGROUND_COLOR P = O + πλησιέστερη_t*D # Υπολογισμός τομής N = P - πλησιέστερη #_sp. Υπολογισμός κανονικής σφαίρας στη διασταύρωση N = N / μήκος(Ν) επιστροφή closest_sphere.color*ComputeLighting(P, N, -D, sphere.specular) )
Τώρα πρέπει να προσθέσουμε έναν έλεγχο σκιών στο ComputeLighting:

ComputeLighting(P, N, V, s) ( i = 0,0 για το φως στη σκηνή. Φώτα ( εάν φως. τύπος == περιβάλλοντος ( i += φως. ένταση ) αλλιώς ( αν φως. τύπος == σημείο ( L = φως. θέση - P t_max = 1 ) other ( L = light.direction t_max = inf ) # Check shadow shadow_sphere, shadow_t = ClosestIntersection(P, L, 0.001, t_max) if shadow_sphere != NULL συνέχεια # Diffusion n_dot_l = dot ) αν n_dot_l > 0 i += light.intensity*n_dot_l/(length(N)*length(L)) # Specularity if s != -1 ( R = 2*N*dot(N, L) - L r_dot_v = τελεία(R, V) εάν r_dot_v > 0 i += φως.ένταση*pow(r_dot_v/(length(R)*length(V)), s) ) ) ) επιστροφή i )
Έτσι θα μοιάζει η ανανεωμένη σκηνή μας:


Πηγαίος κώδικας και λειτουργική επίδειξη >>

ΤώραΚάτι κάνουμε ήδη.

Αντανάκλαση

Έχουμε γυαλιστερά αντικείμενα. Είναι όμως δυνατόν να δημιουργηθούν αντικείμενα που στην πραγματικότητα συμπεριφέρονται σαν καθρέφτες; Φυσικά, η εφαρμογή τους σε έναν ανιχνευτή ακτίνων είναι στην πραγματικότητα πολύ απλή, αλλά μπορεί να φαίνεται μπερδεμένη στην αρχή.

Ας δούμε πώς λειτουργούν οι καθρέφτες. Όταν κοιταζόμαστε σε έναν καθρέφτη, βλέπουμε ακτίνες φωτός που αντανακλώνται από τον καθρέφτη. Οι ακτίνες φωτός αντανακλώνται συμμετρικά σε σχέση με την κανονική επιφάνεια:

Ας υποθέσουμε ότι ανιχνεύουμε μια ακτίνα και η πλησιέστερη τομή είναι ένας καθρέφτης. Τι χρώμα έχει η ακτίνα φωτός; Προφανώς, δεν είναι το χρώμα του καθρέφτη, αλλά οποιοδήποτε χρώμα έχει η ανακλώμενη ακτίνα. Το μόνο που χρειάζεται να κάνουμε είναι να υπολογίσουμε την κατεύθυνση της ανακλώμενης ακτίνας και να καταλάβουμε ποιο ήταν το χρώμα του φωτός που προέρχεται από αυτή την κατεύθυνση. Αν είχαμε μια συνάρτηση που επέστρεφε, για μια δεδομένη ακτίνα, το χρώμα του φωτός που έπεφτε από αυτή την κατεύθυνση...

Ω, περιμένετε, έχουμε ένα: λέγεται TraceRay.

Ξεκινάμε λοιπόν με τον κύριο βρόχο TraceRay για να δούμε τι «βλέπει» η ακτίνα που εκπέμπεται από την κάμερα. Εάν το TraceRay προσδιορίσει ότι η ακτίνα βλέπει ένα ανακλαστικό αντικείμενο, τότε απλά πρέπει να υπολογίσει την κατεύθυνση της ανακλώμενης ακτίνας και να καλέσει τον εαυτό του...

Σε αυτό το σημείο, προτείνω να ξαναδιαβάσετε τις τρεις τελευταίες παραγράφους μέχρι να τις καταλάβετε. Εάν αυτή είναι η πρώτη φορά που διαβάζετε για την αναδρομική ανίχνευση ακτίνων, ίσως χρειαστεί να το διαβάσετε μερικές φορές και να σκεφτείτε λίγο πριν θα καταλάβεις.

Πάρτε το χρόνο σας, θα περιμένω.

Τώρα που η ευφορία αυτής της υπέροχης στιγμής Εύρηκα!κοιμήθηκε λίγο, ας το επισημοποιήσουμε λίγο.

Το πιο σημαντικό πράγμα σε όλους τους αναδρομικούς αλγόριθμους είναι να αποτρέψετε έναν άπειρο βρόχο. Αυτός ο αλγόριθμος έχει μια προφανή συνθήκη εξόδου: όταν η δέσμη είτε χτυπά ένα μη ανακλαστικό αντικείμενο, είτε όταν δεν χτυπά τίποτα. Αλλά υπάρχει μια απλή περίπτωση στην οποία μπορούμε να παγιδευτούμε σε έναν άπειρο βρόχο: το εφέ ατελείωτος διάδρομος. Εκδηλώνεται όταν βάζεις έναν καθρέφτη μπροστά από έναν άλλο καθρέφτη και βλέπεις ατελείωτα αντίγραφα του εαυτού σου σε αυτόν!

Υπάρχουν πολλοί τρόποι για να αποφευχθεί αυτό το πρόβλημα. Θα μπούμε όριο αναδρομήςαλγόριθμος; θα ελέγχει το «βάθος» στο οποίο μπορεί να φτάσει. Ας το ονομάσουμε. Όταν , βλέπουμε αντικείμενα, αλλά χωρίς αντανακλάσεις. Όταν βλέπουμε κάποια αντικείμενα και αντανακλάσεις κάποιων αντικειμένων. Όταν βλέπουμε κάποια αντικείμενα, αντανακλάσεις κάποιων αντικειμένων και αντανακλάσεις κάποιων αντανακλάσεων κάποιων αντικειμένων. Και ούτω καθεξής. Σε γενικές γραμμές, όχι ιδιαίτερο νόημαπηγαίνετε πιο βαθιά από 2-3 επίπεδα, γιατί σε αυτό το στάδιο η διαφορά είναι ελάχιστα αισθητή.

Θα δημιουργήσουμε μια άλλη διάκριση. Το "ανακλαστικότητα" δεν χρειάζεται να σημαίνει "ναι ή όχι" - τα αντικείμενα μπορεί να είναι εν μέρει αντανακλαστικά και εν μέρει έγχρωμα. Θα αντιστοιχίσουμε σε κάθε επιφάνεια έναν αριθμό από έως , ο οποίος καθορίζει την ανακλαστικότητά της. Στη συνέχεια θα αναμίξουμε το τοπικά φωτισμένο χρώμα και το ανακλώμενο χρώμα σε αναλογία με αυτόν τον αριθμό.

Τέλος, πρέπει να αποφασίσουμε ποιες παραμέτρους θα πρέπει να λάβει η αναδρομική κλήση στο TraceRay; Η ακτίνα ξεκινά από την επιφάνεια του αντικειμένου, ένα σημείο. Η κατεύθυνση της ακτίνας είναι η κατεύθυνση του φωτός που ανακλάται από το ? στο TraceRay έχουμε , δηλαδή την κατεύθυνση από την κάμερα προς , αντίθετη από την κίνηση του φωτός, δηλαδή η κατεύθυνση της ανακλώμενης ακτίνας θα ανακλάται σε σχέση με το . Παρόμοια με αυτό που συμβαίνει με τις σκιές, δεν θέλουμε τα αντικείμενα να αντανακλούν τον εαυτό τους, οπότε . Θέλουμε να βλέπουμε αντικείμενα να αντανακλώνται όσο μακριά κι αν βρίσκονται, οπότε . Και τέλος, το όριο αναδρομής είναι ένα λιγότερο από το όριο αναδρομής στο οποίο βρισκόμαστε αυτήν τη στιγμή.

Απόδοση με προβληματισμό

Ας προσθέσουμε την αντανάκλαση στον κώδικα ανίχνευσης ακτίνων.

Όπως και πριν, πρώτα από όλα αλλάζουμε το σκηνικό:

Σφαίρα ( κέντρο = (0, -1, 3) ακτίνα = 1 χρώμα = (255, 0, 0) # Κόκκινο κατοπτρικό = 500 # Λαμπερό ανακλαστικό = 0,2 # Ελαφρώς ανακλαστική ) σφαίρα ( κέντρο = (-2, 1, 3) ακτίνα = 1 χρώμα = (0, 0, 255) # Μπλε κατοπτρικό = 500 # Λαμπερή ανακλαστική = 0,3 # Ελαφρώς πιο ανακλαστική ) σφαίρα ( κέντρο = (2, 1, 3) ακτίνα = 1 χρώμα = (0, 255, 0) # Πράσινο κατοπτρικό = 10 # Λίγο γυαλιστερό ανακλαστικό = 0,4 # Ακόμα πιο ανακλαστική ) σφαίρα ( χρώμα = (255, 255, 0) # Κίτρινο κέντρο = (0, -5001, 0) ακτίνα = 5000 κατοπτρική = 1000 # Πολύ γυαλιστερή ανακλαστική = 0,5# Μισό ανακλαστικό)
Χρησιμοποιούμε τη φόρμουλα "ακτίνα ανάκλασης" σε μερικά σημεία, ώστε να μπορούμε να την ξεφορτωθούμε. Λαμβάνει την ακτίνα και την κανονική, επιστρέφοντας την ανακλώμενη σχετική:

ReflectRay(R, N) ( return 2*N*dot(N, R) - R; )
Η μόνη αλλαγή στο ComputeLighting είναι η αντικατάσταση της εξίσωσης ανάκλασης με μια κλήση σε αυτό το νέο ReflectRay.

Έγινε μια μικρή αλλαγή στην κύρια μέθοδο - πρέπει να περάσουμε το όριο αναδρομής στο TraceRay ανώτατου επιπέδου:

Χρώμα = TraceRay(O, D, 1, inf, recursion_depth)
Η σταθερά recursion_depth μπορεί να οριστεί λογική αξία, για παράδειγμα 3 ή 5.

Οι μόνες σημαντικές αλλαγές συμβαίνουν κοντά στο τέλος του TraceRay, όπου υπολογίζουμε αναδρομικά τις αντανακλάσεις:

TraceRay(O, D, t_min, t_max, depth) ( closest_sphere, closest_t = ClosestTemsection(O, D, t_min, t_max) if closest_sphere == NULL επιστροφή BACKGROUND_COLOR # Υπολογισμός τοπικού χρώματος P = O + πλησιέστερη_t*D σημείο # Υπολογισμός = P - closest_sphere.center # Υπολογίστε την κανονική στη σφαίρα στο σημείο τομής N = N / μήκος(N) local_color = closest_sphere.color*ComputeLighting(P, N, -D, sphere.specular) # Αν έχουμε φτάσει στο όριο αναδρομής ή το αντικείμενο δεν είναι ανακλαστικό, τότε τελειώσαμε r = closest_sphere.reflective εάν το βάθος<= 0 or r <= 0: return local_color # Вычисление отражённого цвета R = ReflectRay(-D, N) reflected_color = TraceRay(P, R, 0.001, inf, depth - 1) return local_color*(1 - r) + reflected_color*r }
Αφήστε τα αποτελέσματα να μιλήσουν από μόνα τους:

Για να κατανοήσουμε καλύτερα το όριο βάθους αναδρομής, ας ρίξουμε μια πιο προσεκτική ματιά στην απόδοση με:

Και εδώ είναι η ίδια μεγέθυνση της ίδιας σκηνής, αυτή τη φορά που αποδίδεται με:

Όπως μπορείτε να δείτε, η διαφορά είναι αν βλέπουμε αντανακλάσεις αντανακλάσεων αντικειμένων ή μόνο αντανακλάσεις αντικειμένων.

Προσαρμοσμένη κάμερα

Στην αρχή της συζήτησής μας για την ανίχνευση ακτίνων, κάναμε δύο σημαντικές υποθέσεις: η κάμερα είναι στερεωμένη και στραμμένη προς την πλευρά της, και η κατεύθυνση "επάνω" είναι . Σε αυτήν την ενότητα, θα απαλλαγούμε από αυτούς τους περιορισμούς, ώστε να μπορούμε να τοποθετήσουμε την κάμερα οπουδήποτε στη σκηνή και να την στρέψουμε προς οποιαδήποτε κατεύθυνση.

Ας ξεκινήσουμε με τη θέση. Ίσως έχετε παρατηρήσει ότι χρησιμοποιείται μόνο μία φορά σε ολόκληρο τον ψευδοκώδικα: ως το σημείο εκκίνησης των ακτίνων που εκπέμπονται από την κάμερα στη μέθοδο ανώτατου επιπέδου. Αν θέλουμε να αλλάξουμε τη θέση της κάμερας. Οτι το μόνο πράγμααυτό που πρέπει να κάνετε είναι να χρησιμοποιήσετε διαφορετική τιμή για το .

Επηρεάζει η αλλαγή προμήθειεςεπί κατεύθυνσηακτίνες; Όχι με κανέναν τρόπο. Η κατεύθυνση των ακτίνων είναι το διάνυσμα που περνά από την κάμερα στο επίπεδο προβολής. Όταν μετακινούμε την κάμερα, το επίπεδο προβολής κινείται μαζί με την κάμερα, δηλαδή οι σχετικές τους θέσεις δεν αλλάζουν.

Ας στρέψουμε τώρα την προσοχή μας στην κατεύθυνση. Ας υποθέσουμε ότι έχουμε έναν πίνακα περιστροφής που περιστρέφεται προς την επιθυμητή κατεύθυνση προβολής και - προς την επιθυμητή κατεύθυνση "επάνω" (και επειδή αυτός είναι ένας πίνακας περιστροφής, εξ ορισμού πρέπει να κάνει αυτό που απαιτείται για το ). ΘέσηΗ κάμερα δεν αλλάζει αν απλώς περιστρέψετε την κάμερα. Αλλά η κατεύθυνση αλλάζει, απλώς υφίσταται την ίδια περιστροφή με ολόκληρη την κάμερα. Δηλαδή, αν έχουμε μια κατεύθυνση και έναν πίνακα περιστροφής, τότε η περιστροφή είναι απλή.

Αλλάζει μόνο η λειτουργία ανώτατου επιπέδου:

Για x σε [-Cw/2, Cw/2] ( για y σε [-Ch/2, Ch/2] ( D = camera.rotation * CanvasToViewport(x, y) color = TraceRay(camera.position, D, 1, inf) καμβάς. PutPixel(x, y, χρώμα) )
Έτσι φαίνεται η σκηνή μας όταν την βλέπουμε από διαφορετική θέση και προσανατολισμό:

Πού να πάτε μετά

Θα τελειώσουμε το πρώτο μέρος της εργασίας με μια σύντομη επισκόπηση ορισμένων ενδιαφέροντων θεμάτων που δεν έχουμε διερευνήσει.

Βελτιστοποίηση

Όπως αναφέρθηκε στην εισαγωγή, εξετάζαμε τον πιο κατανοητό τρόπο για να εξηγήσουμε και να εφαρμόσουμε τις διάφορες δυνατότητες. Επομένως, ο ανιχνευτής ακτίνων είναι πλήρως λειτουργικός, αλλά όχι ιδιαίτερα γρήγορος. Εδώ είναι μερικές ιδέες που μπορείτε να εξερευνήσετε μόνοι σας για να επιταχύνετε τον ιχνηλάτη σας. Για πλάκα, δοκιμάστε να μετρήσετε τον χρόνο εκτέλεσης πριν και μετά την εφαρμογή τους. Θα εκπλαγείτε πολύ!

Παραλληλισμός

Ο πιο προφανής τρόπος για να επιταχύνετε έναν ιχνηλάτη ακτίνων είναι να ανιχνεύσετε πολλές ακτίνες ταυτόχρονα. Δεδομένου ότι κάθε ακτίνα που εκπέμπεται από την κάμερα είναι ανεξάρτητη από όλες τις άλλες και οι περισσότερες δομές είναι μόνο για ανάγνωση, μπορούμε να εντοπίσουμε μία ακτίνα σε κάθε πυρήνα της CPU χωρίς μεγάλη δυσκολία ή πολυπλοκότητα λόγω προβλημάτων χρονισμού.

Στην πραγματικότητα, οι ανιχνευτές ακτίνων ανήκουν σε μια κατηγορία αλγορίθμων που ονομάζονται εξαιρετικά παραλληλισμόςακριβώς επειδή η ίδια η φύση τους καθιστά πολύ εύκολο τον παραλληλισμό τους.

Προσωρινή αποθήκευση τιμών

Εξετάστε τις τιμές που υπολογίζονται από το IntersectRaySphere, όπου ο ανιχνευτής ακτίνων συνήθως περνά τον περισσότερο χρόνο του:

K1 = dot(D, D) k2 = 2*dot(OC, D) k3 = dot(OC, OC) - r*r
Μερικές από αυτές τις τιμές είναι σταθερές σε όλη τη σκηνή - μόλις μάθετε πώς είναι τοποθετημένες οι σφαίρες, το r*r και το dot(OC, OC) δεν αλλάζουν πια. Μπορείτε να τα υπολογίσετε μία φορά κατά τη φόρτωση σκηνής και να τα αποθηκεύσετε στις ίδιες τις σφαίρες. θα πρέπει απλώς να τα μετρήσετε εάν οι σφαίρες πρέπει να μετακινηθούν στο επόμενο πλαίσιο. Το dot(D, D) είναι μια σταθερά για μια δεδομένη ακτίνα, επομένως μπορείτε να την υπολογίσετε στην ClosestIntersection και να την περάσετε στο IntersectRaySphere.

Σκιώδεις βελτιστοποιήσεις

Εάν ένα σημείο σε ένα αντικείμενο βρίσκεται σε σκιά σε σχέση με την πηγή φωτός επειδή ένα άλλο αντικείμενο ανιχνεύεται στην πορεία, τότε υπάρχει μεγάλη πιθανότητα το σημείο που βρίσκεται δίπλα του να είναι επίσης σε σκιά σε σχέση με την πηγή φωτός λόγω του ίδιου αντικειμένου ( αυτό ονομάζεται συνοχή των σκιών):

Δηλαδή, όταν ψάχνουμε για αντικείμενα μεταξύ ενός σημείου και μιας φωτεινής πηγής, μπορούμε πρώτα να ελέγξουμε αν το τελευταίο αντικείμενο που έβαλε σκιά στο προηγούμενο σημείο σε σχέση με την ίδια πηγή φωτός ρίχνει σκιά στο τρέχον σημείο. Αν ναι, τότε μπορούμε να τελειώσουμε. Εάν όχι, τότε απλώς συνεχίζουμε να ελέγχουμε τα υπόλοιπα αντικείμενα με τον συνηθισμένο τρόπο.

Ομοίως, κατά τον υπολογισμό της τομής μεταξύ μιας ακτίνας φωτός και των αντικειμένων στη σκηνή, δεν χρειαζόμαστε στην πραγματικότητα την πλησιέστερη τομή - απλώς γνωρίζοντας ότι υπάρχει τουλάχιστον μία τομή. Μπορούμε να χρησιμοποιήσουμε μια ειδική έκδοση του ClosestIntersection που επιστρέφει το αποτέλεσμα μόλις βρει την πρώτη τομή (και για αυτό πρέπει να υπολογίσουμε και να επιστρέψουμε όχι closest_t, αλλά απλώς μια τιμή boolean).

Χωρικές δομές

Ο υπολογισμός της τομής της ακτίνας με κάθε σφαίρα είναι μια αρκετά μεγάλη σπατάλη πόρων. Υπάρχουν πολλές δομές δεδομένων που σας επιτρέπουν να απορρίπτετε ολόκληρες ομάδες αντικειμένων με μία κίνηση χωρίς να χρειάζεται να υπολογίζετε μεμονωμένες διασταυρώσεις.

Μια λεπτομερής εξέταση τέτοιων δομών είναι πέρα ​​από το πεδίο του άρθρου μας, αλλά η γενική ιδέα είναι η εξής: ας υποθέσουμε ότι έχουμε πολλές σφαίρες κοντά η μία στην άλλη. Μπορούμε να υπολογίσουμε το κέντρο και την ακτίνα της μικρότερης σφαίρας που περιέχει όλες αυτές τις σφαίρες. Εάν η ακτίνα δεν τέμνει αυτήν την οριακή σφαίρα, τότε μπορείτε να είστε σίγουροι ότι δεν τέμνει καμία περιεχόμενη σφαίρα και αυτό μπορεί να γίνει σε έναν έλεγχο τομής. Φυσικά, αν τέμνει μια σφαίρα, τότε πρέπει ακόμα να ελέγξουμε αν τέμνει κάποια από τις σφαίρες που περιέχει.

Μπορείτε να μάθετε περισσότερα σχετικά με αυτό διαβάζοντας σχετικά ιεραρχία οριοθετημένων όγκων.

Μείωση δειγματοληψίας

Εδώ είναι ένας απλός τρόπος για να κάνετε έναν ιχνηθέτη ακτίνων γρηγορότερο: υπολογίστε φορές λιγότερα pixel!

Ας υποθέσουμε ότι ανιχνεύουμε ακτίνες για pixel και , και πέφτουν σε ένα αντικείμενο. Μπορείτε λογικά να υποθέσετε ότι η ακτίνα για το pixel θα πέσει επίσης στο ίδιο αντικείμενο, να παραλείψετε την αρχική αναζήτηση για διασταυρώσεις με ολόκληρη τη σκηνή και να προχωρήσετε απευθείας στον υπολογισμό του χρώματος σε αυτό το σημείο.

Εάν το κάνετε αυτό στην οριζόντια και κάθετη κατεύθυνση, μπορείτε να εκτελέσετε έως 75% λιγότερους αρχικούς υπολογισμούς τομής ακτίνων-σκηνών.

Φυσικά, αυτό μπορεί εύκολα να χάσει ένα πολύ λεπτό αντικείμενο: σε αντίθεση με αυτά που συζητήθηκαν προηγουμένως, αυτή είναι η "λάθος" βελτιστοποίηση, επειδή τα αποτελέσματα της χρήσης του δεν είναι πανομοιότυποσε αυτό που θα είχαμε λάβει χωρίς αυτό? Κατά μία έννοια, «απατάμε» αυτές τις οικονομίες. Το κόλπο είναι να μαντέψετε πώς να αποθηκεύσετε σωστά, διασφαλίζοντας παράλληλα ικανοποιητικά αποτελέσματα.

Άλλα πρωτόγονα

Σε προηγούμενες ενότητες, χρησιμοποιήσαμε τις σφαίρες ως πρωτόγονες, επειδή είναι εύκολο να χειριστούν από μαθηματική άποψη. Αλλά έχοντας επιτύχει αυτό, μπορείτε απλά να προσθέσετε άλλα πρωτόγονα.

Σημειώστε ότι από την άποψη του TraceRay, κάθε αντικείμενο μπορεί να κάνει αρκεί να υπολογίσει μόνο δύο τιμές: την τιμή για την πλησιέστερη τομή μεταξύ της ακτίνας και του αντικειμένου και την κανονική στο σημείο τομής. Οτιδήποτε άλλο στον ανιχνευτή ακτίνων είναι ανεξάρτητο από τον τύπο του αντικειμένου.

Τα τρίγωνα είναι μια καλή επιλογή. Πρώτα πρέπει να υπολογίσετε την τομή μεταξύ της ακτίνας και του επιπέδου που περιέχει το τρίγωνο και αν υπάρχει τομή, τότε προσδιορίστε εάν το σημείο βρίσκεται μέσα στο τρίγωνο.

Εποικοδομητική γεωμετρία μπλοκ

Υπάρχει ένας πολύ ενδιαφέρον τύπος αντικειμένου που είναι σχετικά εύκολο να εφαρμοστεί: μια δυαδική λειτουργία μεταξύ άλλων αντικειμένων. Για παράδειγμα, η διασταύρωση δύο σφαιρών μπορεί να δημιουργήσει κάτι που μοιάζει με φακό και η αφαίρεση μιας μικρής σφαίρας από μια μεγαλύτερη σφαίρα μπορεί να δημιουργήσει κάτι που μοιάζει με αστέρι του θανάτου.

Πως δουλεύει? Για κάθε αντικείμενο, μπορούν να υπολογιστούν οι θέσεις όπου η ακτίνα εισέρχεται και εξέρχεται από το αντικείμενο. για παράδειγμα, στην περίπτωση μιας σφαίρας, η ακτίνα εισέρχεται και εξέρχεται στο . Ας υποθέσουμε ότι πρέπει να υπολογίσουμε την τομή δύο σφαιρών. η ακτίνα βρίσκεται μέσα στη διασταύρωση όταν είναι μέσα και στις δύο σφαίρες, και εξωτερικά αλλιώς. Στην περίπτωση της αφαίρεσης, η ακτίνα είναι μέσα όταν βρίσκεται μέσα στο πρώτο αντικείμενο αλλά όχι μέσα στο δεύτερο.

Γενικότερα, αν θέλουμε να υπολογίσουμε την τομή μεταξύ μιας ακτίνας και (όπου υπάρχει οποιοσδήποτε τελεστής Boole), τότε πρέπει πρώτα να υπολογίσουμε ξεχωριστά την τομή ακτίνας και ακτίνας, που μας δίνει το "εσωτερικό" διάστημα κάθε αντικειμένου και . Στη συνέχεια αξιολογούμε το , το οποίο βρίσκεται στο "εσωτερικό" διάστημα . Απλώς πρέπει να βρούμε την πρώτη τιμή που βρίσκεται τόσο στο "εσωτερικό" διάστημα και στο διάστημα που μας ενδιαφέρει:

Το κανονικό στο σημείο τομής είναι είτε το κανονικό του αντικειμένου που δημιουργεί την τομή, είτε το αντίθετό του, ανάλογα με το αν κοιτάμε «έξω» ή «μέσα» του αρχικού αντικειμένου.

Φυσικά, δεν χρειάζεται να είναι πρωτόγονοι. οι ίδιοι μπορεί να είναι τα αποτελέσματα των Boolean πράξεων! Αν το εφαρμόσουμε αυτό καθαρά, τότε δεν χρειάζεται καν να το γνωρίζουμε πωςείναι όσο μπορούμε να πάρουμε διασταυρώσεις και κανονικές από αυτές. Έτσι, μπορείτε να πάρετε τρεις σφαίρες και να υπολογίσετε, για παράδειγμα, .

Διαφάνεια

Δεν χρειάζεται να είναι όλα τα αντικείμενα αδιαφανή, μερικά μπορεί να είναι μερικώς διαφανή.

Η εφαρμογή της διαφάνειας είναι πολύ παρόμοια με την εφαρμογή του προβληματισμού. Όταν μια ακτίνα πέφτει σε μια μερικώς διαφανή επιφάνεια, υπολογίζουμε, όπως και πριν, το τοπικό και το ανακλώμενο χρώμα, αλλά υπολογίζουμε επίσης ένα επιπλέον χρώμα - το χρώμα του φωτός που διέρχεται διά μέσουτο αντικείμενο που λαμβάνεται από μια άλλη κλήση στο TraceRay. Στη συνέχεια, πρέπει να αναμίξετε αυτό το χρώμα με τα τοπικά και τα ανακλώμενα χρώματα, λαμβάνοντας υπόψη τη διαφάνεια του αντικειμένου, και αυτό είναι.

Διάθλαση

Στην πραγματική ζωή, όταν μια δέσμη φωτός περνά μέσα από ένα διαφανές αντικείμενο, αλλάζει κατεύθυνση (γι' αυτό και όταν ένα καλαμάκι βυθίζεται σε ένα ποτήρι νερό, φαίνεται «σπασμένο»). Η αλλαγή κατεύθυνσης εξαρτάται από δείκτη διάθλασηςκάθε υλικό σύμφωνα με την ακόλουθη εξίσωση:
Πού και είναι οι γωνίες μεταξύ της ακτίνας και της κανονικής πριν και μετά την τομή της επιφάνειας, και και είναι οι δείκτες διάθλασης του υλικού έξω και μέσα στα αντικείμενα.

Για παράδειγμα, περίπου ίσο με , και περίπου ίσο με . Δηλαδή για μια δέσμη που μπαίνει στο νερό υπό γωνία παίρνουμε




Σταματήστε για μια στιγμή και συνειδητοποιήστε: εάν εφαρμόσετε εποικοδομητική γεωμετρία και διαφάνεια μπλοκ, μπορείτε να μοντελοποιήσετε έναν μεγεθυντικό φακό (την τομή δύο σφαιρών) που θα συμπεριφέρεται σαν ένας σωματικά σωστός μεγεθυντικός φακός!

Υπερδειγματοληψία

Η υπερδειγματοληψία είναι περίπου το αντίθετο της υποδειγματοληψίας, όπου προσπαθούμε για ακρίβεια αντί για ταχύτητα. Ας υποθέσουμε ότι οι ακτίνες που αντιστοιχούν σε δύο γειτονικά pixel πέφτουν σε δύο διαφορετικά αντικείμενα. Πρέπει να χρωματίσουμε κάθε pixel με το κατάλληλο χρώμα.

Ωστόσο, μην ξεχνάτε την αναλογία με την οποία ξεκινήσαμε: κάθε ακτίνα πρέπει να ορίζει το "καθοριστικό" χρώμα του καθενός τετράγωνο«πλέγμα» μέσα από το οποίο κοιτάμε. Χρησιμοποιώντας μία ακτίνα ανά εικονοστοιχείο, αποφασίζουμε συμβατικά ότι το χρώμα της ακτίνας φωτός που διέρχεται από τη μέση του τετραγώνου ορίζει ολόκληρο το τετράγωνο, αλλά αυτό μπορεί να μην ισχύει.

Η λύση σε αυτό το πρόβλημα είναι να ανιχνεύσετε πολλαπλές ακτίνες ανά εικονοστοιχείο - 4, 9, 16, κ.λπ., και στη συνέχεια να λάβετε τον μέσο όρο τους για να λάβετε το χρώμα του εικονοστοιχείου.

Φυσικά, αυτό κάνει τον ιχνηθέτη ακτίνων 4, 9 ή 16 φορές πιο αργό, για τον ίδιο λόγο που η μείωση του δείγματος τον κάνει φορές πιο γρήγορο. Ευτυχώς, υπάρχει συμβιβασμός. Μπορούμε να υποθέσουμε ότι οι ιδιότητες ενός αντικειμένου αλλάζουν ομαλά κατά μήκος της επιφάνειάς του, πράγμα που σημαίνει ότι η εκπομπή 4 ακτίνων ανά pixel που χτυπούν το ίδιο αντικείμενο σε ελαφρώς διαφορετικά σημεία δεν θα βελτιώσει πολύ την εμφάνιση της σκηνής. Επομένως, μπορούμε να ξεκινήσουμε με μία ακτίνα ανά εικονοστοιχείο και να συγκρίνουμε γειτονικές ακτίνες: εάν πέφτουν σε άλλα αντικείμενα ή το χρώμα τους διαφέρει περισσότερο από μια επαναδιαιρεμένη τιμή κατωφλίου, τότε εφαρμόζουμε υποδιαίρεση pixel και στα δύο.

Ψευδοκώδικας ιχνηθέτη ακτίνων

Παρακάτω είναι η πλήρης έκδοση του ψευδοκώδικα που δημιουργήσαμε στα κεφάλαια ανίχνευσης ακτίνων:

CanvasToViewport(x, y) ( return (x*Vw/Cw, y*Vh/Ch, d) ) ReflectRay(R, N) ( return 2*N*dot(N, R) - R; ) ComputeLighting(P, N, V, s) ( i = 0,0 για φως στη σκηνή. Φώτα ( αν είναι φως. τύπος == περιβάλλοντος ( i += φως. ένταση ) άλλο ( αν φως. τύπος == σημείο ( L = φως. θέση - P t_max = 1 ) else ( L = light.direction t_max = inf ) # Έλεγχος σκιών shadow_sphere, shadow_t = ClosestIntersection(P, L, 0.001, t_max) if shadow_sphere != NULL συνέχεια # Diffusion n_dot_l = dot(N, L ifl_) 0 i += light.intensity*n_dot_l/(length(N)*length(L)) # Shine if s != -1 ( R = ReflectRay(L, N) r_dot_v = dot(R, V) if r_dot_v > 0 i += light.intensity*pow(r_dot_v/(length(R)*length(V)), s) ) ) return i ) ClosestIntersection(O, D, t_min, t_max) ( closest_t = inf closest_sphere = NULL για σφαίρα σε σκηνή.Σφαίρες ( t1, t2 = IntersectRaySphere(O, D, sphere) εάν t1 in και t1< closest_t closest_t = t1 closest_sphere = sphere if t2 in and t2 < closest_t closest_t = t2 closest_sphere = sphere } return closest_sphere, closest_t } TraceRay(O, D, t_min, t_max, depth) { closest_sphere, closest_t = ClosestIntersection(O, D, t_min, t_max) if closest_sphere == NULL return BACKGROUND_COLOR # Вычисление локального цвета P = O + closest_t*D # Вычисление точки пересечения N = P - closest_sphere.center # Вычисление нормали сферы в точке пересечения N = N / length(N) local_color = closest_sphere.color*ComputeLighting(P, N, -D, sphere.specular) # Если мы достигли предела рекурсии или объект не отражающий, то мы закончили r = closest_sphere.reflective if depth <= 0 or r <= 0: return local_color # Вычисление отражённого цвета R = ReflectRay(-D, N) reflected_color = TraceRay(P, R, 0.001, inf, depth - 1) return local_color*(1 - r) + reflected_color*r } for x in [-Cw/2, Cw/2] { for y in [-Ch/2, Ch/2] { D = camera.rotation * CanvasToViewport(x, y) color = TraceRay(camera.position, D, 1, inf) canvas.PutPixel(x, y, color) } }
Και εδώ είναι η σκηνή που χρησιμοποιείται για την απόδοση των παραδειγμάτων:

Viewport_size = 1 x 1 projection_plane_d = 1 σφαίρα ( κέντρο = (0, -1, 3) ακτίνα = 1 χρώμα = (255, 0, 0) # Κόκκινο κατοπτρικό = 500 # Λαμπερό ανακλαστικό = 0,2 # Ελαφρώς ανακλαστική ) σφαίρα ( κέντρο = (-2, 1, 3) ακτίνα = 1 χρώμα = (0, 0, 255) # Μπλε κατοπτρικό = 500 # Λαμπερή ανακλαστική = 0,3 # Ελαφρώς πιο ανακλαστική ) σφαίρα ( κέντρο = (2, 1, 3) ακτίνα = 1 χρώμα = (0, 255, 0) # Πράσινο κατοπτρικό = 10 # Λίγο γυαλιστερό ανακλαστικό = 0,4 # Ακόμα πιο ανακλαστική ) σφαίρα ( χρώμα = (255, 255, 0) # Κίτρινο κέντρο = (0, -5001, 0) ακτίνα = 5000 κατοπτρικό = 1000 # Πολύ γυαλιστερό ανακλαστικό = 0,5 # Μισό ανακλαστικό ) φως ( τύπος = ένταση περιβάλλοντος = 0,2 ) φως ( τύπος = ένταση σημείου = 0,6 θέση = (2, 1, 0) ) φως ( τύπος = κατευθυντική ένταση = 0,2 κατεύθυνση = (1, 4, 4) )

Ετικέτες: Προσθήκη ετικετών

Άμεση ιχνηλάτηση. Στη μέθοδο άμεσης ανίχνευσης, δημιουργείται μια δέσμη ακτίνων, αφήνοντας την πηγή σε όλες τις πιθανές κατευθύνσεις.

Οι περισσότερες από τις ακτίνες που εκπέμπονται από την πηγή δεν φτάνουν στον δέκτη και επομένως δεν επηρεάζουν την εικόνα που σχηματίζεται σε αυτόν. Μόνο ένα πολύ μικρό μέρος των ακτίνων, μετά από όλες τις αντανακλάσεις και τις διαθλάσεις, φτάνει τελικά στον δέκτη, δημιουργώντας μια εικόνα της σκηνής στους υποδοχείς του. Σε τραχιές επιφάνειες εμφανίζονται πολλές ακτίνες που ανακλώνται διάχυτα. Όλα αυτά πρέπει να δημιουργηθούν και να παρακολουθηθούν μέσω προγραμματισμού, γεγονός που περιπλέκει πολύ την εργασία ανίχνευσης.

Η διέλευση μιας δέσμης σε ένα μη ιδανικό μέσο συνοδεύεται από σκέδαση και απορρόφηση φωτεινής ενέργειας στα μικροσωματίδια της. Αυτές οι φυσικές διεργασίες είναι εξαιρετικά δύσκολο να μοντελοποιηθούν επαρκώς σε έναν υπολογιστή με τους πεπερασμένους υπολογιστικούς πόρους του. Στην πράξη, περιορίζονται στη χρήση του συντελεστή εξασθένησης της ενέργειας της δέσμης ανά μονάδα απόστασης που διανύεται από αυτήν. Παρομοίως, εισάγονται συντελεστές για τη μείωση της ενέργειας μιας δέσμης κατά την ανάκλαση και τη διάθλασή της στη διεπαφή μεταξύ των μέσων. Λαμβάνοντας υπόψη αυτούς τους συντελεστές, παρακολουθείται η μείωση της ενέργειας όλων των πρωτογενών και δευτερογενών ακτίνων καθώς περιφέρονται στον χώρο της σκηνής. Μόλις η ενέργεια μιας συγκεκριμένης ακτίνας γίνει μικρότερη από ένα καθορισμένο απόλυτο επίπεδο ή μειωθεί κατά έναν καθορισμένο αριθμό φορών, η ανίχνευση αυτής της ακτίνας σταματά.

Έτσι, το κύριο Μειονεκτήματα της μεθόδου άμεσης ανίχνευσηςείναι η υψηλή ένταση εργασίας και η χαμηλή απόδοση. Κατά την εφαρμογή της μεθόδου, οι περισσότερες εργασίες για τον υπολογισμό των τομών των ακτίνων με τα αντικείμενα γίνονται μάταια.

Backtrace.Η μέθοδος ανίχνευσης αναπτύχθηκε τη δεκαετία του '80. Τα έργα των Whitted και Kay θεωρούνται θεμελιώδη.

Για να αποκόψουμε τις ακτίνες που δεν φτάνουν στον δέκτη, αρκεί να θεωρήσουμε τον παρατηρητή ως πηγή ακτίνων επιστροφής. Η κύρια ακτίνα θα θεωρηθεί ότι είναι η ακτίνα Vαπό τον παρατηρητή σε οποιοδήποτε σημείο της επιφάνειας του αντικειμένου.

Χρησιμοποιώντας τις μεθόδους που συζητήθηκαν παραπάνω, υπολογίζονται δευτερογενείς, τριτογενείς κ.λπ. ακτίνες. Ως αποτέλεσμα, για κάθε πρωτογενή ακτίνα, χτίζεται ένα δέντρο ανίχνευσης, τα κλαδιά του οποίου αποτελούν τις δευτερεύουσες ακτίνες. Ο κλάδος της διαδρομής τελειώνει εάν:

● η δέσμη υπερβαίνει τη σκηνή,

● η δέσμη συναντά ένα αδιαφανές σώμα που απορροφά το φως,

● η δέσμη χτυπά την πηγή φωτός,

● η ένταση της δέσμης πέφτει κάτω από το όριο ευαισθησίας,

● ο αριθμός των αρχικών διαχωρισμών δέσμης γίνεται πολύ μεγάλος για τους διαθέσιμους πόρους του μηχανήματος.

Η προκύπτουσα άμεση φωτεινή ενέργεια (χρώμα και ένταση) εισέρχεται στον δέκτη από την κατεύθυνση V, αποτελείται από τις ενέργειες των τερματικών κορυφών του δέντρου, λαμβάνοντας υπόψη τις απώλειές τους κατά τη διάδοση σε οπτικά μέσα.


Η μέθοδος ανίχνευσης συσσωρεύει στην πραγματικότητα όλες τις ακτίνες που όντως φτάνουν στον δέκτη από μια συγκεκριμένη κατεύθυνση, ανεξάρτητα από την προέλευσή τους. Αυτό σας επιτρέπει να βλέπετε και να εμφανίζετε στην οθόνη:

● αδιαφανή αντικείμενα που απορροφούν τις ακτίνες επιστροφής.

● διαφανή αντικείμενα μέσω των οποίων άλλα αντικείμενα είναι ορατά στον παρατηρητή λόγω διάθλασης.

● αντανακλάσεις αντικειμένων σε επιφάνειες καθρέφτη, συμπεριλαμβανομένης της λάμψης που αντιστοιχεί στις ακτίνες επιστροφής που χτυπούν την πηγή φωτός.

● σκιές που σχηματίζονται σε επιφανειακά σημεία που κρύβονται από την πηγή από άλλα αντικείμενα.

● διάφορα άλλα οπτικά εφέ.

Ο αριθμός των «ανιχνευτικών» ακτίνων επιστροφής που υπόκεινται σε ανίχνευση περιορίζεται από τον αριθμό των σημείων στις επιφάνειες των αντικειμένων σκηνής ορατά από τη θέση του παρατηρητή και μετακινούνται με ένα τελευταίο βήμα ανάλογα με την ανάλυση της οθόνης. Εξαιτίας αυτού, το ποσό του υπολογιστικού κόστους στη μέθοδο οπισθοδρόμησης μειώνεται σημαντικά σε σύγκριση με τη μέθοδο μπροστινής ανίχνευσης. Είναι δυνατός ο συνδυασμός και των δύο μεθόδων για τη βελτιστοποίηση των αλγορίθμων και τη μείωση της πολυπλοκότητάς τους.

Οι αλγόριθμοι ανίχνευσης είναι μια αναδρομική διαδικασία που αυτοαποκαλείται όταν εμφανίζεται μια δευτερεύουσα ακτίνα (η αναλυόμενη ακτίνα ανακλάται ή διαθλάται). Οι περισσότεροι από τους υπολογισμούς κατά την εφαρμογή μεθόδων ανίχνευσης περιλαμβάνουν τον υπολογισμό των τομών των ακτίνων με τις επιφάνειες και επομένως χρησιμοποιούνται για την απεικόνιση οπτικών εφέ σε σκηνές με μικρό αριθμό αντικειμένων.

Κατά την εφαρμογή της μεθόδου backtracing στην πράξη, εισάγονται οι ακόλουθοι περιορισμοί: . Ορισμένοι από αυτούς είναι απαραίτητοι για να μπορέσουμε να λύσουμε το πρόβλημα της σύνθεσης εικόνας κατ' αρχήν και ορισμένοι περιορισμοί μπορούν να βελτιώσουν σημαντικά την απόδοση της ανίχνευσης.

Περιορισμοί της μεθόδου ανίχνευσης:

1. Μεταξύ όλων των τύπων αντικειμένων, ας επισημάνουμε τις πηγές φωτός. Μπορούν να εκπέμπουν μόνο φως, αλλά δεν μπορούν να το αντανακλούν ή να το διαθλούν. Συνήθως λαμβάνονται υπόψη σημειακές πηγές.

2. Οι ιδιότητες των ανακλαστικών επιφανειών περιγράφονται από το άθροισμα δύο συστατικών: της διάχυτης και της κατοπτρικής.

3. Η κερδοσκοπία, με τη σειρά της, περιγράφεται επίσης από δύο συνιστώσες. Η πρώτη (αντανάκλαση) λαμβάνει υπόψη την ανάκλαση από άλλα αντικείμενα που δεν είναι πηγές φωτός. Κατασκευάζεται μόνο μία κατοπτρικά ανακλώμενη δέσμη rγια περαιτέρω ιχνηλάτηση. Το δεύτερο συστατικό (κατοπτρικό) σημαίνει λάμψη από πηγές φωτός. Για να γίνει αυτό, οι ακτίνες κατευθύνονται σε όλες τις πηγές και προσδιορίζονται οι γωνίες που σχηματίζονται από αυτές τις ακτίνες με την κατοπτρικά ανακλώμενη ακτίνα ιχνηλάτησης ( r). Στην κατοπτρική αντανάκλαση, το χρώμα ενός σημείου σε μια επιφάνεια καθορίζεται από το χρώμα αυτού που ανακλάται. Στην πιο απλή περίπτωση, ο καθρέφτης δεν έχει το δικό του χρώμα επιφάνειας.

4. Με τη διάχυτη ανάκλαση λαμβάνονται υπόψη μόνο οι ακτίνες από πηγές φωτός. Οι ακτίνες από κατοπτρικά ανακλαστικές επιφάνειες αγνοούνται. Εάν μια δέσμη που κατευθύνεται σε μια δεδομένη πηγή φωτός καλύπτεται από άλλο αντικείμενο, τότε αυτό το σημείο του αντικειμένου βρίσκεται στη σκιά. Με τη διάχυτη ανάκλαση, το χρώμα ενός φωτισμένου σημείου σε μια επιφάνεια καθορίζεται από το χρώμα της ίδιας της επιφάνειας και το χρώμα των πηγών φωτός.

5. Για διαφανή αντικείμενα, συνήθως δεν λαμβάνεται υπόψη η εξάρτηση του δείκτη διάθλασης από το μήκος κύματος. Μερικές φορές η διαφάνεια μοντελοποιείται χωρίς καθόλου διάθλαση, δηλ. κατεύθυνση της διαθλασμένης ακτίνας tσυμπίπτει με την κατεύθυνση της προσπίπτουσας δέσμης.

6. Για να ληφθεί υπόψη ο φωτισμός των αντικειμένων από το φως που διαχέεται από άλλα αντικείμενα, εισάγεται ένα στοιχείο φόντου (περιβάλλον).

7. Για να ολοκληρωθεί η ανίχνευση, εισάγεται μια ορισμένη τιμή κατωφλίου φωτισμού, η οποία δεν θα πρέπει πλέον να συμβάλλει στο χρώμα που προκύπτει ή ο αριθμός των επαναλήψεων είναι περιορισμένος.

Θετικά χαρακτηριστικά της μεθόδου ανίχνευσης:

● ευελιξία, δυνατότητα εφαρμογής για σύνθεση εικόνων αρκετά πολύπλοκων χωρικών σκηνών. Ενσωματώνει πολλούς νόμους της οπτικής. Απλώς πραγματοποιούνται διάφορες προβολές.

● ακόμη και περικομμένες εκδόσεις αυτής της μεθόδου καθιστούν δυνατή τη λήψη αρκετά ρεαλιστικών εικόνων. Για παράδειγμα, εάν περιοριστούμε μόνο σε πρωτεύουσες ακτίνες (από το σημείο προβολής), τότε αυτό έχει ως αποτέλεσμα την αφαίρεση αόρατων σημείων. Η ανίχνευση ήδη μιας ή δύο δευτερευουσών ακτίνων δίνει σκιές, ιδιομορφία, διαφάνεια.

● όλοι οι μετασχηματισμοί συντεταγμένων (αν υπάρχουν) είναι γραμμικοί, επομένως είναι αρκετά εύκολο να εργαστείτε με υφές.

● Για ένα εικονοστοιχείο μιας εικόνας ράστερ, μπορούν να ανιχνευθούν πολλές ακτίνες σε κοντινή απόσταση και, στη συνέχεια, υπολογίζεται ο μέσος όρος του χρώματός τους για να εξαλειφθεί το εφέ αλλοίωσης.

● δεδομένου ότι ο υπολογισμός ενός σημείου εικόνας εκτελείται ανεξάρτητα από άλλα σημεία, αυτό μπορεί να χρησιμοποιηθεί αποτελεσματικά κατά την εφαρμογή αυτής της μεθόδου σε παράλληλα υπολογιστικά συστήματα, στα οποία οι ακτίνες μπορούν να ανιχνευθούν ταυτόχρονα.

Μειονεκτήματα της μεθόδου ανίχνευσης:

● προβλήματα με τη μοντελοποίηση διάχυτης ανάκλασης και διάθλασης.

● Για κάθε σημείο της εικόνας, είναι απαραίτητο να εκτελεστούν πολλές υπολογιστικές πράξεις. Η ανίχνευση ακτίνων είναι ένας από τους πιο αργούς αλγόριθμους σύνθεσης εικόνας.