Profilo del carattere in OpenGL, FTGL


8

Sto usando la libreria FTGL per il rendering dei caratteri nel mio gioco, ma non ho idea di come creare un contorno attorno al testo. Raggiungere un'ombra potrebbe essere facile, perché posso semplicemente farlo in questo modo:

(pseudo codice)

font.render(Color::BLACK, position.x + 1, position.y + 1); // Shadow
font.render(Color::WHITE, position.x, position.y)          // Normal text

Ma come creare un contorno? Sfortunatamente non ho trovato soluzioni interessanti su Internet che mi sono sembrate un po 'strane, perché pensavo che fosse un problema abbastanza popolare.

Disegnare contorni con solo un carattere più grande non è un modo giusto, perché come ho scoperto, le lettere non corrispondono in questo caso:

inserisci qui la descrizione dell'immagine

Quindi esiste un modo semplice per creare una struttura per i caratteri? Come lo fanno nei giochi reali?

Grazie in anticipo per qualsiasi risposta


1
Una soluzione sporca potrebbe essere quella di rendere ad una trama lo stesso testo e quindi renderizzare questa trama ingrandita di x1.2, per esempio.
Dan,

2
@Dan Questo porterà esattamente a ciò che ha mostrato nella sua immagine sopra. Anche rendere una lettera alla volta in questo modo, porterebbe a problemi, poiché i contorni esterni sarebbero più spessi di quelli interni (che potrebbero essere inesistenti).
Ingegnere

1
Che tipo di carattere stai usando? FTGL supporta i caratteri di contorno predefiniti per i caratteri vettoriali. La larghezza della linea OpenGL può essere utilizzata per controllare lo spessore.
Paul-Jan,

Risposte:


7

Flessibile e preciso: filtri

Utilizzare un filtro texel sulla trama sul lato CPU o se si utilizza la pipeline programmabile OpenGL, direttamente nello shader di frammenti.

L'idea di un filtro è semplicemente che si esegue un ciclo 2D per elaborare ogni texel. Se è bianco, corri attraverso un loop 2D interno per ciascuno dei pixel circostanti in un certo raggio e ti adatti di conseguenza. Questo è anche noto come filtro box, sebbene se includi il controllo del raggio, si tratta in realtà di un filtro circolare, che evita artefatti assiali.

Un modo più rapido per farlo è precalcolare il set di offset da ciascun pixel centrale che controlli; in questo modo, non è necessario eseguire una radice quadrata per ogni pixel che circonda un determinato pixel. Si desidera mantenere la complessità fino a `O (texWidth * texHeight) anziché O (texWidth * texHeight * filterRadius * filterRadius), in altre parole.

Facile: rendering multipli

Un altro modo per ottenere l'effetto sarebbe non ridimensionare il testo, ma invece rendere il contorno rosso in ciascuna delle otto (o più) direzioni, ciascuna leggermente sfalsata rispetto all'originale in quella direzione:

 \|/
--+--
 /|\

Compensando ciascuna delle versioni rosse in questo modo, otterrai un bordo esterno abbastanza uniforme attorno al testo originale. Tieni presente che quando si sposta in diagonale, è necessario utilizzare la stessa ampiezza del vettore di quando si sposta in orizzontale o in verticale, anziché semplicemente compensare con gli stessi valori xey (il che porta a una lunghezza approssimativamente ulteriore di 1,4x - trig di base).

FYI

Questo tipo di effetto è noto come dilatazione e talvolta viene eseguito tramite Minkowski Summation , che è l'approccio basato su vettori (continui) al filtro a riquadri basato su pixel (quantizzato) che ho descritto sopra.


6

Questa funzione è implementata direttamente in FTGL ma è disponibile solo nella ExtrudeFontclasse. È sufficiente definire un inizio per il carattere:

font = new FTExtrudeFont(...);
font->FaceSize(80);
font->Depth(0);
font->Outset(0, 5);

Quindi puoi usare un colore diverso per le due modalità di rendering:

glColor3f(1.0, 1.0, 1.0); /* White inside */
font->Render("Hello", FTPoint(), FTPoint(), FTGL::RENDER_FRONT);
glColor3f(1.0, 0.0, 0.0); /* Red outline */
font->Render("Hello", FTPoint(), FTPoint(), FTGL::RENDER_SIDE);

Ecco il risultato, con l'antialiasing attivato e disattivato:

Immagine risultante


Grazie Sam! Questo è davvero quello che volevo sentire - che FTGL in realtà ha qualcosa del genere. Grazie ancora.
Piotr Chojnacki,

2

Non correlato a FTGL ma c'è un ottimo articolo di Valve sul rendering dei glifi. Offre un rendering di alta qualità con requisiti di memoria ridotti e effetti come contorni o ombre possono essere semplicemente implementati.


2
Vale la pena avvisare l'OP che questo approccio richiede una comprensione della pipeline GPU programmabile, vale a dire shader.
Ingegnere
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.