将开罗表面直接渲染为 OpenGL 纹理
我将 cairo (http://cairgraphics.org) 与基于 OpenGL 的 3D 图形库结合使用。
我目前正在 Windows 上使用 3D 库,但我希望收到与平台无关的答案。 这一切都是用 C++ 完成的。
我采用了直接的方法,即使用 cairo_image_surface_create 结合 glTexImage2D 来获取 OpenGL 纹理。
然而,根据我从文档中收集到的信息,cairo_image_surface_create 使用基于 CPU 的渲染器并将输出写入主内存。
我了解到 cairo 有一个新的基于 OpenGL 的渲染器,它直接在 GPU 上渲染其输出,但我无法找到有关如何使用它的具体细节。
(我发现了一些关于闪光渲染器的细节,但它似乎已被弃用并删除)。
我已检查表面列表: http://www.cairgraphics.org/manual/ cairo-surfaces.html,但我觉得我错过了显而易见的事情。
我的问题是:如何创建直接渲染到 OpenGL 纹理的 cairo 表面?
请注意:我需要能够直接使用纹理(无需复制)在屏幕上显示 cairo 输出。
I'm using cairo (http://cairographics.org) in combination with an OpenGL based 3D graphics library.
I'm currently using the 3D library on Windows, but I'm hoping to receive an answer that is platform independent.
This is all done in c++.
I've got the straight forward approach working which is to use cairo_image_surface_create in combination with glTexImage2D to get an OpenGL texture.
However, from what I've been able to gather from the documentation cairo_image_surface_create uses a CPU-based renderer and writes the output to main memory.
I've come to understand cairo has a new OpenGL based renderer which renders its output directly on the GPU, but I'm unable to find concrete details on how to use it.
(I've found some details on the glitz-renderer, but it seems to be deprecated and removed).
I've checked the surface list at: http://www.cairographics.org/manual/cairo-surfaces.html, but I feel I'm missing the obvious.
My question is: How do I create a cairo surface that renders directly to an OpenGL texture?
Do note: I'll need to be able to use the texture directly (without copying) to display the cairo output on screen.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
截至 2015 年,Cairo GL SDL2 可能是使用 Cairo GL
https://github.com 的 最佳方式/cubicool/cairo-gl-sdl2
如果您使用的是像 Ubuntu 这样的操作系统,其中 cairo 未使用 GL 进行编译,您将需要编译您自己的副本并让 cairo-gl-sdl2 知道它在哪里。
As of 2015, Cairo GL SDL2 is probably the best way to use Cairo GL
https://github.com/cubicool/cairo-gl-sdl2
If you are on an OS like Ubuntu where cairo is not compiled with GL you will need to compile your own copy and let cairo-gl-sdl2 know where it is.
glitz 渲染器已被实验性的 cairo-gl 后端取代。
您会在以下位置找到对此的提及:
http://cairgraphics.org/OpenGL/
不能说它是否足够稳定可以使用。
一旦你的 gl 后端工作了,你就可以渲染到一个 Framebuffer 对象中,以直接在给定的纹理中渲染。
The glitz renderer has been replaced by the experimental cairo-gl backend.
You'll find a mention of it in:
http://cairographics.org/OpenGL/
Can't say if it's stable enough to be used though.
Once you have a gl backend working, you can render into a Framebuffer Object to render directly in a given texture.
我使用 GL_BGRA 做到了。
执行
然后在创建纹理时 。
当图像内容发生变化时,使用 glTexSubImage2D(...) 更新纹理。为了速度
将纹理的过滤器设置为 GL_NEAREST
I did it using GL_BGRA.
then do
when you create the texture.
Use glTexSubImage2D(...) to update th texture when the image content changes. For speed
set the filters for the texture to GL_NEAREST