2. 图形绘制流水的基本原理和实践 (1)

Vulkan 初始化

如果考虑复杂的 Vulkan 使用场景 一般只需要一个 Vulkan 实例,逻辑设备可以有多个

image.png

Layer 类似于函数重载 image.png

Vulkan 队列 image.png

创建 Swapchain 属于 Vulkan 的一个拓展 image.png

渲染主循环

顶点缓存的优化是,可以把经常要变化的坐标和法线放在一个 Buffer,而 UV 和其他属性放一个 Buffer

image.png

索引缓存避免跳转过大,造成 Cache miss image.png

Draw ,Draw Index 绘制,Draw Indirect 是间接绘制,不需要知道顶点的数量,不用绑定顶点数据,是通过 Buffer 里的数据实时生成顶点。

image.png

Vulkan 的 NDC 坐标

深度的算法是 revert z,z 越大深度越小,存在深度图里的值越小。当 z 为 0 时,深度图里存 1。 image.png

View port 绘制区域一般和纹理区域是一致的, 想要一张图里画多张图的时候,要设置 Viewport 到对应绘制区域,比如 CSM

image.png

裁剪选项

image.png

浮点数精度,位置需要 32 位,颜色 8 位就够了

image.png

片段输出

当在 Frag 里不做深度修改的时候,可以在片段之前就做深度剔除。 但这是 PC 端常用的方式,移动端的 Tile-base 没法知道深度是否会修改,所以这方法没有用?

image.png

RenderPass 内 Vulkan 的绑定流程 image.png

深度纹理最终 pass 是不需要写入操作的,最终 Pass 只提供读取就行。 一个 Command Buffer 里的所有指令是同步的

image.png

参考资料

最后更新于

这有帮助吗?