SDL2 com OpenGL - resultados estranhos, o que há de errado?

8

Estou portando um aplicativo para iOS e, portanto, preciso atualizá-lo para SDL2 a partir do SDL1.2 (até agora estou testando-o apenas como um aplicativo de desktop OS X). No entanto, ao executar o código com SDL2, estou obtendo resultados estranhos, como mostrado na segunda imagem abaixo (a primeira imagem é como fica com o SDL, corretamente). O único changeset que causa isso é esse , você vê algo obviamente errado lá ou o SDL2 tem algumas nuances do OpenGL que eu desconheço? Meu SDL é baseado no mais recente da HG .

Atualização: outra pergunta sobre a porta iOS do mesmo projeto está aqui .

Atualização 2: agora também no grupo de notícias SDL: http://thread.gmane.org/gmane.comp.lib.sdl/58026

Atualização 3: Tentei usar o Regal para o OpenGL portátil, o resultado não é tão bom na terceira captura de tela, produzida apenas pela substituição

#include <OpenGL/gl.h>
#include <OpenGL/glu.h>

com

#include "GL/Regal.h"
#include "GL/RegalGLU.h"

usando SDL 1.2 usando SDL 2 usando Regal com SDL 2

Gabor
fonte
11
É possível que (por qualquer motivo) os sprites / partículas sejam simplesmente girados ~ 90 ° ou esticados em retângulos muito finos? Uma visão de estrutura de arame deve permitir que você verifique isso rapidamente.
2
De acordo com o conjunto de alterações vinculado, você está renderizando usando glCallLists (), que não é suportado no OpenGL ES (que é o que você usará no iOS). (Eu sou o tipo de surpresa que ele não lhe dá erros de compilação no iOS, para ser honesto.)
Trevor Powell
as imagens estavam vindo do OS X, a portabilidade iOS veio depois que (um glCallLists só foi utilizado para renderização de texto que era específico do Linux para que eu não estava usando-lo ainda no OS X)
Gabor

Respostas:

7

Aqui está o seu aviso de problema. Comento a superfície = SDL_Get ... estava dando alguns resultados estranhos. Você também esqueceu de criar o contexto OpenGL. Entre em contato se tiver outros problemas.

SDLWindow::SDLWindow(int width, int height, double axisLen, const std::string &caption)
:m_fov(axisLen)
,m_width(0)
,m_height(0)
,m_fps(0)
,m_idxSnapshot(0)
,m_camPos(0, 0, 2)
,m_camLookAt(0, 0, 0)
,m_camOrient(0, 1, 0)
,surface(NULL)
,m_texStar(0)
,m_bRunning(true)
{
SDL_GLContext ctx;

if (SDL_Init(SDL_INIT_VIDEO) < 0)
    throw std::runtime_error(SDL_GetError());
atexit(SDL_Quit);

SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 );
SDL_GL_SetAttribute( SDL_GL_DEPTH_SIZE, 0 );
SDL_GL_SetAttribute( SDL_GL_RETAINED_BACKING, 1 ); 

 if ((window = SDL_CreateWindow(caption.c_str(), SDL_WINDOWPOS_CENTERED,
 SDL_WINDOWPOS_CENTERED, width, height, SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN | 
 SDL_WINDOW_BORDERLESS)) == NULL)
    throw std::runtime_error(SDL_GetError());     

/*if ((surface = SDL_GetWindowSurface(window)) == NULL)
    throw std::runtime_error(SDL_GetError());*/

m_width = width;
m_height = height;

ctx = SDL_GL_CreateContext(window);

InitGL();
}
Steven
fonte