Vulkan:帧缓冲区大于图像尺寸

Vulkan:帧缓冲区大于图像尺寸,vulkan,Vulkan,此问题主要与结构中的尺寸参数(宽度、高度和层)有关 实际问题是: 如果在创建过程中使用的一个或多个的维度大于在用于创建中指定的维度,则如何控制在渲染过程实例期间使用该维度的哪个部分 换言之,问题: 我基本上是问,如果图像比帧缓冲区大(不是相同的尺寸),那么是什么定义了图像的哪个部分被使用(读/写) 一些细节: 规范指出这是一种有效的情况(我见过许多人指出帧缓冲区使用的附件必须与帧缓冲区本身的尺寸匹配,但我在规范中找不到对此的支持): pAttachments的每个元素的维度必须至少与相应的帧缓冲

此问题主要与结构中的尺寸参数(宽度、高度和层)有关

实际问题是: 如果在创建过程中使用的一个或多个的维度大于在用于创建中指定的维度,则如何控制在渲染过程实例期间使用该维度的哪个部分

换言之,问题: 我基本上是问,如果图像比帧缓冲区大(不是相同的尺寸),那么是什么定义了图像的哪个部分被使用(读/写)

一些细节: 规范指出这是一种有效的情况(我见过许多人指出帧缓冲区使用的附件必须与帧缓冲区本身的尺寸匹配,但我在规范中找不到对此的支持):

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

我想明确一点,我明白如果我只想画图像的一部分,我可以使用帧缓冲区,它具有与图像相同的尺寸,并使用and。但是,根据规范,剪刀和视口是相对于帧缓冲区(0,0)定义的,尽管我不清楚

我问这个问题是为了帮助我理解帧缓冲区,因为我肯定我误解了什么。我觉得很可能是这样的,帧缓冲区空间中的(x,y)总是(x,y)在图像空间中(因为无法控制使用了VkImageView的哪个部分)

我在这方面已经坚持了相当长的一段时间(~4天),并且尝试了Vulkan:Cookbook和Vulkan编程指南,阅读了大部分规范,并在线搜索

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


感谢阅读。

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

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

当然,
VkRenderPassBeginInfo
具有
renderArea
对象,但这更多是用户的承诺,而不是系统的保证:

应用程序必须确保(必要时使用剪刀)所有渲染都包含在渲染区域内,否则渲染区域外的像素将变得未定义,渲染区域外的碎片可能会产生着色器副作用

因此,基本上,该实现不需要使用
renderArea
。它没有设置转换或任何东西;您只是承诺不会影响该区域以外的帧缓冲区像素


在任何情况下,提供小于图像大小的帧缓冲区大小都没有什么意义。与帧缓冲区规范相比,这种事情更像是渲染区域的透视。

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


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

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