2011-09-01 18 views
5

Come è possibile allineare le trame con i pixel dello schermo per una grafica pixel perfetta in OpenGL ES 2.0? Questo è fondamentale per un progetto su cui sto lavorando e che utilizza la grafica pixel art. Qualsiasi aiuto su questo sarebbe fantastico!iPhone OpenGL ES 2.0 - Pixel Perfect Textures

+1

Un'altra cosa ... assicurati di avere "precision highp float" nella parte superiore dello shader. Se la tua trama è più grande di 1024x1024, mediump non ti darà abbastanza precisione per campionare ogni pixel nella texture. –

risposta

9

Vedere la mia risposta qui: OpenGL Texture Coordinates in Pixel Space


questo è stato chiesto un paio di volte, ma non abbiamo il link a portata di mano, in modo da una spiegazione rapida e ruvido. Diciamo la trama è larga 8 pixel:

| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 
^ ^^^^^^^^
0.0 | | | | | | | 1.0 
| | | | | | | | | 
0/8 1/8 2/8 3/8 4/8 5/8 6/8 7/8 8/8 

Le cifre denotano pixel della texture, le barre i bordi del tessuto e in caso di filtraggio più vicina al confine tra pixel. Tu vuoi comunque colpire i centri dei pixel. Quindi siete interessati nella texture coordinate

(0/8 + 1/8)/2 = 1/(2 * 8)

(1/8 + 2/8)/2 = 3/(2 * 8)

...

(7/8 + 8/8)/2 = 15/(2 * 8)

o più in generale per pixel i in una vasta trama N la coordinata della trama corretta è

(2i + 1)/(2N)

Tuttavia, se si desidera allineare perfettamente la trama con i pixel dello schermo, ricordare che ciò che si specifica come coordinate non sono i pixel di un quad, ma i bordi che, a seconda della proiezione, potrebbero allinearsi con i bordi dei pixel dello schermo, non i centri richiedono altre coordinate di trama.

+0

Grazie! Questo ha aiutato. – Marc

+1

Non sono d'accordo un po '- non c'è motivo per fare qualcosa di speciale. GL garantisce che il campione variabile sarà sempre calcolato da qualche parte all'interno del pixel (di solito il centro), quindi non c'è bisogno di fare nulla di speciale. Basta disegnare la trama come un quad, usare GL_NEAREST per la trama e (0,0,1,1) come coordinate della trama. Finché la trama ha le stesse dimensioni del quad nello spazio dello schermo, il disegno della trama sarà pixel perfetto. –

1

Questo collegamento può essere utile:

http://glprogramming.com/red/appendixg.html#name1

guardare "Se esatto rasterizzazione bidimensionale si desidera ...". Questo suggerimento di OpenGl ti spiega come configurare al meglio la tua matrice per 2D.

Inoltre, potrebbe essere necessario disabilitare qualsiasi tipo di filtro trama.

+0

Questo è un buon consiglio per OpenGL legacy, ma non si applica direttamente a ES 2.0 – andrewmu

+0

@andrewmu: Non lo sapevo - Potresti spiegare perché? ES è così diverso? – neodelphi

+0

Grazie mille ma, come ha detto ardrewmu, tali operazioni con le matrici non sono disponibili in ES 2.0. Sebbene avessi già guardato prima, avrebbe potuto essere d'aiuto. – Marc