Всем доброго дня!
Только начал изучать SDL. Нужно использовать её совместно с openGL.
Стал вопрос чем создать текстовые текстуры. Долго не думая, взял его расширение SDL_TTF.
Для этого нужно было сформировать текстуру текста с помощью SDL и передать её openGL-у.
Однако все уперлось в SDL_GL_BindTexture который почему-то не поддерживается. В чем может быть причина?
Текстура с помощью созданного SDL рендера нормально рисуется им же.
Версия SDL стоит последняя (2.0.8). SDL_GL_BindTexture работает c 2.0.0.
altRun
> Однако все уперлось в SDL_GL_BindTexture который почему-то не поддерживается.
замени на вызов glBindTexture, правда я не знаю как вытянуть texture id из SDL_exture
altRun
А что SDL_GetError возвращает? Или SDL_GetError и пишет, что SDL_GL_BindTexture not supported? Контекст OpenGL свой используешь или SDL_Renderer? Сам OpenGL инициализируется успешно?
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. Благо вариантов там не много.
altRun
Если меня не подводит мой английский, то как раз твой случай описан во 2-м абзаце.
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.
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; }
altRun
pRenderer_ = SDL_CreateRenderer(pWindow_, -1, SDL_RENDERER_ACCELERATED);
Тебе этот SDL_Renderer вообще зачем? Если не ошибаюсь то под Windows там вообще создаётся D3D11 Context
для аппаратного блиттинга 2D. А ты потом там еще и OpenGL контекст создаешь. SDL_Surface ни к какому рендеру
или контексту не привязаны. SDL карёжит от такого использования.