2012-10-16 14 views
16

In OpenGL, posso delineare gli oggetti disegnando l'oggetto normalmente, quindi disegnandolo di nuovo come wireframe, utilizzando il buffer stencil in modo che l'oggetto originale non venga disegnato sopra. Tuttavia, questo si traduce in contorni con un colore solido.Effetti di contorno in OpenGL

enter image description here

In questa immagine, i pixel del contorno della creatura sembrano avere più trasparente l'ulteriore sono dalla creatura che delineano. Come posso ottenere un effetto simile con OpenGL?

risposta

6

Non hanno utilizzato wireframe per questo. Credo che sia pesantemente lo shader correlata e richiede questo:

  1. rendering oggetto a uno stencil buffer
  2. rendering stencil buffer con il colore di scelta durante l'applicazione sfocatura
  3. modello di rendering su di esso
+0

Quindi disegniamo l'oggetto con un colore uniforme su una texture, quindi disegniamo quella texture sullo schermo con uno shader sfocato? – dupersuper

+0

Sì, ma probabilmente non è l'unico modo per farlo. – weltensturm

+1

Questo è essenzialmente il modo in cui è stato fatto sul titolo su cui ho lavorato, anche se per noi è stato problematico. Considera quanto dello schermo conterrà il tuo schema prima di impegnarti in questo approccio: sono disponibili effetti meno costosi per comunicare che "questo modello è evidenziato". In un titolo moderno, probabilmente non hai una tariffa di riserva da utilizzare. – Philip

1

Per quanto vedo, l'effetto sullo schermo è breve e molti effetti "edge" non sono puri, come nel fumetto. Ciò che per lo più è fatto, si ha un passaggio se si esegue il rendering dell'oggetto normalmente di un passaggio con solo la geometria (senza trame) e uno shader GLSL. Nello shader del frammento viene preso il normale e quella normale è perpendicolare al vettore della fotocamera che si colorisce l'oggetto. L'effetto viene poi livellato includendo l'area vicino alla perpendicolare perfetta.

Dovrei cercare la matematica esatta, ma penso che se si prende il prodotto punto del vettore della fotocamera e il normale si ottiene la quantità di "perpendicolarità". Che si può quindi eseguire attraverso una funzione come exp per ottenere una polarizzazione verso 1.

So (senza garanzia che sia corretto):

exp(dot(vec3(0, 0, 1), normal)); 

(Nota:. Tutto è in screenspace)

4

Sono in ritardo per una risposta, ma stavo cercando di ottenere la stessa cosa e ho pensato di condividere la soluzione che sto utilizzando.

Un effetto simile può essere ottenuto in un'operazione di estrazione singola con uno shader non troppo complesso.

Nello shader di frammenti, si calcola il colore del frammento in base a fulmini e texture, fornendo il colore non evidenziato 'colorA'.

Il secondo colore è il colore del contorno, "colore B".

Si dovrebbe ottenere il frammento sul vettore della telecamera, normalizzarlo, quindi ottenere il prodotto punto di questo vettore con il normale del frammento.

Il frammento del vettore della telecamera è semplicemente l'inverso della posizione del frammento nell'occhio-spazio.

Il colore del frammento è quindi:

float CameraFacingPercentage = dot(v_fragmentToCamera, v_Normal); 
gl_FragColor = ColorA * CameraFacingPercentage + ColorB * (1 - FacingCameraPercentage); 

Questa è l'idea di base, ma si dovrà giocare per avere più o meno il colore del contorno. Inoltre, saranno evidenziate anche le parti concave del modello, ma ciò vale anche per l'immagine pubblicata nella domanda.