April 9, 2023 前段时间给之前写的软件渲染器增加了 OpenGL 和 Vulkan 版本,用于对照渲染结果,并且希望能做到实时切换,即运行过程中切换不同的渲染器(Software/OpenGL/Vulkan),项目的窗口渲染上屏是使用 OpenGL 实现,整体的结构大致如下图: 软件渲染器的结果(pixel buffer)在 CPU 端,通过 glTexSubImage2D 上传到 OpenGL 纹理,OpenGL 渲染器则是直接将 Color Attachment 作为纹理,不需要额外操作,而 Vulkan 渲染器则先通过 vkCmdCopyImage 将渲染结果 copy 到一个 host visible 的 vkImage,然后 map 到 CPU 端的 pixel buffer,再通过 glTexSubImage2D 上传,如图中的红色箭头都是耗时操作,那么既然 Vulkan 纹理数据本身就在 GPU 端,有没有办法不饶回 CPU 端,而是直接提交给 OpenGL 呢?或者 Vulkan 与 OpenGL 双方共享同一份纹理数据,一边读一边写? 答案是肯定的,目前可以通过扩展来实现 Vulkan 与Continue reading “Vulkan & OpenGL 纹理共享与同步”