Γρήγορη και απλή 2-Πέρασμα βάθος πεδίου

Gnome Depth-Of-Field Βάθος πεδίου είναι ένα φωτογραφικό αποτέλεσμα που προκαλείται από διάφραγμα και το εστιακό μήκος. Ένα πολύ ενδιαφέρον άρθρο για το θέμα αυτό έχει δημοσιευθεί στην istockphoto.com . Παρέχει ένα αξιόπιστο βάθος-cue για δύο διαστάσεων, προβλεπόμενο υλικό. Με άλλα λόγια: Κάνει εικόνες φαίνονται 3D ενώ είναι ακόμα 2D προβολές.

Στην τρέχουσα γενιά hardware γραφικών, είναι δυνατό να καταστήσει πολύ φανταχτερό μετά την επεξεργασία των αποτελεσμάτων - εκτός από ένα μαλακό σκιές και τη θαμπάδα κινήσεων, το βάθος πεδίου (DOF) θα μπορούσε να είναι μία από τις πιο συχνά χρησιμοποιούμενο εφέ για την ενίσχυση της οπτικής ποιότητας. Υπάρχει μια μεγάλη κάλυψη για τις διάφορες τεχνικές για τη δημιουργία εφέ DOF ευχάριστο - ένα απλό google για "βάθος πεδίου shader" μου έδωσε μια περίπου 74.000 hits. Για ένα demo που ήθελα να γράψω, αποφάσισα να χρησιμοποιήσω μια απλή, alpha-channel-based προσέγγιση, διότι είναι απλή, γρήγορη και φαίνεται ωραίο.

Η ιδέα είναι απλή: Αν έχετε ήδη ένα shader που κάνει τα πράγματα όπως η ανά-pixel-φωτισμού, απλά βάλτε το βάθος πληροφοριών σε κανάλι άλφα το προκύπτον χρώμα του. Το μόνο που πρέπει να γίνει κατά το δεύτερο πέρασμα: καταστήσει ξανά την εικόνα και να θολώνουν την εικόνα με έναν κατάλληλο πυρήνα. Ως πυρήνα, επέλεξα ένα Poisson-Disc-φίλτρο με CPU-precomputed δεδομένων - αυτό είναι λιγότερο "αλλοιωμένες" από ό, τι χρησιμοποιώντας μια απλή τετραγωνική πυρήνα, δίνοντας την καλύτερη οπτική ποιότητα με λιγότερο δείγματα. Για να αποφύγετε δυσάρεστες φωτοστέφανα γύρω από τις άκρες των περιοχών που έχουν μεγάλο βάθος-διαφορές, το αποτέλεσμα δεν είναι απλά μια θολή εικόνα, αλλά το εστιακό μήκος ελέγχει επίσης πόσο θολή δεδομένα εικόνας μπει στο τελικό αποτέλεσμα.

  vec4 vColor = texture2D (sceneMap, gl_TexCoord [0] xy.)?
 επιπλέουν fBlurAmount = abs (vColor.a * 2,0-1,0)?
 επιπλέουν fTexel = 16.0/mapSize?
 vec4 vResult?
 για (int i = 0? i <16? + + i) {
     vResult + = texture2D (blurMap, gl_TexCoord [0] xy + fBlurAmount * fTexel * Poisson [i] xy * Poisson [i] z...)?
 }
 vResult / = 16,0?
 gl_FragColor = mix (vColor, vResult, fBlurAmount)? 

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

Αυτή η εγγραφή δημοσιεύτηκε στην Επιστήμη των Υπολογιστών και πινακίδα , , , . Σελιδοδείκτης το permalink .

Τα σχόλια είναι κλειστά.