#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. К сожалению, если бы вы прочитали мой вопрос, это именно то, о чем я не спрашиваю.