LINUX.ORG.RU

Использование SDL2 с OpenGL


0

1

Есть простенькая игрушка на SDL, решил выбрать 2 версию, из-за чего гугл дает мало информации, либо она устаревшая.

Для начала хочу нарисовать хотя бы прямоугольник, делаю так:

bool onInit() {
//...
    if(SDL_Init(SDL_INIT_EVERYTHING) == -1) return false;

    if(TTF_Init() == -1) return false;

    window = SDL_CreateWindow("Game", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN|SDL_WINDOW_OPENGL);

    if(window == nullptr) return false;

    SDL_GLContext glcontext = SDL_GL_CreateContext(window);

    glMatrixMode(GL_PROJECTION|GL_MODELVIEW);
    glLoadIdentity();
    glOrtho(0.0f, SCREEN_WIDTH, SCREEN_HEIGHT, 0.0f, 0.0f, 1.0f);

    renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);

    if(renderer == nullptr) return false;
//...
}
void Miner::onRender() {
    SDL_RenderClear(renderer);

//...

    glColor3f(0.0,1.0,0.0);
    glBegin(GL_POLYGON);
      glVertex2f(0.0f, 160.0f);
      glVertex2f(160.0f, 160.0f);
      glVertex2f(160.0f, 180.0f);
      glVertex2f(0.0f, 180.0f);
    glEnd();

//...

    SDL_RenderPresent(renderer);
}

Прямоугольник рисуется, но вместо изменения цвета прямоугольника меняется цвет всего в окне, в том числе и изображений, нарисованных SDL2.

Код написал из кусков документации и не понимаю в чем может быть проблема. Как правильно подключвть OpenGl для рисование наравне с SDL2?



Последнее исправление: uchiro (всего исправлений: 1)
Ответ на: комментарий от Bad_ptr

Да, но если сделать так:

    glColor3f(1.0,0.0,0.0);
    glBegin(GL_POLYGON);
      glVertex2f(0.0f, 160.0f);
      glVertex2f(160.0f, 160.0f);
      glVertex2f(160.0f, 180.0f);
      glVertex2f(0.0f, 180.0f);
    glEnd();
    glColor3f(1.0,1.0,1.0);

То прямоугольник рисуется черным цветом

uchiro
() автор топика
Ответ на: комментарий от uchiro

скорее всего так нельзя миксовать поверхности SDL с опенгл кодом.
Скорее всего, чтобы показать SDLповерхность тебе нужно из SDLповерхности сделать openGL текстуру и натянуть её на какую-то геометрию(квад).
http://content.gpwiki.org/index.php/SDL:Tutorials:Using_SDL_with_OpenGL

Bad_ptr ★★★★★
()
Последнее исправление: Bad_ptr (всего исправлений: 1)
Ответ на: комментарий от Bad_ptr

прозреваю, что это не проблема сурфейсов, а проблема использования SDL_CreateRenderer и ручного рендера на один и тот же контекст.

x0r ★★★★★
()

решил выбрать 2 версию, из-за чего гугл дает мало информации, либо она устарвшая

как же ты так разрабатываешь, если не в курсе состояния базовой библиотеки

а уже если шипать результат придется, то могут начаться неожиданные проблемы

mos ★★☆☆☆
()
Ответ на: комментарий от x0r

В applySurface есть функция SDL_RenderCopy сложно чем-то заменить.

SDL_GL_SwapBufffers была в версии SDL1.*, а в SDL2 есть только SDL_GL_SwapWindow(SDL_Window* window);

Если заменить SDL_RenderClear и SDL_RenderPresent на GL функции ничего не изменяется.

Моя цель нарисовать прямоугольник для статусной панельки, простым примитивом или маштабируймой текстуркой. Чем кроме GL это можно сделать или как через GL можно это сделать? Для SDL1.* была SDL_gfx, под SDL2 порт еще не готов.

uchiro
() автор топика
Ответ на: комментарий от mos

Да я и не против проблем. Как раз и хотел поразбирать 2 версию, но сейчас столкнулся с проблемой, которую не могу решить.

uchiro
() автор топика
Ответ на: комментарий от uchiro

ну она как бы не вышла даже, хотя вот-вот уже обещают. не удивительно, что инфы нет.

mos ★★☆☆☆
()
Ответ на: комментарий от uchiro

Моя цель нарисовать прямоугольник для статусной панельки,

ну дак сделай опенГЛ текстуру из сдлного сурфейса, и натяни эту текстуру на опенГЛный прямоугольник.

Bad_ptr ★★★★★
()
Ответ на: комментарий от Bad_ptr

Сначала рисует SDL, потом мне нужно нарисовать прямоугольник GL, а потом, поверх него еще раз рисует SDL, по другому никак.

И способ с перводом всего нарисованного в OpenGL текстурку получается не удобный.

uchiro
() автор топика
Ответ на: комментарий от x0r

Стандартными средствами SDL нельзя нарисовать прямоугольник или отмаштабировать текстурку. Или я ошибаюсь?

uchiro
() автор топика
Ответ на: комментарий от uchiro

Сначала рисует SDL, потом мне нужно нарисовать прямоугольник GL, а потом, поверх него еще раз рисует SDL, по другому никак.

сначала рисует SDL в свой буффер(сурфейс), потом из пикселей этого буфера создаётся опенгл текстура. Потом рисуются объекты посредством опенГЛ, потом поверх объектов опенГЛем же рисуется прямоугольник с наложением текстуры, созданной из сдл сурфейса(man ортографическая проэкция, хотя и не обязательно). Всё.

Bad_ptr ★★★★★
()
Ответ на: комментарий от uchiro

у тебя есть SDL_Surface с текстурой, у тебя есть SDL_Surface полученный от SDL_SetVideoMode, у тебя есть божественный SDL_BlitSurface.

x0r ★★★★★
()
Ответ на: комментарий от x0r

Все оказалось гораздо проще:

  SDL_Texture* barImage = loadImage("image/bar.png");
  //Указываем позицию
  SDL_Rect barPosition;
  barPosition.x = 0; barPosition.y = fieldSize.h * cellSize.h;
  barPosition.w = fieldSize.w * cellSize.w; barPosition.h = 20;
  //И он растягивает все как надо сам 
  SDL_RenderCopy(renderer, barImage, NULL, &barPosition);  
uchiro
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.