为什么我们需要多个渲染通道和子通道?

2023-11-25

我过去有过使用 DirectX12 的经验,但我不记得 Vulkan 中类似渲染通道的东西,所以我无法进行类比。如果我理解正确,则同一子通道内的命令缓冲区不需要同步。那么为什么要复杂化并制作多个呢?为什么我不能只使用一个命令缓冲区并将所有与帧相关的信息放在那里?


想象一下 GPU 无法直接渲染图像。想象一下,它只能渲染到特殊的帧缓冲区内存存储,这与常规图像内存完全分开。您无法直接与该帧缓冲区内存通信,也无法从中进行分配。但是,在渲染操作期间,您可以将图像中的数据复制到其中,将其中的数据读取到图像中,当然还可以渲染到该内部存储器。

现在想象一下,您的特殊帧缓冲区内存的大小是固定的,该大小小于您想要渲染到的整个帧缓冲区的大小(也许much更小)。为了能够渲染大于帧缓冲区内存的图像,您基本上必须多次执行这些目标的所有渲染命令。为了避免多次运行顶点处理,您需要一种方法来存储顶点处理阶段的输出。

此外,在生成渲染命令时,您需要了解如何分配帧缓冲区内存。如果渲染一幅 32-bpp 图像与渲染两幅图像,则可能需要以不同的方式划分帧缓冲区内存。您分配帧缓冲区内存的方式会影响片段着色器代码的工作方式。毕竟,在渲染操作期间,片段着色器可以直接访问该帧缓冲区渲染内存。

这是渲染通道模型的基本思想:渲染到大小不确定的特殊帧缓冲区内存。渲染通道系统复杂性的每个方面都基于此概念模型。

子通道是您准确确定当前要渲染哪些内容的部分。由于这会影响帧缓冲区内存排列,因此始终通过引用渲染通道的子通道来构建图形管道。类似地,要在子通道内执行的辅助命令缓冲区必须提供将在其中使用的子通道。

当渲染通道实例开始在队列上执行时,它(概念上)将我们打算渲染的附件图像复制到帧缓冲区渲染内存中。在渲染过程结束时,我们渲染的数据将被复制回附件图像。

在渲染通道实例的执行期间,附件图像的数据被认为是“不确定的”。虽然模型表示我们正在复制到帧缓冲区渲染内存中,但 Vulkan 并不希望强制实现在直接渲染到图像时实际复制内容。

因此,Vulkan 只是声明任何操作都无法访问用作附件的图像,except对于那些访问图像的人作为附件。例如,您无法将附件图像读取为纹理。但您可以将其作为输入附件进行阅读。

这是基于图块的渲染器工作方式的概念描述。这是作为 Vulkan 渲染通道架构基础的概念模型。渲染目标是不可访问的内存;它们是特殊的东西,只能通过特殊的方式访问。

您不能“仅”从 G 缓冲区读取,因为当您渲染到该 G 缓冲区时,它存在于特殊的帧缓冲区内存中isn't在图像中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么我们需要多个渲染通道和子通道? 的相关文章

