【问题标题】:Render cairo surface directly to OpenGL texture将 cairo 表面直接渲染到 OpenGL 纹理
【发布时间】:2019-07-15 14:57:03
【问题描述】:

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

我有一个直截了当的方法,即结合使用 cairo_image_surface_create 和 glTexImage2D 来获得 OpenGL 纹理。

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

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

我在http://www.cairographics.org/manual/cairo-surfaces.html 上查看了表面列表,但我觉得我错过了明显的内容。

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

【问题讨论】:

    标签: c++ 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 对象中,直接在给定的纹理中渲染。

      【讨论】:

      • 我知道浮华渲染器已被替换,我在原始问题中提到了这一点。但是该页面似乎没有列出任何关于如何实际使用 cairo-gl 后端的说明,我非常特别地询问如何在不使用 glTexImage2D 的情况下直接渲染到 OpenGL 纹理。你有更准确的说明吗?
      • @Vhab - 抱歉,我自己不知道如何使用 cairo-gl。但没有它,我相信你应该使用 glTexImage (或等效的)。使用 cairo-gl,您可以绑定帧缓冲区对象以启用将 cairo 绘制调用重定向到纹理。我很难说得更具体了,抱歉
      • 我找不到有关如何使用 cairo-gl 的具体信息,这就是我在 stackoverflow 上提出问题的原因。我很乐意接受任何向我展示如何实际使用 cairo-gl 并通过 cairo 输出获得有效 OpenGL 纹理的答案。
      【解决方案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

      【讨论】:

      • 不幸的是,如果您阅读了我的问题,那正是我没有问的问题。
      猜你喜欢
      • 2023-03-30
      • 1970-01-01
      • 2012-06-03
      • 2014-07-22
      • 2013-10-05
      • 1970-01-01
      • 2013-12-27
      • 1970-01-01
      • 2012-01-16
      相关资源
      最近更新 更多