Визуализация поверхности cairo непосредственно в текстуре OpenGL

#c #opengl #cairo

#c #opengl #cairo

Вопрос:

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

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

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

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

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

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

Ответ №1:

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

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

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

Ответ №2:

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

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

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

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

Комментарии:

1. Я знаю, что средство визуализации glitz было заменено, я упоминал об этом в первоначальном вопросе. Но на этой странице, похоже, не указано никаких инструкций о том, как на самом деле использовать серверную часть cairo-gl, я довольно конкретно спрашиваю, как выполнить рендеринг непосредственно в текстуре OpenGL без использования glTexImage2D . У вас есть более точные инструкции?

2. @Vhab — извините, я сам не знаю, как использовать cairo-gl. Но без этого, я полагал, вы должны использовать glTexImage (или эквивалент). С помощью cairo-gl вы можете привязать объект framebuffer, чтобы включить перенаправление вызовов cairo draw к текстуре. Я вряд ли могу быть более конкретным, извините

3. Я не могу найти конкретную информацию о том, как использовать cairo-gl, что и привело меня к вопросу о stackoverflow. Я с радостью приму любой ответ, который покажет мне, как на самом деле использовать cairo-gl и получить действительную текстуру OpenGL с выводом cairo.

Ответ №3:

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

Комментарии:

1. К сожалению, если бы вы прочитали мой вопрос, это именно то, о чем я не спрашиваю.