В моей компании мы работаем над огромной библиотекой, которая является независимым от платформы средством рендеринга (но его главная задача не в играх, а в профессиональных и офисных приложениях).
Все идет хорошо, у нас уже есть очень эффективные рендеры D3D11 и OpenGL, а также «программные» рендеры для Windows и Linux (GDI / X11).
Недавно мы начали реализовывать дополнительные улучшения на нижних уровнях нашего API. Мы подумали, что это может быть хорошей идеей, чтобы проверить их также на более медленных машинах. Поскольку обновление взаимодействует с логикой, специфичной для OpenGL, эту конкретную версию необходимо протестировать.
Мы реализовали RTT (Render To Texture) в GL, используя основной объект framebuffer. Поскольку старый HW не мог работать с этим решением (без поддержки ARB_framebuffer), мы создали простую оболочку, которая определяет поддерживаемую версию FBO (ARB_fb_object или EXT_fb_object) и упаковывает все cals прозрачным способом. Пример создания трафаретного вложения:
gxFBO::gen_renderbuffers(1, &stencil_buffer_id);
gxFBO::bind_renderbuffer(GX_RENDERBUFFER, stencil_buffer_id);
gxFBO::renderbuffer_storage(GX_RENDERBUFFER, GX_DEPTH24_STENCIL8, width, height);
gxFBO::bind_renderbuffer(GX_RENDERBUFFER, 0);
gxFBO::framebuffer_renderbuffer(GX_FRAMEBUFFER, GX_DEPTH_STENCIL_ATTACHMENT, stencil_buffer_id);
gxFBO::check_framebuffer_status();
Краткое объяснение: вызовы функций эквивалентны версиям gl * (например, gxFBO :: renderbuffer_storage () вызывает внутренние вызовы glRenderbufferStorage () или glRenderbufferStorageEXT () в зависимости от поддерживаемой версии). Константы препроцессора также одинаковы (GX_DEPTH24_STENCIL8 = (GL_DEPTH24_STENCIL8 или GL_DEPTH24_STENCIL8_EXT)).
Это прекрасно работает на оборудовании с поддержкой 3.0+ (все отображается правильно). Сбой, однако на старом оборудовании (с поддержкой GL 2.1 и EXT_framebuffer).
Возвращенная ошибка в gxFBO :: check_framebuffer_status (): GL_FRAMEBUFFER_UNSUPPORTED_EXT.
Я также попытался создать отдельные рендер-буферы для глубины и трафарета:
gxFBO::gen_renderbuffers(1, &depth_buffer_id);
gxFBO::gen_renderbuffers(1, &stencil_buffer_id);
gxFBO::bind_renderbuffer(GX_RENDERBUFFER, depth_buffer_id);
gxFBO::renderbuffer_storage(GX_RENDERBUFFER, GL_DEPTH_COMPONENT, width, height);
gxFBO::bind_renderbuffer(GX_RENDERBUFFER, stencil_buffer_id);
gxFBO::renderbuffer_storage(GX_RENDERBUFFER, GX_STENCIL_INDEX8, width, height);
gxFBO::bind_renderbuffer(GX_RENDERBUFFER, 0);
gxFBO::framebuffer_renderbuffer(GX_FRAMEBUFFER,
GX_DEPTH_ATTACHMENT,
GX_RENDERBUFFER,
depth_buffer_id);
gxFBO::framebuffer_renderbuffer(GX_FRAMEBUFFER,
GX_STENCIL_ATTACHMENT,
GX_RENDERBUFFER,
stencil_buffer_id);
gxFBO::check_framebuffer_status();
Та же ошибка при проверке состояния кадрового буфера. Может ли кто-нибудь помочь с правильной настройкой в этом случае? Можно ли сделать то, что я пытаюсь сделать, используя GL_EXT_framebuffer?
Задача ещё не решена.
Других решений пока нет …