2012-07-16 11 views
16

Mi chiedo se ci sia una libreria grafica che supporta il rendering RGB subpixel (come ClearType) per la grafica generale, non solo per il testo. Ciò consentirebbe praticamente di triplicare la risoluzione orizzontale e mettere la grafica su posizioni x del terzo pixel.RGB subpixel rendering per la grafica?

Mentre penso che questo sarebbe molto utile, non ho potuto trovare molto su internet su di esso, ad eccezione di quanto segue:

C'è qualche libreria che implementa questo, o ci sono sforzi per portare qualcosa come questo alla biblioteca del Cairo, per esempio?


Aggiornamento:

mi riferisco in particolare a tecniche di rendering che tengano conto del fatto che usano schermi LCD attuali sub-pixel di colori diversi. Per fare un punto bianco, è possibile impostare tutti i subpixel a 'on' o 255. Una linea bianca sarebbe parecchi subpixel uno sopra l'altro:

...RGB... 
...RGB... 
...RGB... 
...RGB... 
...RGB... 
...111... 

(dove . è un sub-pixel completamente nero, e R, G o B sono sotto-pixel rossi, verdi o blu completamente illuminati). Poiché i nostri occhi non possono risolvere i sub-pixel, si fondono insieme per formare una linea bianca. Potrei però anche fare una linea bianca dalla seguente:

....GBR.. 
....GBR.. 
....GBR.. 
....GBR.. 
....GBR.. 
....111.. 

noti che è perfettamente tagliente, ma posizionato in x = 1 1/3 pixel. Questo non è possibile con le tecniche di rendering tradizionali che disegnano invece una linea bianca leggermente sfocata. Qui ad esempio R = 70% acceso, r = 30% acceso. Non ho lavorato fuori la matematica, questo è solo così si ottiene l'idea:

...RGBrgb... 
...RGBrgb... 
...RGBrgb... 
...RGBrgb... 
...RGBrgb... 
...777333... 

Un altro esempio è un pendio, che si può fare a) con pixel pieni, b) antialias, oppure c) con subpixel Rendering:

a) RGB...... b) RGB...... c) RGB...... 
    RGB......  RGBrgb...  .GBR..... 
    ...RGB...  rgbRGB...  ..BRG.... 
    ...RGB...  ...RGB...  ...RGB... 
    ...RGB...  ...RGBrgb  ....GBR.. 
    ......RGB  ...rgbRGB  .....BRG. 
    ......RGB  ......RGB  ......RGB 

Anche in questo caso, si noti che questo è solo un esempio di greggio per darvi l'idea generale, ma si vede che a) è jaggy o alias, b) è sfocata, e c) è tagliente come te può farlo su un LCD.

Realizzazioni reali di questo, per la visualizzazione dei caratteri (ClearType su Windows e il rendering subpixel in FreeType) hanno un algoritmo più sofisticato. Prendono in considerazione che i singoli sub-pixel sanguinano o brillano l'uno nell'altro, preservano l'intensità o l'energia del colore totale. Considera anche che la spaziatura subpixel non è uniforme (la spaziatura tra R e G, o G e B (nel pixel) può essere inferiore a quella tra B e R), e infine che alcuni display hanno layout di pixel completamente diversi.

+0

Cairo supporta il posizionamento del sotto pixel. Tutte le coordinate sono a doppia precisione. Vedi [cairo_line_to] (http://www.cairographics.org/manual/cairo-Paths.html#cairo-line-to) per un esempio – mbonnin

+1

Sono consapevole che puoi usare le coordinate non interi, ma mi riferisco al rendering subpixel RGB, non solo al rendering antialiasing. Il rendering RGB subpixel tiene conto del fatto che ciascun pixel su uno schermo LCD è composto da un sottopixel rosso, verde e blu. Aggiornerò la domanda con un po 'più di dettaglio – jdm

+0

ok, capito. in realtà non sapevo che alcuni motori di font potessero fare questo (dubito che il freetype "spacchi" i pixel nei loro valori RGB, vero?). Anche questo dipenderebbe dalla reale configurazione della matrice rgb, quindi potrebbe finire per fare più male che bene su schermi come [nexus one] (http://arstechnica.com/gadgets/2010/03/secrets-of-the-nexus -ones-screen-science-color-and-hacks /) – mbonnin

risposta

5

Per quanto ne so, non esiste una libreria grafica con rendering RGB subpixel.

Ecco alcuni possibili motivi per cui:

  • Microsoft ha una tecnologia di rendering subpixel few patents su RGB. Non so se questi brevetti si applicano solo alla rasterizzazione dei font, ma in caso contrario, è probabilmente una buona ragione per cui altre librerie grafiche non la usano.
  • Come indicato nella domanda, il rendering di subpixel si basa su un'implementazione hardware. Funziona bene con i display che compongono il colore posizionando parallelamente 3 celle di colore (ad esempio un monitor LCD). Per tutti gli altri tipi di display (plasma, proiettori, vecchio CRT), non funziona.
  • Il rendering subpixel aggiunge solo la risoluzione orizzontale. Questa limitazione non è un problema per la rasterizzazione dei font poiché spesso è orizzontale che il font ha bisogno di più risoluzione (vedi caratteri in grassetto e corsivo e crenatura). Con la grafica "personalizzata" sarebbe strano avere una risoluzione diversa su ciascun asse.
  • Il rendering di sottopixel non funziona con il display rotazionale. Ad esempio, il dispositivo mobile deve utilizzare sia il rendering subpixel RGB che l'antialiasing.
  • Il rendering di subpixel funziona solo con la risoluzione nativa di un display.
  • Sembra che i daltonici abbiano problemi con il rendering subpixel. Vedere questo paper per ulteriori informazioni.
  • Il rendering di subpixel funziona molto bene con il nero su sfondo bianco o bianco su nero. Con altri backgounds il "renderer" deve conoscere il colore di sfondo per regolare l'effetto subpixel. Proprio per questo motivo Office 2013 ha smesso di utilizzare ClearType.
  • Questo è più soggettivo, ma la differenza tra il rendering subpixel e l'antialiasing è molto sottile. I contro e la complessità aggiunta del rendering subpixel potrebbero non valerne la pena.

IMHO, il futuro di una grafica migliore è con più alto pixel density come il display retina Apple.

0

Qualcuno è riuscito a ottenere alcuni risultati interessanti utilizzando ImageMagick. Il metodo, i risultati e un'interessante discussione sono esposti qui: https://www.imagemagick.org/discourse-server/viewtopic.php?t=19120

Interessante, anzi. Ma il punto rimane: quanto può essere utile la tecnica, dal momento che tale processo andrebbe a beneficio solo delle immagini non scalate su un tipo specifico di display?