Modo preferito per eseguire il rendering del testo in OpenGL [chiuso]


17

Sto per raccogliere ancora una volta la computer grafica per un progetto universitario. Per un precedente progetto ho usato una libreria chiamata FTGL che non mi ha lasciato abbastanza soddisfatto perché mi sembrava un po 'pesante (ho provato molte tecniche di rendering, il rendering del testo non è stato ridimensionato molto bene).

La mia domanda è: esiste una libreria buona ed efficiente per questo? In caso contrario, quale sarebbe il modo di implementare un testo veloce ma di bell'aspetto? Alcuni usi previsti sono:

  • Etichette di oggetti / personaggi mobili
  • dialoghi
  • menu
  • HUD

EDIT: preferibilmente potrebbe anche caricare caratteri


1
Questa è una "quale tecnologia utilizzare la domanda", e quindi dovrebbe probabilmente essere chiusa.
Laurent Couvidou,

Risposte:


4

Un framework popolare è la GUI di Crazy Eddie .

Ma mentre ciò è allettante, non è inusuale farlo da solo (e forse rimpiangerlo quando lo scopo aumenta in seguito;))

È normale avere i tuoi glifi su bitmap e quindi disegnare le bitmap usando OpenGL.

A volte mostri testo temporaneo che potrebbe apparire solo per una manciata di cornici. Basta usare GL_QUADS + glVertex sarà sufficiente. Ma per qualsiasi grande quantità di testo o per qualsiasi lunga durata di visibilità vale la pena inserire GL_QUADS in un VBO: da questo ho notato grandi miglioramenti delle prestazioni.

C'è ovviamente la questione di generare glifi reali di cui hai bisogno. Ci sono programmi come bmfont che puoi usare per quello. Oppure potresti aver bisogno di un rendering piuttosto più complicato, ad esempio il freetype su richiesta. Ho usato bmfont con il mio renderer abbastanza felicemente, è molto semplice da dedurre.


9

Ci sono molti modi - a seconda di ciò che vuoi ... Come ovunque, non esiste qualcosa come "la migliore soluzione". Quale piattaforma è il tuo obiettivo? Che lingua stai usando? Che dire del ridimensionamento / rotazione del testo - è necessario? Devi essere in grado di renderizzare TrueTypeFonts? Di cosa parla Multilingue / Unicode? Come vuoi memorizzare il tuo testo (quale codifica ecc.)?

In passato ho usato anche FTGL, così come il puro tipo di carattere (http://www.freetype.org/ FTGL si basa su questo), diversi tipi di caratteri bitmap, caratteri di contorno ... Ora sono principalmente dipendente da bitmap caratteri, ma questa è solo la mia preferenza personale. Perché non voglio più occuparmi di diversi set di caratteri, codifica e cose del genere - e anche la concessione di licenze per bitmapfonts è più semplice ed economica rispetto a TrueTypeFonts. Ed è utilizzabile su ogni piattaforma che può caricare immagini. Uso semplicemente un quad in openGL e mappa una parte della mia trama su di esso. L'altro lato è: il font sarà solo ridimensionabile e pulito con un fattore di circa +/- 50%. Se riesci a conviverci, suggerirei di usare un bitmapfont.

Se hai anche a che fare con codifica / set di caratteri diversi, dovresti trovare un modo per caricare e usare TrueTypeFonts (come con freetype, usando un'altra libreria o con la tua implementazione) ...

Dai anche un'occhiata ai diversi tutorial su questo argomento:

http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=13 Font Bitmap

http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=14 Caratteri contorno

http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=15 Font per contorni mappati a trama

http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=17 Font Texture 2D

In bocca al lupo!


+1 Grazie per le preziose informazioni sulle prestazioni, ero a conoscenza dei tutorial di NeHe. Penso di aver usato i caratteri bitmap ... ma non è stato ridimensionato: circa 60 etichette fluttuanti in una scena sopra sfere unite da linee, qualche idea a riguardo? (Pensavo che avrei dovuto cercare un modo per attuare un modello di peso mosca)
dukeofgaming

1
Attenzione: i tutorial di NeHe sono per la vecchia pipeline a funzioni fisse e non vengono aggiornati spesso. Se siete alla ricerca di una moderna soluzione di OpenGL vedere stackoverflow.com/questions/5262951/...
brita_

6

Se si desidera utilizzare i caratteri bitmap, non è possibile andare molto male con Angelcode Bitmap Font Generator: http://www.angelcode.com/products/bmfont/

Converte un carattere TrueType in una o più trame (con glifi ben impacchettati) e genera un piccolo file contenente i raggi UV e le spaziature (trovo che l'output XML sia particolarmente facile da lavorare e la qualità dei dati di spaziatura è generalmente molto buono, anche senza vera crenatura)



0

Considera QML . È una libreria UI completamente funzionale con una sintassi facile da usare. Il mio set di funzionalità è significativamente migliore di CEGUI nella mia esperienza, e ha una migliore documentazione, supporto e community poiché il suo obiettivo principale sono le applicazioni desktop e la capacità di renderizzare fuori schermo è solo una sorta di bonus.

Professionisti:

  • Utilizza OpenGL sul back-end per tutto il rendering
  • Può caricare qualsiasi tipo di carattere disponibile nel sistema host e anche analizzare i caratteri aggiuntivi che includi come risorse
  • Utilizza il rendering del testo del campo della distanza con segno per un output efficiente e di alta qualità
  • Può eseguire il rendering direttamente su una trama OpenGL, in modo da poter posizionare facilmente i risultati nell'ambiente di gioco
  • Qt ha molti collegamenti linguistici

Contro:

  • Qt è un grande framework
  • L'uso di QML nei progetti Direct3D o Vulkan richiede il salto attraverso i cerchi per ottenere la trama GL nell'API appropriata (o in attesa che qualcuno scriva renderer D3D / Vulkan nativi per QML)
  • Ci sono ancora alcune stranezze secondarie in QML in cui proverà a utilizzare un controllo nativo anche se si esegue il rendering su una superficie fuori schermo, come quando si tenta di aprire un menu a discesa per un elemento dell'elenco.
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.