SDL2 с OpenGL - странные результаты, что не так?

8

Я портирую приложение на iOS, и поэтому мне нужно обновить его до SDL2 с SDL1.2 (пока я тестирую его только как приложение для настольной системы OS X). Однако при выполнении кода с SDL2 я получаю странные результаты, как показано на втором изображении ниже (первое изображение - это то, как оно выглядит с SDL, правильно). Единственный набор изменений, который вызывает это , это то, видите ли вы что-то явно не так, или SDL2 имеет некоторые нюансы OpenGL, о которых я не знаю? Мой SDL основан на последнем из HG .

Обновление: еще один вопрос о порте iOS того же проекта здесь .

Обновление 2: теперь это также в группе новостей SDL: http://thread.gmane.org/gmane.comp.lib.sdl/58026

Обновление 3: я пытался использовать Regal для портативного OpenGL, не очень хороший результат на третьем скриншоте, полученном просто заменой

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

с

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

используя SDL 1.2 используя SDL 2 использование Regal с SDL 2

Gabor
источник
1
Возможно ли, что (по какой-либо причине) спрайты / частицы просто поворачиваются на 90 ° или растягиваются до очень тонких прямоугольников? Каркасный вид должен позволить вам быстро это проверить.
2
В соответствии с набором изменений, который вы связали, вы выполняете рендеринг с помощью glCallLists (), который не поддерживается в OpenGL ES (то, что вы будете использовать в iOS). (Я немного удивлен, что это не дает вам ошибок компиляции на iOS, если честно.)
Тревор Пауэлл
скриншоты были из OS X, портирование iOS последовало после этого (glCallLists использовался только для рендеринга текста, который был специфичен для Linux, поэтому я не использовал его даже в OS X)
Gabor

Ответы:

7

Вот ваше замечание о проблеме. Я закомментировал поверхность = SDL_Get ... она дала какие-то странные результаты. Также вы забыли создать контекст OpenGL. Дайте мне знать, если у вас есть другие вопросы.

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();
}
Стивен
источник