Risoluzione rendering testo indipendente


11

Ho bisogno di un modo per disegnare un testo indipendente dalla risoluzione nel mio gioco. Cioè, devo essere in grado di ingrandire il testo e non vedere mai artefatti pixel.

Qualcuno può dare qualche suggerimento su come potrei andare al riguardo?


Suppongo che dovresti esaminare i metodi dei caratteri basati su vettori, piuttosto che quelli rasterizzati, che potrebbero essere un punto di partenza. Non sono un esperto in materia, quindi permetterò a qualcuno che sappia rispondere.
Ray Dey,

Risposte:


7

Ci sono tre modi comuni per farlo. Non si tratta davvero di eliminare completamente gli artefatti - il che è impossibile, a meno che tu non abbia tempo di memoria o processore illimitato - ma piuttosto come minimizzarli in un modo che si adatti al tuo codice esistente e alle piattaforme di destinazione.

Per prima cosa, usa semplicemente il tuo rasterizzatore di caratteri - di solito FreeType - per rasterizzare il carattere con le dimensioni che desideri mentre ingrandisci. Questo sarà fantastico negli screenshot, ma è incredibilmente lento. Puoi risolvere la lentezza memorizzando nella cache le dimensioni, ma diventa incredibilmente affamato di memoria. Inoltre, non ha un bell'aspetto in movimento, perché rendere i glifi belli per la visualizzazione statica richiede ridimensionarli in modo non uniforme. Tuttavia, è un'opzione se ti trovi su una piattaforma con memoria sufficiente (come un PC) e le tue bilance sono limitate a un intervallo limitato, come da 10 a 30 pixel. Questo metodo inoltre non ammette molti eye-candy da solo.

In secondo luogo, è possibile memorizzare il testo come mesh. Alcune biblioteche esistono per fare questo, come GLTT , o potresti scriverne una tua. Ora non hai più artefatti pixel, ma avrai artefatti poligonali se ingrandisci molto da vicino, proprio come qualsiasi altra maglia in un gioco 3D. Il testo in mesh ammette un sacco di piacere per gli occhi poiché è possibile applicare shader di vertici e la mesh può essere interfogliata con qualsiasi altro mondo che si disegna. È ragionevolmente leggero su memoria e CPU e è facile misurarne il costo poiché è solo una mesh standard. Può essere una seccatura integrarsi in una normale pipeline di rendering 2D basata su sprite.

In terzo luogo, è possibile utilizzare i campi di distanza in combinazione con un pixel shader . Questa è una tecnica relativamente nuova attualmente popolare, che utilizza un semplice shader per campionare una trama premade e il filtro bilineare "libero" sulla scheda video per scalare i glifi in modo pulito. Utilizza una memoria piccola e facilmente prevedibile rispetto ad altri metodi: una trama da 0,5 MB a 1 MB per set di caratteri per carattere. Si adatta perfettamente alle pipeline di rendering basate su sprite perché è basata su sprite; ogni glifo è ancora un quad testurizzato. Produce artefatti pixel, ma pochissimi rispetto ad altri metodi che ridimensionano le trame. Esiste anche un fallback a funzione fissa se i pixel shader non sono disponibili, ma il testo risulta molto aliasato. Poiché il campionamento viene eseguito in un pixel shader, ammette un po 'di piacere per gli occhi, come delineare e sfumare, a buon mercato.


3

C'è anche un articolo di ricerca di Microsoft Research di Loop e Blinn, sul rendering di curve indipendenti dalla risoluzione usando shader. Suggerisce di utilizzare la tecnica presentata per rendere il testo TrueType in modo indipendente dalla risoluzione.


1

Dovrai creare i caratteri del tuo carattere da una combinazione di curve e linee, che poi converti in geometria con un adeguato livello di dettaglio in fase di esecuzione.

Fortunatamente la maggior parte dei caratteri sono già realizzati con curve più bezier. Per ottenere i dati della curva è sufficiente utilizzare la funzione standard GetGlyphOutline () di Windows per estrarli.

Non sono sicuro di poter ottenere i dati di quella curva da C # senza PInvoke.


1
Al fine di rendere questo multipiattaforma e non preoccuparti delle cose di PInvoke, mi sembra che potresti essere in grado di scrivere uno strumento per scaricare i dati letti da GetGlyphOutline (vedi questa domanda SO ) in un formato personalizzato, e quindi avere alcuni semplici file I / O nel codice di gioco per caricare semplicemente i tuoi dati glifi memorizzati personalizzati.
Ricket,

0

Potresti dare un'occhiata a freetype. Non ho idea se è disponibile sulla tua piattaforma o se la licenza è applicabile, ma è una libreria open source piuttosto eccellente per il rendering di caratteri di tipo vero e altri caratteri vettoriali. Credo che dovessero fare qualche avvocato intelligente schivando il codice per ottenere il rendering dei caratteri in un modo esteticamente piacevole. Il vero metodo di tipo prevede codici byte su curve per fornire suggerimenti al renderer in modo tale che le caratteristiche importanti dei caratteri (come verticali e serif) non vengano sfocate come farebbero con l'antialiasing ingenuo standard. Quella tecnica ha un brevetto su di essa, quindi le persone di tipo libero hanno dovuto inventare qualcos'altro che ha fatto il lavoro e non ha invocato la terribile bestia avvocato di (penso) Apple. Ad ogni modo, pogramming a parte legale, prova a cercare il freetypehttp://freetype.sourceforge.net/index2.html

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.