随机推荐

  • 使用 @Async 嵌套 @Transactional 方法

    我将 Spring 与 JPA 结合使用 我有 EnableAsync and EnableTransactionManagement打开 在我的用户注册服务方法中 我调用了一些带注释的其他服务方法 Async 这些方法可以执行各种操作 例
  • Scala 返回一个带有 0 个参数的 void 函数,语法丑陋?

    给定一个定义如下的方法 def descendEach times Int f gt Unit for i lt 1 to times other code f 当我使用这种方法时 我希望能够写 gd descendEach 20 prin
  • 从其他 T4 模板运行 T4 模板

    有谁知道是否可以在 VS2010 内从另一个 T4 模板运行 T4 模板文件 Thank 是的你可以 这就是我正在做的 string templateText File ReadAllText Host ResolvePath templa
  • 访问资产目录中具有特定分辨率的图像

    我有一个名为 SmileyFace 的图像集 其中包含 1x 2x 和 3x 图像尺寸 我想将图像集中的特定尺寸复制到粘贴板 如何在下面的代码中以编程方式引用 1x 2x 或 3x let image UIImage named Smile
  • 当我使用 selenium 时 Firefox 想要更新?

    我的计算机上的 Firefox 是最新的 但当我使用 selenium 时 有时它会说我需要或应该更新 从而搞乱我的程序 最终这个窗口会阻止我的程序工作 有什么办法可以阻止这个吗 谢谢 如果这是在您有权访问 Firefox 的计算机上 则有
  • dynamic_cast<> 有多快

    大约与典型的相比std string operator 我在下面提供了更多详细信息 我不确定它们是否有任何相关性 具有复杂性或近似值的答案就足够了 谢谢 Details 我将在列表的 for 循环中使用它来查找一些特定的实例 我估计我的平均
  • 如何使用 ASP.NET Core 解决 REACT 中的 CORS 错误

    我有一个 ASP NET Core Web API 和一个单独的 React 应用程序 Web API 使用 Windows 身份验证 当部署到服务器时 我没有任何问题 但是当我尝试在本地运行应用程序时 我会收到 CORS 错误 并且仅在
  • 我的 MySQL 服务器是哪个版本?

    确定 MySQL 服务器软件的确切版本号的查询语法是什么 您可以使用SHOW VARIABLES SHOW VARIABLES WHERE Variable name version
  • Bash 分号等于换行符不完全正确吗?

    我在多篇文章中读到分号 在类 UNIX shell 中等于换行 然而 以下内容让我感到困惑 我也没有运气用谷歌搜索它 我猜这是一个问题do在 shell 中 但 bash 分号 do 并不是最适合 google 的搜索词组合 下面是一个简单
  • C# 和 void 指针

    我正在编写我的第一个 C 应用程序 但幸运的是我必须使用 void 指针 使用返回句柄的 DLL 从我读到的内容来看 有以下几种选择 不安全代码 例如参见http www c sharpcorner com UploadFile grego
  • 在 jupyter 笔记本中使用 bash 命令

    我从未将 bash 与 jupyter 笔记本一起使用 对于某些项目 我需要将 bash 与 python 一起使用 但它给了我错误 我也安装了 bash 内核 PATH Downloads dogscats ls PATH ls 不被识别
  • Android Runtime.getRuntime().exec() 通过目录进行导航

    因此 我希望能够编写一个应用程序 可以打开并显示 logcat 消息 dmesg 并且还能够运行 ls cat echo cd 等命令 如果我执行以下操作 nativeProc Runtime getRuntime exec ls n Bu
  • 用于查找与向量中唯一值相关的索引的高效 R 代码

    假设我有向量vec lt c D B B C C 我的目标是最终得到一个维度列表length unique vec 其中每个i该列表的返回一个索引向量 表示unique vec i in vec 例如 此列表为vec会返回 exampleL
  • 任何人都有示例代码,可以直接将一个 Web 的“分块”HTTP 流式下载下载到上传到单独的 Web 服务器吗?

    背景 我正在尝试使用 C 中的 HttpWebRequest HttpWebResponse 将现有网页流式传输到单独的 Web 应用程序 我注意到的一个问题是 我试图使用文件下载的内容长度来设置文件上传请求的内容长度 但是问题似乎是当源网
  • “等待”的任务在哪里执行?

    考虑以下 private async void btnSlowPoke Click object sender EventArgs e await DoItAsync private async Task
  • 如何检查从 C 传递的函数指针是否为非 NULL

    下面的示例代码 铁锈部分 no mangle pub extern fn call c function value i32 fun fn i32 gt i32 gt i32 fun value 还有C部分 int32 t call c f
  • 如何在 Windows PowerShell 中获取当前用户名?

    如何在 Windows PowerShell 中获取当前用户名 我找到了 Environment UserName Env UserName 还有 Env UserDomain Env ComputerName
  • 创建临时文件而不在 Ruby 中打开它

    有没有办法创建临时文件而不打开它 我必须运行一个可执行文件 将其输出重定向到一个文件 然后读取并解析它 所创造的一切tempfile已经打开 这会触发错误 因为文件被锁定 您还可以使用 Dir Tmpname Dir Tmpname cre
  • 将某些浮动数据框列格式化为 pandas 中的百分比

    我正在尝试在 IPython 笔记本中写一篇论文 但遇到了一些显示格式问题 假设我有以下数据框df 有什么办法可以格式化吗var1 and var2化为 2 位小数并var3化为百分比 var1 var2 var3 id 0 1 45831
  • 为什么我们需要多个渲染通道和子通道?

    我过去有过使用 DirectX12 的经验 但我不记得 Vulkan 中类似渲染通道的东西 所以我无法进行类比 如果我理解正确 则同一子通道内的命令缓冲区不需要同步 那么为什么要复杂化并制作多个呢 为什么我不能只使用一个命令缓冲区并将所有与