将cairo表面直接渲染到OpenGL纹理

17

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

我已经成功采用了直接的方法,即使用cairo_image_surface_createglTexImage2D结合以获得OpenGL纹理。

然而,从我从文档中了解到的信息来看,cairo_image_surface_create使用基于CPU的渲染器并将输出写入主内存。

我了解到cairo有一个新的基于OpenGL的渲染器,可以直接在GPU上渲染其输出,但我无法找到如何使用它的具体细节。
(我找到了一些关于glitz-renderer的详细信息,但它似乎已被弃用并删除)。

我已经在http://www.cairographics.org/manual/cairo-surfaces.html上检查了表面列表,但感觉我错过了显而易见的部分。

我的问题是:如何创建一个能够直接渲染到OpenGL纹理的cairo surface?
请注意:我需要能够直接使用纹理(无需复制)来显示cairo的输出。

3个回答

3
截止到2015年,Cairo GL SDL2 是使用 Cairo GL 最好的方式。
如果你使用的操作系统是像 Ubuntu 这样未编译 GL 的版本,需要自己编译一份,并让 cairo-gl-sdl2 知道它的位置。 https://github.com/cubicool/cairo-gl-sdl2

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。


6
很不幸,如果您仔细阅读我的问题,那正是我不想问的。 - Remco

1

闪亮的渲染器已被实验性的cairo-gl后端所取代。

您可以在以下链接中找到相关信息: http://cairographics.org/OpenGL/

不过,目前无法确定它是否稳定可靠。

一旦您拥有一个工作正常的gl后端,您就可以将其渲染到Framebuffer Object中,以直接呈现给定的纹理。


1
我知道glitz渲染器已经被替换了,我在原始问题中提到了这一点。但是那个页面似乎没有列出任何有关如何实际使用cairo-gl后端的说明,我很明确地询问如何直接渲染到OpenGL纹理而不使用glTexImage2D。你有更精确的说明吗? - Remco
@Vhab - 抱歉,我不知道如何使用cairo-gl。但是如果没有它,我相信你应该使用glTexImage(或等效物)。有了cairo-gl,您可以绑定一个帧缓冲对象以启用将cairo绘图调用重定向到纹理。很抱歉我不能更具体。 - rotoglup
2
我无法找到有关如何使用cairo-gl的具体信息,这就是我在stackoverflow上提出问题的原因。我将非常乐意接受任何能够向我展示如何实际使用cairo-gl并获得带有cairo输出的有效OpenGL纹理的答案。 - Remco

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接