Blending Have a look: http://nehe.gamedev.net/
Blending (ανάμειξη) Η OpenGL παρέχει τρόπους να προσομοιώσουμε διαφανείς επιφάνειες με pipeline rendering Φαινόμενο που απαιτεί global shading Ανάμειξη χρωμάτων, blending Λαμβάνει χώρα κατά το rasterization όταν ένα fragment πρόκειται να επηρεάσει ένα pixel του frame buffer Τα fragments πολλαπλών αντικειμένων μπορούν να επηρεάσουν τη φωτεινότητα ενός pixel. Blending, compositing.
Blending (ανάμειξη) Αδιαφάνεια (opacity) : ποσοστό του προσπίπτοντος φωτός που απορροφάται από την επιφάνεια α=1: πλήρως αδιαφανές, απορροφά όλο το φως α=0: πλήρως διαφανές, διέρχεται όλο το φως Διαφάνεια (transparency, translucency): 1-α
Blending (ανάμειξη) Ημιδιαφανές αντικείμενο A (χρωματιστό γυαλί) opacity α=0.2 Μπροστά από αδιαφανές αντικείμενο B, α=1 Χρώμα που βλέπω 0.2*C A +0.8*C B
Blending (ανάμειξη) Το χρώμα του fragment που είναι να απεικονιστεί (source) συνδυάζεται με το χρώμα του pixel όπου θα απεικονιστεί (destination) και αυτό αποδίδεται σαν χρώμα στο pixel (destination) d=f(s,d) Απαιτείται η ύπαρξη source & destination blending factors. Χρώματα σε μορφή RGBA Το alpha χρησιμοποιείται συχνά για καθορισμό blending factor
s d b c Blending (ανάμειξη) = [ s, s, s, s ] r g b a = [ d, d, d, d ] r g b a = [ b, b, b, b ] r g b a = [ c, c, c, c ] r g b a d ' = [ bs + cd, bs + cd, bs + cd, bs + cd ] r r r r g g g g b b b b a a a a
Blending (ανάμειξη) Τα blending factors για source & destination καθορίζονται συνήθως με βάση το alpha channel του source και του destination. glenable(gl_blend) glblendfunc(source_factor, destination_ factor) GL_ONE, GL_ZERO, GL_SRC_ALPHA, GL_DST_ALPHA GL_ONE_MINUS_SRC_ALPHA, GL_ONE_MINUS_DST_ALPHA Με το blending αλλάζει και το alpha του destination.
Παράδειγμα: ανάμειξη εικόνων Εικόνες C i, a i Δημιουργία (1/n) C i, (1/n) a i, πρόσθεση τους και τοποθέτησή τους στον frame buffer ή Τοποθέτηση (1/n) ως alpha όλων των εικόνων, μηδενισμός του framebuffer glblendfunc(gl_src_alpha, GL_ONE) gldrawpixels, gldrawbuffer 1*0+(1/n)*C 1 1*(1/n)*C 1 + (1/n)*C 2 1*((1/n)*C 1 + (1/n)*C 2 )+ (1/n)*C 3
Παράδειγμα: απεικόνιση ημιδιαφανών αντικειμένων Τρία ημιδιαφανή αντικείμενα μπροστά σε αδιαφανές τέταρτο (φόντο) C1 (κοντινότερο) a=0.1 C2, a=0.6 C3, a=0.2 C4 (μακρινότερο, φόντο) a=1
Παράδειγμα: απεικόνιση ημιδιαφανών αντικειμένων Φως που βγαίνει από το C3: 0.2*C3+(1-0.2)*C4 Μπαίνει στο C2 Φως που βγαίνει από το C2: 0.6*C2 +(1-0.6)*(0.2*C3+0.8*C4) Μπαίνει στο C1 Φως που βγαίνει από το C1: 0.1*C1+(1-0.1)*(0.6*C2 +0.4*(0.2*C3+0.8*C4))
Παράδειγμα: απεικόνιση ημιδιαφανών αντικειμένων Θέτω alpha σε κάθε πολύγωνο το αντίστοιχο opacity. Απεικονίζω πρώτα το C4 glblendfunc(gl_src_alpha, GL_ONE_MINUS_SRC_ALPHA) Απεικονίζω τα υπόλοιπα αντικείμενα από το μακρινότερο προς το κοντινότερο
Blending (ανάμειξη) Συνήθης πρακτική: χρήση του alpha του source σαν source blending και του 1- alpha του source σαν destination blending H σειρά απεικόνισης παίζει ρόλο!!! Πρέπει να επιλέξω τη σωστή σειρά.
Blending (ανάμειξη) Κίτρινο τρίγωνο επικαλυπτόμενο με μπλε τρίγωνο alpha=0.75 και για τα δύο, μαύρο framebuffer glblendfunc(gl_src_alpha, GL_ONE_MINUS_SRC_ALPHA) Κίτρινο-μπλε: (0+0.75*κίτρινο)*0.25+0.75*μπλε Μπλε-κίτρινο: (0+0.75*μπλε)*0.25+0.75*κίτρινο
Απεικόνιση ημιδιαφανών και αδιαφανών επιφανειών Αν έχουμε μόνο ημιδιαφανείς επιφάνειες δεν ενεργοποιούμε την απομάκρυνση κρυμμένων επιφανειών (hidden surface removal) Οι πίσω επιφάνειες δεν θα απεικονίζονταν Ημιδιαφανείς και αδιαφανείς επιφάνειες: ταξινόμηση ως προς το βάθος και απεικόνιση από πίσω προς τα μπροστά χωρίς hidden surface removal
Απεικόνιση ημιδιαφανών και αδιαφανών επιφανειών Απεικόνιση των αδιαφανών επιφανειών με hidden surface removal Απεικόνιση των ημιδιαφανών επιφανειών με hidden surface removal αλλά με read-only z- buffer: gldepthmask(gl_false) Αν το z της ημιδιαφανούς επιφάνειας είναι μικρότερο τότε δεν αλλάζει η τιμή του στο z- buffer Το z-buffer κρατάει το z του κοντινότερου αδιαφανούς.
Απεικόνιση ημιδιαφανών και αδιαφανών επιφανειών Ημιδιαφανείς επιφάνειες πίσω από αδιαφανείς: αποκρύπτονται Ημιδιαφανείς επιφάνειες μπροστά από αδιαφανείς: απεικονίζονται (blend) αλλά χωρίς να αλλάζουν το z-value
Ενδείξεις βάθους και ομίχλη (depth cueing & fog) Από τις πρώτες τεχνικές για δημιουργία ψευδαίσθησης βάθους σε συστήματα γραφικών με δυνατότητα μόνο γραμμών Οι γραμμές απομακρυσμένων αντικειμένων ζωγραφίζονται πιο αχνές Επέκταση για δημιουργία ομίχλης, καπνού,... (ημιδιαφανής χώρος) Τα αντικείμενα «σβήνουν» στο χρώμα της ομίχλης Ανάμειξη με ένα χρώμα με blending factor που μεταβάλλεται με την απόσταση
Depth cueing & fog C =f*c+(1-f)c f f: fog factor, C f : χρώμα ομίχλης Το f εξαρτάται από την απόσταση z μεταξύ του αντικειμένου (fragment) που απεικονίζεται και της κάμερας f=(end-z)/(end-start) : GL_LINEAR f= exp(-density*z) : GL_EXP f= exp(-(density*z)^2) : GL_EXP2
Depth cueing & fog
Depth cueing & fog glenable(gl_fog); glfogf(gl_fog_mode, GL_EXP); glfogf(gl_fog_density, 0.5) glfogv(gl_fog_color,fcolor);