- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个计算着色器,我想将它输出到一个图像/缓冲区,它是两个管道之间的中间存储:一个计算管道和一个图形管道。图形管道实际上是一个“虚拟”,因为它除了将中间缓冲区的内容复制到交换链图像中之外什么都不做。这是因为 DX12 弃用了计算管道使用 UAVS 直接写入交换链图像的能力。
我认为中间存储应该是 Vulkan 意义上的“临时”附件:
VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT
specifies that the memory bound to this image will have been allocated with theVK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT
(see Memory Allocation for more detail). This bit can be set for any image that can be used to create aVkImageView
suitable for use as a color, resolve, depth/stencil, or input attachment.`
Finally, Vulkan includes the concept of transient attachments. These are framebuffer attachments that begin in an uninitialized or cleared state at the beginning of a renderpass, are written by one or more subpasses, consumed by one or more subpasses and are ultimately discarded at the end of the renderpass. In this scenario, the data in the attachments only lives within the renderpass and never needs to be written to main memory. Although we’ll still allocate memory for such an attachment, the data may never leave the GPU, instead only ever living in cache. This saves bandwidth, reduces latency and improves power efficiency.
最佳答案
Direct3D 12 没有这个概念。这种限制的原因最终归结为为什么存在 transient 分配。 TL;DR:这不是为了做你想做的事情。
Vulkan 的渲染 channel 系统存在一个目的:使基于图 block 的渲染器成为渲染系统的一等公民。 TBR 不适合 OpenGL 或 D3D 的帧缓冲模型。在这两个 API 中,您可以随时交换帧缓冲区。
TBR 不直接渲染到内存。它们在内部缓冲区中执行渲染操作,这些缓冲区从内存中播种,然后可能在渲染操作完成后写入内存。随时切换渲染图像会违反这种结构,这就是为什么 TBR 供应商列出了如果您希望 OpenGL ES 代码具有高性能时不应该做的事情的原因。
Vulkan 的渲染 channel 系统是 TBR 系统的抽象。在抽象模型中,渲染 channel 系统可能会从帧缓冲区中的图像读取数据,然后对该数据的副本执行一系列子 channel ,最后,可能会将更新的数据写回图像中。因此,从流程的外部来看,看起来您正在渲染图像,但实际上并非如此。为了保持这种错觉,在渲染 channel 期间,您只能以渲染 channel 模型允许的方式使用这些帧缓冲区图像:作为附件。
现在考虑延迟渲染。在延迟渲染中,您渲染到 g 缓冲区,然后您在光照 channel 中读取这些缓冲区以生成最终图像。一旦你生成了最终图像,你就不再需要那些 g 缓冲区了。在普通 GPU 中,这没有任何意义。因为渲染直接进入内存,这些 g 缓冲区必须占用实际存储空间。
但是考虑一下 TBR 是如何工作的。它会渲染到单个图 block 中;在最佳情况下,它一次处理单个图 block 的所有片段。这意味着它通过几何和照明 channel 。对于 TBR,g-buffer 只是你用来获得最终答案的一 block 暂存内存;它不需要从内存中读取或复制到内存中。
简而言之,它不需要内存。
输入延迟分配的内存和临时附件图像。它们的存在是为了允许 TBR 将 g-buffers 保留在 tile 内存中,并且永远不必为它们分配实际存储空间(或者至少,它只有在某些运行时环境发生迫使它发生时才会发生,比如在 GPU 上插入过多的几何图形)。它只在渲染过程中起作用;如果您结束渲染 channel 并且必须在另一个渲染 channel 中使用其中一个 g 缓冲区,那么魔法必须消失,数据必须触及实际存储。
Vulkan API 使这个用例的具体程度非常明确。您不能将一 block 延迟分配的内存绑定(bind)到没有 USAGE_TRANSIENT_ATTACHMENT
的图像上。在其上设置的标志(或任何类型的缓冲区)。你会注意到它说的是“ transient 附件”,就像在渲染 channel 附件中一样。之所以这样说是因为您还会注意到临时附件不能用于非附件用途(valid usage tests for VkImageCreateInfo
的一部分)。完全没有。
您想要做的不是延迟分配内存的那种事情。它行不通。
至于 Direct3D 12,API 不是为在移动 GPU 上运行而设计的,而且由于只有移动 GPU 是基于 tile 的渲染器(最近的一些桌面 GPU 具有 TBR 相似性,但不是完整的 TBR),它没有专门为它们设计的设施.因此,它不需要延迟分配的内存或临时附件。
关于vulkan - 什么是 DirectX 12 相当于 Vulkan 的 "transient attachment"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56819614/
我想知道为什么可以在 VkPipelineLayoutCreateInfo 中指定多个描述符集布局,因为一个已经包含所有绑定(bind)。 最佳答案 描述符集布局描述了单个描述符集的布局。但是一个管道
我试图了解整个 L1/L2 冲洗是如何工作的。假设我有一个像这样的计算着色器 layout(std430, set = 0, binding = 2) buffer Particles{ Pa
Vulkan 旨在为用户提供精简和明确的内容,但队列是此规则的一个很大异常(exception):队列可能由驱动程序复用,并且使用一个系列的多个队列是否会提高性能并不总是很明显。 在驱动程序更新之一之
来自与 vkCmdPipelineBarrier 相关的规范: If no memory barriers are specified, then the first access scope inc
Vulkan 是否提供绘制基本图元的功能?点、线、矩形、实心矩形、圆角矩形、实心圆角矩形、圆、实心圆等。 ? 我认为没有任何 VkCmdDraw* 命令可以提供此功能。如果这是真的,需要做些什么来绘制
我正在尝试进行一个模拟,该模拟涉及渲染前的两个计算步骤。我目前有一个计算基础物理的计算管道,然后是一个图形管道。我希望能够添加第二个计算着色器以在第一个计算着色器之后运行。 首先,Vulkan 中是否
取消映射后可以刷新内存范围吗? 乍一看好像不对,因为函数叫vkFlushMappedMemoryRanges() ,但是 the documentation似乎暗示内存已准备好刷新,即使在未映射之后:
Vulkan 是否支持保存流水线阶段的顶点输出?我一直在寻找,但找不到任何示例或引用资料,也许其他人不知道? 最佳答案 Transform Feedback 在最初的 Vulkan 版本中没有被削减,
我有多个具有不同纹理/管道构造的网格,例如深度测试/混合函数以使用 vulkan 进行渲染。在性能方面呈现它们的最佳实践是什么。 一种选择是为 n 个网格创建 n 个具有 n 个线程的命令缓冲区,它们
我正在开发一个使用 Vulkan 的 C++ 应用程序。我如何获得支持的扩展集? 像std::set get_supported_extensions()这样的签名会很理想。 最佳答案 vkEnume
我正在开发一个使用 Vulkan 的 C++ 应用程序。我如何获得支持的扩展集? 像std::set get_supported_extensions()这样的签名会很理想。 最佳答案 vkEnume
正在处理 Vulkan 三角形渲染代码,我想将渲染图像保存到文件而不是渲染到窗口。 那么我应该什么时候读取帧缓冲区以及如何编写在文件中。我想需要将原始 RGBA 格式的像素转换为某种已知的 BMP 或
Vulkan 规范(1.0.12)在第 2.4 节介绍了 VkDeviceSize: With few exceptions, Vulkan uses the standard C types for
即使实例在 Vulkan 中创建失败,我是否应该销毁它? 哪个是正确的: 1: VkResult Result = vkCreateInstance( info, NULL, instance );
我开始学习 Vulkan,想知道 VkCreate[...] 函数是否将结构中指向的资源复制到他自己的缓冲区中。 为了澄清我的问题,在这段代码中我加载了 斯皮尔 将着色器放入我自己的 mkShader
Khronos 刚刚发布了他们的新内存模型扩展,但还没有进行非正式讨论、示例实现等,所以我对基本细节感到困惑。 https://www.khronos.org/blog/vulkan-has-just
SubpassInput 由片段着色器隐式寻址。我想用我自己的纹理坐标来处理输入。类似于 texture(sampler, texCoord) 最佳答案 这是不可能的。如果您想在着色器内对图像进行采样
有没有办法从实例中获取对象类型枚举器(vk::ObjectType dor vulkan.hpp 和 VkObjectType for vulkan)? 例如假设我们有 3 个对象: vk::Devi
我的着色器索引到采样器和图像,但是当我从图像中采样时(如果我在着色器中采样,我只会得到错误)我得到一个错误: Descriptor in binding #0 index 0 requires FLO
我想到了以下场景,但我不知道它是否有效: 在程序的开头创建一个VkCommandPool,并从中分配一个VkCommandBuffer。 在渲染循环中,将命令记录到 VkCommandBuffer(隐
我是一名优秀的程序员,十分优秀!