【问题标题】:Vulkan: Framebuffer larger than Image dimensionsVulkan:帧缓冲区大于图像尺寸
【发布时间】:2018-02-11 15:18:37
【问题描述】:

本题主要涉及VkFramebufferCreateInfo结构中的尺寸参数(widthheightlayers)。

实际问题:

如果用于创建VkFrameBuffer 的一个或多个VkImageViews 的尺寸大于用于创建VkFrameBufferVkFramebufferCreateInfo 中指定的尺寸,如何控制哪一个? VkImageView 的一部分在渲染通道实例期间使用?

其他措辞问题:

我基本上是在问,如果图像比帧缓冲区大(尺寸不同),什么定义了图像的哪一部分被使用(读/写)?

一些细节:

规范声明这是一种有效的情况(我看到很多人声明帧缓冲区使用的附件必须与帧缓冲区本身的尺寸相匹配,但我在规范中找不到对此的支持):

pAttachments 的每个元素的尺寸必须至少与相应的帧缓冲区尺寸一样大。

我想明确一点,我知道如果我只是想绘制图像的一部分,我可以使用与图像具有相同尺寸的帧缓冲区,并使用viewportsscissors。但是据我从规范中可以看出,剪刀和视口是相对于帧缓冲区的 (0,0) 定义的,尽管我不清楚。

我问这个问题是为了帮助我理解帧缓冲区,因为我确信我误解了一些东西。我觉得帧缓冲区空间中的 (x,y) 很可能是图像空间中的 (x,y) (因为无法控制 VkImageView 的哪个部分是使用)。

我已经坚持了很长一段时间(大约 4 天),并且尝试了 Vulkan: CookbookVulkan Programming Guide,并阅读了大部分规范,并在网上搜索。

如果问题需要澄清,请提出。我只是不想让它太长。

感谢您的阅读。

【问题讨论】:

  • 嗯,这是一个非常有趣的问题。相对于用作帧缓冲区附件的图像的左上角,看起来确实无法控制帧缓冲区区域的开始位置。您不能在创建帧缓冲区期间提供左上角,也不能在创建图像视图期间提供。只考虑整个图像,所以我认为帧缓冲区是相对于图像的左上角,[0,0] 坐标。唯一让您控制它的是 vkCmdBeginRenderPass() 命令中的渲染区域并为视口和剪刀测试设置适当的值。

标签: vulkan


【解决方案1】:

当帧缓冲区小于图像时,无法控制帧缓冲区使用图像的哪一部分。帧缓冲区原点始终映射到图像原点。

允许附件大于帧缓冲区仅意味着允许在帧中将内存/图像/视图重用于多个目的,即使它们并不都需要相同的尺寸。典型的例子是为几个不同的渲染通道重用深度缓冲区(但不是它的内容)。您可以使用内存别名来完成同样的事情,但是必须支持多个 API 的引擎可能会发现这样做更容易。

【讨论】:

    【解决方案2】:

    控制渲染位置的方法是控制视口。也就是说,您指定的帧缓冲区大小实际上足以覆盖您可能要渲染到的目标图像的总区域,并使用视口变换/剪切来渲染到这些图像的特定区域。

    没有从帧缓冲区空间到图像空间的后视口转换。这绝对是多余的,因为我们已经有了 NDC 后的转换。有两个没有意义。

    当然,VkRenderPassBeginInforenderArea 对象,但这更像是来自用户的承诺,而不是对系统的保证:

    应用程序必须确保(必要时使用剪刀)所有渲染都包含在渲染区域内,否则渲染区域之外的像素将变得未定义并且着色器副作用可能 strong> 出现在渲染区域之外的片段。

    所以基本上,实现对renderArea 没有任何作用。它没有设置转换或任何东西;您只是保证该区域之外的帧缓冲区像素不会受到影响。

    在任何情况下,提供小于图像大小的帧缓冲区大小真的没有什么意义。这类事情更多的是 renderArea 的看法,而不是帧缓冲区规范。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-26
      • 2016-09-15
      • 1970-01-01
      • 1970-01-01
      • 2013-06-29
      • 2022-11-21
      • 2020-12-04
      相关资源
      最近更新 更多