Рендеринг поверхности каира непосредственно к тексту OpenGL

Я использую cairo (http://cairographics.org) в сочетании с 3D-графической библиотекой на базе OpenGL.
В настоящее время я использую 3D-библиотеку в Windows, но я надеюсь получить ответ, независимый от платформы. Это все сделано в С++.

У меня есть прямой подход к работе, который должен использовать cairo_image_surface_create в сочетании с glTexImage2D, чтобы получить текстуру OpenGL.

Однако из того, что я смог собрать из документации cairo_image_surface_create, используется рендерер на основе ЦП и записывает вывод в основную память.

Я понял, что у cairo есть новый рендеринг, основанный на OpenGL, который выводит свой результат непосредственно на графический процессор, но я не могу найти конкретные детали о том, как его использовать.
(Я нашел некоторые сведения о glitz-рендерере, но он, кажется, устарел и удален).

Я проверил список поверхностей по адресу http://www.cairographics.org/manual/cairo-surfaces.html, но я чувствую, что мне не хватает очевидного.

Мой вопрос: Как создать поверхность каира, которая напрямую обращается к текстуре OpenGL?
Заметьте: мне нужно будет использовать текстуру напрямую (без копирования), чтобы отображать выход каира на экране.

Ответы

Ответ 1

Средство визуализации glitz было заменено экспериментальным cairo-gl backend.

Вы найдете упоминание об этом в: http://cairographics.org/OpenGL/

Не могу сказать, достаточно ли он достаточно стабилен для использования.

После того, как вы работаете с gl backend, вы можете визуализировать объект Framebuffer для визуализации непосредственно в заданной текстуре.

Ответ 2

Я сделал это с помощью GL_BGRA.

int tex_w = cairo_image_surface_get_width(surface);
int tex_h = cairo_image_surface_get_height(surface);
unsigned char* data = cairo_image_surface_get_data(surface);

то do

glTexImage2D(GL_TEXTURE_2D, 0, 4, tex_w,tex_h, 0,GL_BGRA, GL_UNSIGNED_BYTE, data);

при создании текстуры. Используйте glTexSubImage2D (...) для обновления текстуры при изменении содержимого изображения. Для скорости установите фильтры для текстуры в GL_NEAREST

Ответ 3

По состоянию на 2015 год, Cairo GL SDL2, вероятно, лучший способ использовать Cairo GL

https://github.com/cubicool/cairo-gl-sdl2

Если вы находитесь на ОС, например, Ubuntu, где cairo не скомпилирован с GL, вам нужно будет скомпилировать свою собственную копию и дать знать, где она находится. cayro-gl-sdl2.