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

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

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

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

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

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

У меня вопрос: как создать поверхность cairo, которая визуализируется непосредственно в текстуру OpenGL?
Обратите внимание: мне нужно будет использовать текстуру напрямую (без копирования) для отображения вывода cairo на экране.


person Remco    schedule 24.05.2011    source источник


Ответы (3)


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

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

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

person Stuart Axon    schedule 11.11.2015

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

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

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

Как только у вас заработает серверная часть gl, вы можете выполнить рендеринг в Объект фреймбуфера для рендеринга непосредственно в заданной текстуре.

person rotoglup    schedule 26.05.2011
comment
Я знаю, что средство визуализации glitz было заменено, я упомянул об этом в исходном вопросе. Но на этой странице, похоже, нет никаких инструкций о том, как на самом деле использовать бэкенд cairo-gl, я совершенно конкретно спрашиваю, как напрямую отображать текстуру OpenGL без использования glTexImage2D. У вас есть более точные инструкции? - person Remco; 26.05.2011
comment
@Vhab - извините, я сам не знаю, как использовать cairo-gl. Но без этого, я полагал, вы должны использовать glTexImage (или эквивалент). С помощью cairo-gl вы можете привязать объект фреймбуфера, чтобы разрешить перенаправление вызовов отрисовки cairo на текстуру. Я не могу быть более конкретным, извините - person rotoglup; 27.05.2011
comment
Я не могу найти конкретную информацию о том, как использовать cairo-gl, что и привело меня к вопросу о stackoverflow. Я с радостью приму любой ответ, который покажет мне, как на самом деле использовать cairo-gl и получить действительную текстуру OpenGL с выводом cairo. - person Remco; 28.05.2011

Я сделал это с помощью 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);

тогда делай

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

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

person gamegemini    schedule 23.02.2012
comment
К сожалению, если бы вы прочитали мой вопрос, это именно то, о чем я не спрашиваю. - person Remco; 09.03.2012