SDL2 con OpenGL: resultados extraños, ¿qué pasa?

8

Estoy transfiriendo una aplicación a iOS y, por lo tanto, necesito actualizarla a SDL2 desde SDL1.2 (hasta ahora solo la estoy probando como una aplicación de escritorio OS X). Sin embargo, cuando ejecuto el código con SDL2, obtengo resultados extraños como se muestra en la segunda imagen a continuación (la primera imagen es cómo se ve con SDL, correctamente). El único conjunto de cambios que causa esto es este , ¿ves algo obviamente mal allí, o SDL2 tiene algunos matices de OpenGL que desconozco? Mi SDL se basa en lo último de HG .

Actualización: otra pregunta sobre el puerto iOS del mismo proyecto está aquí .

Actualización 2: ahora también está en el grupo de noticias SDL: http://thread.gmane.org/gmane.comp.lib.sdl/58026

Actualización 3: Intenté usar Regal para OpenGL portátil, el resultado no tan bueno está en la tercera captura de pantalla, producida simplemente reemplazando

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

con

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

usando SDL 1.2 usando SDL 2 usando Regal con SDL 2

Gabor
fuente
1
¿Es posible que (por cualquier razón) los sprites / partículas simplemente se roten ~ 90 ° o se estiren en rectángulos muy delgados? Una vista de estructura metálica debería permitirle verificar eso rápidamente.
2
De acuerdo con el conjunto de cambios que vinculó, está renderizando usando glCallLists (), que no es compatible con OpenGL ES (que es lo que usará con iOS). (Para ser honesto, estoy un poco sorprendido de que no te dé errores de compilación en iOS).
Trevor Powell el
las capturas de pantalla provenían de OS X, el portado de iOS vino después de eso (una glCallLists solo se usó para la representación de texto que era específica de Linux, por lo que no la estaba usando incluso en OS X)
Gabor

Respuestas:

7

Aquí está el aviso de su problema. Comento en la superficie = SDL_Get ... estaba dando algunos resultados extraños. También olvidó crear el contexto OpenGL. Avísame si tienes otros 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
fuente