Vulkan原理与实战教程

kuaidelasi · · 260 次点击 · 开始浏览    置顶

Vulkan(/s/1E6zICCRB0NgTP9CM9tl1gg 提取码: b7h6)渲染器 是一个基于Vulkan API的高性能3D渲染引擎,旨在提供现代图形处理的低级访问能力,优化CPU和GPU的使用效率。该引擎的设计灵感来源于Vulkan的发展趋势,它允许开发者更细致地控制图形管线,实现并行化计算,适用于游戏开发、实时可视化及高性能图形应用。相比于传统的OpenGL和DirectX 11,Vulkan通过更加底层的API设计,让应用程序能够更接近现代GPU的工作原理,从而提升性能并支持多线程编程。 OpenGL 定义:OpenGL(Open Graphics Library)是一个跨平台的图形API,用于渲染2D和3D矢量图形。 特点:它是一个功能丰富、高度可移植的API,广泛用于游戏、科学可视化和教育等领域。 Vulkan 定义:Vulkan是一个跨平台的图形和计算API,由Khronos Group开发,旨在提供更高的性能和更精细的渲染控制。 特点:Vulkan设计用于充分利用现代GPU架构,提供更低的开销和更高的渲染效率。 软渲染器 定义:软渲染器是一种不依赖于硬件加速的图形渲染方式,它使用CPU来执行所有的渲染计算。 特点:软渲染器通常用于不支持硬件加速的环境或作为硬件加速的后备方案。 DirectX 定义:DirectX是由微软开发的一系列API,用于在Windows平台上处理多媒体,特别是游戏编程中的图形渲染。 特点:DirectX提供了一套丰富的工具和功能,用于开发高性能的图形应用程序。 为了在Vulkan下使用ImGui,我们最好单独给ImGui准备一套独立的Vulkan资源,与我们的原有资源互不影响。这样逻辑比较清晰,也方便和我们原有的引擎代码解耦合。我们需要给ImGui创建一个VkDescriptorPool, VkCommandPool和VkRenderPass,一套VkCommandBuffer,VkFramebuffer和VkSemaphore。 这里稍微解释一下为什么后面3个是一套而不是一个,怕万一有人不清楚。因为现代API,比如Vulkan和DirectX12的都是异步的,我们的指令提交之后不需要等执行完成就可以继续干后面的事情。所以我们可以把当前这一帧的指令提交完之后就立刻开始准备下一帧的指令。我们可以同时准备n帧指令,在第n+1帧开始的时候再等第1帧的指令执行完成。这就需要我们准备n套相关资源。 项目技术分析 LegitEngine 引入了渲染图的概念,这是一种现代的实时渲染设计方法。通过定义整个帧将要发生什么,引擎可以自动优化、安全地执行,并尽可能地自动处理同步问题。例如,通过声明图像或缓冲区的用途,框架会自动生成必要的屏障,减少了手动操作的复杂性。 框架的主要目标是: 将 Vulkan 实体封装成易于理解的类,如着色器类,提供反射信息和资源绑定接口。 自动化所有可能自动化的地方,利用渲染图结构来解决同步问题。 提供解决常见 Vulkan 使用问题的良好实践,例如资源上传、多对象共享材料、无窗口渲染等 传统渲染API潜在的问题是,当渲染的场景非常复杂的时候(集合数量多,材质系统复杂,纹理,参数多,渲染管线复杂等),所有这些每一帧大量的状态更新,资源绑定操作所花费的计算时间就不能被简单的忽略了。而在现在的图形程序中,复杂场景,大量的多边形,材质、shader的组合以及复杂的渲染管线却正是所有高质量渲染所需要的。 在处理这些修改管线状态的操作时,驱动会在后台运行许多工作,包括下载纹理,Mipmap Downsample,资源访问的同步,渲染状态组合正确性验证,以及错误检查等等。对于3D App开发者来说,这些工作什么时候发生,是否发生,都是在API层面无法确定的。所以这样的结果就是在CPU端造成卡顿。卡顿也许是你第一次给管线绑定特定的Shader,VBO或者Blend Mode,Render Target的时候。由于不同的硬件厂商的驱动处理这些工作的方式都不一样,所以App在不同显卡上运行的症状以及优化的方式都会有差别,优化也是无从下手。 延迟渲染的主要优化方案是不使用传统光栅化的将每个图形片元的位置计算出来,再逐片元依次计算光照,取而代之的,只保留屏幕空间中所有需要显示的像素及其片元信息(通常称作G-Buffer),再依次为每个像素计算光照。延迟渲染的最大优点是在拥有极大量光源的场景中能大大减少计算量,最大缺点便是无法绘制任何透明物体(因为颜色混合操作的不可行)。 藉由这样的思路,我们得知需要实现延迟渲染至少要经过两个Pass,而在Vulkan中,这两个Pass可以放在一个RenderPass中由两个Subpass实现,第一个Subpass负责将需要的片元数据输出(获取G-Buffer),第二个Pass则负责进行逐片元的光照计算。

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

260 次点击  
加入收藏 微博
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传