Spero che qualcuno possa aiutarmi a capire GLViewport e cosa succede quando lo ridimensioniamo
Questo illustrerà la mia confusione ....
Quindi, qui ho un quad bloccato nel mezzo dello schermo. Se il mio GLViewport corrisponde alla larghezza e all'altezza del dispositivo, ottengo ciò che è nella prima immagine (a sinistra). Esattamente quello che mi aspetterei.
- Risoluzione del dispositivo, 2560 x 1600
- Risoluzione della finestra 2560 x 1600
- Dimensione quad 200 x 200 (Nota, l'immagine sopra non è in scala !!! :-))
- Forma quadrata, appare come quadrato
Ora, per la seconda immagine (mano destra) ...
- Risoluzione del dispositivo, 2560 x 1600
- Risoluzione della finestra 2560 x 1200 (e centrata verticalmente)
- Dimensione quadrupla (200, 200)
- Forma quadrata, appare come rettangolo
La mia domanda è: perché il quad ora viene visualizzato come un rettangolo e non un quadrato? Ho confermato registrando che il mio quad è di 200 x 200 pixel - sicuramente la dimensione dei pixel fisici rimane la stessa? Non possono cambiare. Quindi cosa sta succedendo qui?
Ho pensato (chiaramente in modo errato) che quando ho ridimensionato il viewport, il Mediterraneo ha appena tagliato i pixel.
Gradirei se qualcuno potesse spiegare come funziona.
modificare
Attualmente, sto impostando il mio viewport in questo modo:
width = (int) Math.min(deviceWidth, deviceHeight * 1.702127659574468);
height = (int) Math.min(deviceHeight, deviceWidth / 1.702127659574468);
ratio = width / height;
GLES20.glViewport(offsetX, offsetY, width, height);
Matrix.orthoM(mProjMatrix, 0, -ratio, ratio, -1, 1, 3, 7);
offsetX e offsetY sono solo in modo che quando ci sono cassette delle lettere, la finestra è centrata.
glScissor
invece di glViewport
, semplicemente ritaglierà i pixel senza cambiare dove viene eseguito il rendering di qualcosa. glViewport
si comporta più come ridimensionare l'immagine originale, piuttosto che ritagliarla; ecco perché schiaccia la tua scatola.