概览
Escher 是一个 C++/Vulkan 库,主要由 Views 实现使用;Fuchsia SDK 不提供它。它提供了以下实用程序:
使用 Vulkan 对简单操作进行抽象化和优化,例如:
- 流水线重复使用
- 使用更少的内存带宽进行色彩校正
- 在 Escher 中,子通道(以及一般渲染通道)的规范比原始 Vulkan 更方便,但概念基本相同,只是抽象化程度不高。
- 例如,Escher 支持单个 Vulkan 渲染通道中的子通道。也就是说,当第二个子遍历需要访问同一位置的像素时,它会在缓存的数据内部执行转换,而无需离开 GPU 内存层次结构。
- 更新缓冲区并直接发送绘制命令
- 资源生命周期管理
- 例如,如果您提交使用纹理进行渲染的 Vulkan 命令缓冲区,然后在渲染完成之前删除纹理,那么结果将不确定;很可能会发生崩溃。在任何活跃的命令缓冲区不再引用纹理(或缓冲区)之前,Escher 不会将其删除。
特定于景观的更高层级的渲染程序,例如:
a.
RectangleCompositor
,一个简单的合成器,Flatland 的VkRenderer
使用它将显示列表内容加载到单个输出图像(称为帧缓冲区)中- RectangleCompositor 利用:
- Flatland 专用颜色校正顶点和 Fragment 着色器,可在“风景名胜”使用 Vulkan 执行颜色校正时使用
- Flatland 特定的顶点和片段着色器,适用于将色彩校正委托给显示驱动程序或根本不需要使用的情况
- 如需了解如何使用 RectangleCompositor,请参阅
rainfall
示例。
b.
PaperRenderer
,Gfx 使用的已弃用的合成器,用于构建抽象,以执行当时构想的高效 3D 用户体验计算。如需了解如何使用 PaperRenderer,请参阅waterfall
示例。- RectangleCompositor 利用:
相辅相成,这些库可以支持快速迭代和资源生命周期管理,超出单纯使用 Vulkan 时无法可持续地实现这些目标。
跨平台支持
除了少数例外情况,Escher 不依赖于平台。例如,Escher 示例也可以在 Linux 上运行。这有以下两种不同之处:
- 开发中的迭代速度更快。在 Linux 上对 Escher 进行重新编译并运行以进行调试比在 Fuchsia 上快得多。
- 在其他平台上,Vulkan 生态系统提供了丰富多样的开发工具,而这些开发工具在 Fuchsia 上无法实现。例如,在 Escher 开发过程中,RenderDoc 图形调试程序就非常有用。
GLSL 支持
Vulkan 只接受 SPIR-V 格式的着色器源代码。Escher 可以选择支持使用 GLSL(一种人类可读的格式),然后调用 shaderc::Compiler
将其编译为 SPIR-V,然后再加载到 Vulkan。
源代码
源代码位于 //src/ui/lib/escher/ 中。