将cairo曲面直接渲染为OpenGL纹理

时间:2011-05-24 09:05:24

标签: c++ opengl cairo

我正在将cairo(http://cairographics.org)与基于OpenGL的3D图形库结合使用 我目前正在Windows上使用3D库,但我希望得到一个独立于平台的答案。 这都是用c ++完成的。

我已经采用了直接的方法,将 cairo_image_surface_create glTexImage2D 结合使用,以获得OpenGL纹理。

但是,从我可以从文档 cairo_image_surface_create 中收集到的内容,我使用基于CPU的渲染器并将输出写入主内存。

我已经明白了cairo有一个新的基于OpenGL的渲染器,它直接在GPU上渲染输出,但我无法找到有关如何使用它的具体细节。
(我已经找到了浮华渲染器的一些细节,但似乎已被弃用并删除)。

我已经检查过表面列表:http://www.cairographics.org/manual/cairo-surfaces.html,但我觉得我错过了明显的表现。

我的问题是:如何创建直接渲染到OpenGL纹理的cairo曲面? 请注意:我需要能够直接使用纹理(不复制)在屏幕上显示cairo输出。

3 个答案:

答案 0 :(得分:1)

浮华渲染器已经被实验性的 cairo-gl 后端所取代。

你会发现它的提及: http://cairographics.org/OpenGL/

不能说它是否足够稳定以供使用。

一旦你有一个gl后端工作,你可以渲染到 Framebuffer对象直接在给定纹理中渲染。

答案 1 :(得分:1)

我使用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

答案 2 :(得分:1)

截至2015年,开罗GL SDL2可能是使用Cairo GL的最佳方式

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

如果您使用的是Ubuntu操作系统,其中cairo未使用GL编译,则需要编译自己的副本,让cairo-gl-sdl2知道它的位置。