In primo luogo, OpenGL utilizza più sistemi di coordinate, pertanto non esiste "il sistema di coordinate OpenGL". Ciò a cui ti riferisci sono le coordinate normalizzate del dispositivo (NDC), in cui tutte e tre le coordinate sono comprese nell'intervallo [-1, 1]. I diversi sistemi di coordinate e i loro nomi sono spiegati here, nella sezione "9.011 Come vengono trasformate le coordinate? Quali sono i diversi spazi di coordinate?". 1)
In secondo luogo, per evitare confusione, in OpenGL il termine "finestra di visualizzazione" si riferisce alla parte della finestra in cui viene eseguito il rendering e si trova nelle coordinate della finestra. Nella tua domanda lo hai usato per descrivere la porzione (l, r, t, b) = (- 500, -500, 1200, 1200) del tuo mondo che vuoi rendere, che è nelle coordinate del mondo.
Hai chiesto come "calcolare dove disegnare oggetti sullo schermo". Quello che devi fare è definire una trasformazione (una matrice 4x4) che mappa da un sistema di coordinate all'altro. Il tuo mondo 2D è dato in coordinate del mondo, quindi devi definire una matrice che trasforma le coordinate del mondo in NDC, cioè una matrice di proiezione. Nei tuoi shader, quindi, puoi semplicemente moltiplicare i tuoi vertici con questa matrice di proiezione e ottieni NDC. glm::ortho
/glOrtho
calcola tale matrice di proiezione. Per quanto riguarda la proiezione prospettica, non è chiaro cosa si vuole fare, ma si dovrebbe sperimentare con le funzioni perspective
e lookat
in glm.
Per essere chiari, si definiscono i vertici in qualsiasi sistema di coordinate desiderato (che è chiamato il sistema di coordinate del mondo) e si disegnano semplicemente questi vertici. Il lavoro del tuo vertex shader consiste nell'applicare la trasformazione che hai definito.
Nota anche che hai specificato un quadrato e in genere non è quello che desideri. I monitor e la maggior parte delle finestre non sono quadrati, quindi se mappi quel quadrato su un tipico viewport, otterresti una visione distorta del tuo mondo. È necessario calcolare il rapporto aspetto (larghezza: altezza) della finestra. Ho provato a spiegare che here.
1) Come nota a margine, le FAQ sono piuttosto vecchie e si riferiscono alle versioni precedenti di OpenGL. Oggigiorno, i programmatori sono previsti e incoraggiati a gestire sia la vista del modello che le matrici di proiezione stesse, dal momento che ne avete bisogno nei vostri shader. Consiglio vivamente lo glm, è solo un'intestazione, quindi è molto facile da integrare, e ha una bella sintassi che rispecchia il GLSL.
Se si utilizza una matrice di proiezione ortografica, la vista può e sarà sempre e solo 2D in quanto ignora l'asse Z, corretto? Per la maggior parte delle cose che sto facendo va bene, ma voglio essere in grado di sperimentare usando l'asse Z per creare prospettive meno piatte su mondi 2D. Quindi, come si definisce la matrice di trasformazione per la prospettiva piuttosto che l'ortogonale? Quali funzioni GL lo fanno? – bgroenks
1) No, non ignora l'asse Z, proietta semplicemente tutto con la stessa coordinata xy sullo stesso pixel. Ma puoi ancora fare test di profondità. 2) 'glm :: perspective'. –
Come usi glm :: perspective? Come interagisce con 'gl_ModelViewProjectionMatrix'? – bgroenks