Com o que devo me preocupar ao alterar a origem do OpenGL para o canto superior esquerdo da tela?

11

Para auto-educação, estou escrevendo um mecanismo de plataformas 2D em C ++ usando SDL / OpenGL. Inicialmente, comecei com SDL puro usando os tutoriais em sdltutorials.com e lazyfoo.net, mas agora estou usando SDL para criar um contexto de renderização OpenGL e renderizar com funções OpenGL (modo especificamente imediato, mas estou aprendendo sobre VAOs / VBOs ) Estou usando SDL apenas para interface, áudio etc.

O SDL usa um sistema de coordenadas com a origem no canto superior esquerdo da tela e o eixo y positivo apontando para baixo. É fácil configurar minha projeção ortográfica no OpenGL para refletir isso.

Eu sei que as coordenadas de textura são um sistema do lado direito com valores de 0 a 1 - inverter a textura verticalmente antes da renderização (bem, inverter o arquivo antes do carregamento) produz texturas que são renderizadas corretamente ... o que é bom se eu estiver desenhando toda a textura, mas no final vou usar conjuntos de peças e posso imaginar problemas.

Com o que devo me preocupar em termos de renderização quando faço isso?

Se alguém tiver algum conselho ou já tiver feito isso e puder apontar armadilhas futuras, isso seria ótimo, mas qualquer pensamento seria apreciado.

derivado
fonte
1
Você está usando SDL para renderizar (como nas funções de blitting do SDL) ou está usando SDL para criar um contexto de renderização OpenGL e, em seguida, usando funções OpenGL para renderizar?
Nicol Bolas
1
Estou usando SDL para criar um contexto de renderização OpenGL e usando funções OpenGL para renderizar. Vou esclarecer isso na pergunta.
derivado
1
Talvez se você for usar um sistema de física, veja melhor qual sistema de coordenadas ele usa (destro ou canhoto, Y-UP ou Y-DOWN) e continue usando o mesmo. Claro que você pode fazer coisas como inverter a gravidade, mas eu tentaria usar o mesmo para facilitar as coisas.
12138 Gustavo Maciel

Respostas:

8

"Com o que devo me preocupar em termos de renderização quando faço isso?" - não muito. Um sistema de coordenadas é apenas uma convenção, não uma regra rígida e rápida, e isso é perfeitamente legal e válido. Apenas certifique-se de que você seja consistente em seu próprio uso e de que tudo funcione bem.

Maximus Minimus
fonte
Ótimo! Eu tinha um pressentimento de que era a única coisa que precisava me preocupar, mas esse é um novo território para mim.
derivado
1
Devo acrescentar que o querido e velho Quake fez isso em 1996 e funcionou muito bem.
Maximus Minimus
5

Ao trabalhar em 2D com o OpenGL, costumo usar o canto superior esquerdo como origem. Isso pode ser feito com:

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

No entanto, existem algumas armadilhas ao alterar a origem para o canto superior esquerdo.

Uma armadilha que encontrei mais de uma vez:, glScissor()que é usada para recortar, sempre usa coordenadas no canto inferior esquerdo.

Sua assinatura é:

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

onde x, yespecifique o canto inferior esquerdo da caixa de tesoura.

De maneira mais geral, todas as funções que operam nas coordenadas da janela usam a parte inferior esquerda como origem. Isto inclui funções como gluProject, gluUnProject, glCopyPixels, etc.

Mas algumas funções como glDrawPixelsuso glRasterPospara posicionamento e glRasterPosusa coordenadas de objeto (ou seja, transformadas) .

Se você está executando no Linux e sabe como usá- manlo, convém pegar uma cópia das páginas de manual do OpenGL aqui: ftp://ftp.sgi.com/sgi/opengl/doc/ Acho que são em tempo real - economizador.

Além disso, notei que você diz "virar o arquivo antes de carregar" texturas. Isso não é necessário. Em vez de inverter a imagem ao carregá-la, basta virar as coordenadas da textura para ir de 1,0 a 0,0 ao renderizar.

QuasarDonkey
fonte