Рендеринг поверхности каира непосредственно к тексту 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.