Di cosa dovrei preoccuparmi quando cambio l'origine OpenGL nella parte superiore sinistra dello schermo?


11

Per l'autoeducazione, sto scrivendo un motore platform 2D in C ++ usando SDL / OpenGL. Inizialmente ho iniziato con SDL puro usando i tutorial su sdltutorials.com e lazyfoo.net, ma ora sto usando SDL per creare un contesto di rendering OpenGL e quindi renderizzare con le funzioni OpenGL (modalità specificamente immediata ma sto imparando i VAO / VBO ). Sto usando SDL solo per interfaccia, audio, ecc.

SDL utilizza un sistema di coordinate con l'origine nella parte superiore sinistra dello schermo e l'asse y positivo rivolto verso il basso. È facile impostare la mia proiezione ortografica in OpenGL per rispecchiarla.

So che le coordinate delle trame sono un sistema di destra con valori da 0 a 1: capovolgere la trama in verticale prima di renderizzare (beh, capovolgere il file prima del caricamento) produce trame che vengono visualizzate correttamente ... il che va bene se sto disegnando l'intera trama, ma alla fine userò i tileset e posso immaginare problemi.

Di cosa dovrei preoccuparmi in termini di rendering quando faccio questo?

Se qualcuno ha qualche consiglio o lo ha fatto da solo e può indicare insidie ​​future, sarebbe fantastico, ma davvero ogni pensiero sarebbe apprezzato.


1
Stai usando SDL per il rendering (come nelle funzioni blitting di SDL) o stai usando SDL per creare un contesto di rendering OpenGL, quindi usi le funzioni OpenGL per il rendering?
Nicol Bolas,

1
Sto usando SDL per creare un contesto di rendering OpenGL e uso le funzioni OpenGL per il rendering. Chiarirò questo nella domanda.
derivato

1
Forse se hai intenzione di utilizzare un sistema fisico, meglio vedere quale sistema di coordinate utilizza (destrorso o mancino, Y-UP o Y-DOWN) e continuare a utilizzare lo stesso. Ovviamente puoi fare cose come invertire Gravità, ma proverei a usare lo stesso per rendere più facile il thng.
Gustavo Maciel,

Risposte:


8

"Di cosa dovrei preoccuparmi in termini di rendering quando faccio questo?" - non tanto. Un sistema di coordinate è solo una convenzione, non una regola rigida, e questa è una cosa perfettamente legale e valida da fare. Assicurati solo di essere coerente nel tuo utilizzo e che tutto funzioni correttamente.


Grande! Avevo la sensazione che l'autoconsistenza fosse l'unica cosa di cui dovevo preoccuparmi, ma questo è un nuovo territorio per me.
derivato

1
Dovrei aggiungere che il caro vecchio Quake lo ha fatto nel 1996 e ha funzionato bene.
Maximus Minimus,

5

Quando lavoro in 2D con OpenGL, utilizzo spesso l'angolo in alto a sinistra come origine. Questo può essere fatto con:

glOrtho(0,      // left
        width,  // right
        height, // bottom
        0,      // top
        0,      // zNear
        1       // zFar
        );

Tuttavia, ci sono alcune insidie ​​quando si cambia l'origine in alto a sinistra.

Un errore che ho riscontrato più di una volta: glScissor()che viene utilizzato per il ritaglio, utilizza sempre le coordinate in basso a sinistra.

La sua firma è:

void glScissor( GLint x, GLint y, GLsizei width, GLsizei height )

dove x, yspecificare l' angolo in basso a sinistra della scatola delle forbici.

Più in generale, tutte le funzioni che operano nelle coordinate della finestra utilizzano tutte l'origine in basso a sinistra. Ciò include funzioni come gluProject, gluUnProject, glCopyPixels, etc.

Ma alcune funzioni come glDrawPixelsusare glRasterPosper il posizionamento e glRasterPosusano coordinate oggetto (cioè trasformate) .

Se usi Linux e sai come usarlo man, potresti prendere una copia delle manpage di OpenGL qui: ftp://ftp.sgi.com/sgi/opengl/doc/ Le trovo in tempo reale- saver.

Inoltre, noto che dici "capovolgi il file prima di caricare" le trame. Questo non è necessario Invece di capovolgere l'immagine durante il caricamento, capovolgere le coordinate della trama per passare da 1,0 a 0,0 durante il rendering.

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.