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


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();
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.