Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / Форум / SDL_GL_BindTexture not supported

SDL_GL_BindTexture not supported

altRunПользовательwww16 сен. 20189:45#0
Всем доброго дня!

Только начал изучать SDL. Нужно использовать её совместно с openGL.
Стал вопрос чем создать текстовые текстуры. Долго не думая, взял его расширение SDL_TTF.
Для этого нужно было сформировать текстуру текста с помощью SDL и передать её openGL-у.
Однако все уперлось в SDL_GL_BindTexture который почему-то не поддерживается. В чем может быть причина?

Текстура с помощью созданного SDL рендера нормально рисуется им же.
Версия SDL стоит последняя (2.0.8). SDL_GL_BindTexture работает c 2.0.0.

AndreyПостоялецwww20 сен. 201810:34#1
altRun
> Однако все уперлось в SDL_GL_BindTexture который почему-то не поддерживается.
замени на вызов glBindTexture, правда я не знаю как вытянуть texture id из SDL_exture
Vlad2001_MFSПостоялецwww20 сен. 201821:18#2
altRun
А что SDL_GetError возвращает? Или SDL_GetError и пишет, что SDL_GL_BindTexture not supported? Контекст OpenGL свой используешь или SDL_Renderer? Сам OpenGL инициализируется успешно?

Правка: 20 сен. 2018 21:22

altRunПользовательwww21 сен. 201814:24#3
Vlad2001_MFS
> А что SDL_GetError возвращает? Или SDL_GetError и пишет, что SDL_GL_BindTexture not supported?
Да. "That operation is not supported", если дословно.

Vlad2001_MFS
> Контекст OpenGL свой используешь или SDL_Renderer? Сам OpenGL инициализируется успешно?
Контекст openGL-овский. Создается нормально.

Воспользовался советом Andrey. Использую генерацию и связку текстур стандартную. Потом загружаю SDL_surface прямо в glTexImage2D.
Нужно только преобразовывать идентификатор пиксельного формата SDL в openGL. Благо вариантов там не много.

Vlad2001_MFSПостоялецwww21 сен. 201816:57#4
altRun
Если меня не подводит мой английский, то как раз твой случай описан во 2-м абзаце.
altRunПользовательwww21 сен. 201822:52#5
Vlad2001_MFS
> Если меня не подводит мой английский, то как раз твой случай описан во 2-м абзаце.
Это читал в первую очередь когда столкнулся с этой проблемой, но тогда не так понял.
Сейчас мне вообще не ясно что она делает.

То есть целевой openGL контекст должен быть скрыт за SDL_Renderer?
Но в самом начале страницы сказано: "...bind an OpenGL/ES/ES2 texture to the current context...".

SDL_GL_MakeCurrent(SDL_GLContext)//?????

Или подразумевается "current" для данной текстуры того SDL_Renderer в котором она и была создана? (кажется именно это написано в абзаце)
Если это так, то зачем тогда она нужна? Все (если не ошибаюсь) SDL функции для работы с текстурой используют указатель на SDL_Texture.
Что делает эта функция?

Изначально использовать её так не получилось:

  pWindow_ = SDL_CreateWindow(..., SDL_WINDOW_SHOWN | SDL_WINDOW_OPENGL);
//...

  pRenderer_ = SDL_CreateRenderer(pWindow_, -1, SDL_RENDERER_ACCELERATED);
  pGLContext_ = SDL_GL_CreateContext(pWindow_);
  SDL_GL_MakeCurrent(pWindow_, pGLContext_ );
//...

  SDL_Surface* pSurface = TTF_RenderText_Blended(...);
  pTexture_ = SDL_CreateTextureFromSurface(pRenderer_, pSurface);
  SDL_FreeSurface(pSurface);
//...

  SDL_GL_BindTexture(pTexture_, NULL, NULL);
  //Что-то делаем с текстурой так, вроде был вызван glBindTexture(...);, за исключением того, что
  //вместо GLuint используется указатель на SDL_Texture. В текущем контексте SDL_GLContext.

Vlad2001_MFSПостоялецwww22 сен. 20180:10#6
altRun
Как я понял эта функция предназначена только для использования с контекстом OpenGL, который был создан SDL_Renderer.
Вот реализация этой функции в файле "SDL/src/render/opengl/SDL_render_gl.c":
static int GL_ActivateRenderer(SDL_Renderer * renderer)
{
    GL_RenderData *data = (GL_RenderData *) renderer->driverdata;

    if (SDL_CurrentContext != data->context ||
        SDL_GL_GetCurrentContext() != data->context) {
        if (SDL_GL_MakeCurrent(renderer->window, data->context) < 0) {
            return -1;
        }
        SDL_CurrentContext = data->context;

        GL_UpdateViewport(renderer);
    }

    GL_ClearErrors(renderer);

    return 0;
}

static int GL_BindTexture (SDL_Renderer * renderer, SDL_Texture *texture, float *texw, float *texh)
{
    GL_RenderData *data = (GL_RenderData *) renderer->driverdata;
    GL_TextureData *texturedata = (GL_TextureData *) texture->driverdata;
    GL_ActivateRenderer(renderer); // Обрати внимание сюда

    data->glEnable(texturedata->type);
    if (texturedata->yuv) {
        data->glActiveTextureARB(GL_TEXTURE2_ARB);
        data->glBindTexture(texturedata->type, texturedata->vtexture);

        data->glActiveTextureARB(GL_TEXTURE1_ARB);
        data->glBindTexture(texturedata->type, texturedata->utexture);

        data->glActiveTextureARB(GL_TEXTURE0_ARB);
    }
    data->glBindTexture(texturedata->type, texturedata->texture);

    if(texw) *texw = (float)texturedata->texw;
    if(texh) *texh = (float)texturedata->texh;

    return 0;
}
TheLightWayПостоялецwww22 сен. 20188:25#7
altRun
pRenderer_ = SDL_CreateRenderer(pWindow_, -1, SDL_RENDERER_ACCELERATED);

Тебе этот SDL_Renderer вообще зачем? Если не ошибаюсь то под Windows там вообще создаётся D3D11 Context
для аппаратного блиттинга 2D. А ты потом там еще и OpenGL контекст создаешь. SDL_Surface ни к какому рендеру
или контексту не привязаны. SDL карёжит от такого использования.

/ Форум / Программирование игр / 2D графика и изометрия

2001—2018 © GameDev.ru — Разработка игр