¿De qué debería preocuparme al cambiar el origen de OpenGL a la esquina superior izquierda de la pantalla?

11

Para la autoeducación, estoy escribiendo un motor de plataformas 2D en C ++ usando SDL / OpenGL. Inicialmente comencé con SDL puro usando los tutoriales en sdltutorials.com y lazyfoo.net, pero ahora estoy usando SDL para crear un contexto de representación OpenGL y luego renderizar con funciones OpenGL (específicamente modo inmediato, pero estoy aprendiendo acerca de VAO / VBO) ) Estoy usando SDL solo para interfaz, audio, etc.

SDL utiliza un sistema de coordenadas con el origen en la esquina superior izquierda de la pantalla y el eje y positivo apuntando hacia abajo. Es fácil configurar mi proyección ortográfica en OpenGL para reflejar esto.

Sé que las coordenadas de textura son un sistema de la derecha con valores de 0 a 1: voltear la textura verticalmente antes de renderizar (bueno, voltear el archivo antes de cargar) produce texturas que se procesan correctamente ... lo cual está bien si estoy dibujando toda la textura, pero en última instancia estaré usando mosaicos y puedo imaginar problemas.

¿Qué debería preocuparme en términos de renderizado cuando hago esto?

Si alguien tiene algún consejo o lo ha hecho ellos mismos y puede señalar dificultades futuras, sería genial, pero realmente cualquier comentario sería apreciado.

derivado
fuente
1
¿Está utilizando SDL para renderizar (como en las funciones de borrado de SDL), o está utilizando SDL para crear un contexto de representación de OpenGL, y luego está utilizando las funciones de OpenGL para renderizar?
Nicol Bolas
1
Estoy usando SDL para crear un contexto de representación de OpenGL y uso las funciones de OpenGL para representar. Aclararé esto en la pregunta.
derivado del
1
Tal vez si va a usar un sistema de física, vea mejor qué sistema de coordenadas usa (diestro o zurdo, Y-UP o Y-DOWN) y siga usando el mismo. Por supuesto, puede hacer cosas como invertir la gravedad, pero trataría de usar lo mismo para facilitar las cosas.
Gustavo Maciel

Respuestas:

8

"¿Qué debería preocuparme en términos de renderizado cuando hago esto?" - no mucho. Un sistema de coordenadas es solo una convención, no una regla estricta, y esto es algo legal y válido. Solo asegúrese de ser coherente en su propio uso y todo funcionará bien.

Maximus Minimus
fuente
¡Excelente! Tenía el presentimiento de que la autoconsistencia era lo único por lo que tenía que preocuparme, pero este es un territorio nuevo para mí.
derivado
1
Debo agregar que el querido viejo Quake hizo esto en 1996 y funcionó bien.
Maximus Minimus
5

Cuando trabajo en 2D con OpenGL, a menudo uso la esquina superior izquierda como origen. Esto se puede hacer con:

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

Sin embargo, hay algunas dificultades al cambiar el origen a la esquina superior izquierda.

Un escollo con el que me he encontrado más de una vez: glScissor()que se usa para recortar, siempre usa coordenadas inferiores a la izquierda.

Su firma es:

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

donde x, yespecifique la esquina inferior izquierda del cuadro de tijera.

De manera más general, todas las funciones que operan en coordenadas de ventana usan la parte inferior izquierda como origen. Esto incluye funciones como gluProject, gluUnProject, glCopyPixels, etc.

Pero algunas funciones, como el glDrawPixelsuso glRasterPospara el posicionamiento, y el glRasterPosuso de objetos (es decir, transformadas) coordenadas .

Si está ejecutando en Linux y sabe cómo usarlo man, es posible que desee obtener una copia de las páginas de manual de OpenGL aquí: ftp://ftp.sgi.com/sgi/opengl/doc/ Las encuentro en tiempo real. ahorrador.

Además, noto que dices "voltear el archivo antes de cargar" texturas. Esto no es necesario. En lugar de voltear la imagen al cargarla, simplemente voltee las coordenadas de textura para pasar de 1.0 a 0.0 al renderizar.

QuasarDonkey
fuente