Vulkan:帧缓冲区大于图像尺寸
Vulkan: Framebuffer larger than Image dimensions
这个问题主要涉及尺寸参数(宽度、高度和层 ) 在结构 VkFramebufferCreateInfo.
中
真题:
如果一个或多个VkImageViews,用于创建一个 VkFrameBuffer,其尺寸大于用于创建 VkFrameBuffer[=57 的 VkFramebufferCreateInfo 中指定的尺寸=],如何控制在渲染过程实例中使用 VkImageView 的哪一部分?
替代措辞问题:
我基本上是在问,如果图像比帧缓冲区大(尺寸不同),是什么定义了使用图像的哪一部分 (read/write)?
一些细节:
规范说明这是一种有效的情况(我看到很多人说帧缓冲区使用的附件必须与帧缓冲区本身的尺寸相匹配,但我在规范中找不到对此的支持):
Each element of pAttachments must have dimensions at least as large as the corresponding framebuffer dimension.
我想明确一点,我知道如果我只想绘制图像的一部分,我可以使用与图像具有 相同 尺寸的帧缓冲区,并使用 viewports and scissors。但是据我从规范中可以看出,剪刀和视口是相对于帧缓冲区的 (0,0) 定义的,尽管我不清楚。
我问这个问题是为了帮助我理解帧缓冲区,因为我确定我误解了一些东西。我觉得帧缓冲区 space 中的 (x,y) 很可能是图像 space 中的 (x,y)(因为没有办法控制 space 的哪一部分=38=]使用VkImageView).
我已经坚持了很长一段时间(~4 天),并且尝试了 Vulkan:Cookbook 和 Vulkan 编程指南,并阅读了大部分规范,并在线搜索。
如果问题需要澄清,请询问。只是不想写得太长。
感谢您的阅读。
控制渲染位置的方法是控制视口。也就是说,您指定的帧缓冲区大小实际上足以覆盖您可能想要渲染到的目标图像的总区域,并使用视口 transform/scissoring 渲染到这些图像的特定区域。
没有 post-从帧缓冲区 space 到图像 space 的视口转换。这显然是多余的,因为我们已经有了 post-NDC 转换。两个都没意义。
当然,VkRenderPassBeginInfo
有 renderArea
对象,但这更像是 来自 用户的承诺,而不是对系统的保证:
The application must ensure (using scissor if necessary) that all rendering is contained within the render area, otherwise the pixels outside of the render area become undefined and shader side effects may occur for fragments outside the render area.
所以基本上,实现不会对 renderArea
做任何事情。它没有设置转换或任何东西;您只是承诺该区域外的帧缓冲区像素不会受到影响。
无论如何,提供小于图像大小的帧缓冲区大小确实没有什么意义。这种事情更多的是 renderArea
的观点而不是帧缓冲区规范。
当帧缓冲区小于图像时,无法控制帧缓冲区使用图像的哪一部分。帧缓冲区原点始终映射到图像原点。
允许附件大于帧缓冲区仅意味着允许在一个框架中出于多种目的重复使用 memory/images/views,即使它们并不都需要相同的尺寸。典型的例子是为几个不同的渲染过程重用深度缓冲区(但不是它的内容)。您可以使用内存别名完成同样的事情,但是必须支持多个 API 的引擎可能会发现以这种方式更容易做到这一点。
这个问题主要涉及尺寸参数(宽度、高度和层 ) 在结构 VkFramebufferCreateInfo.
中真题:
如果一个或多个VkImageViews,用于创建一个 VkFrameBuffer,其尺寸大于用于创建 VkFrameBuffer[=57 的 VkFramebufferCreateInfo 中指定的尺寸=],如何控制在渲染过程实例中使用 VkImageView 的哪一部分?
替代措辞问题:
我基本上是在问,如果图像比帧缓冲区大(尺寸不同),是什么定义了使用图像的哪一部分 (read/write)?
一些细节:
规范说明这是一种有效的情况(我看到很多人说帧缓冲区使用的附件必须与帧缓冲区本身的尺寸相匹配,但我在规范中找不到对此的支持):
Each element of pAttachments must have dimensions at least as large as the corresponding framebuffer dimension.
我想明确一点,我知道如果我只想绘制图像的一部分,我可以使用与图像具有 相同 尺寸的帧缓冲区,并使用 viewports and scissors。但是据我从规范中可以看出,剪刀和视口是相对于帧缓冲区的 (0,0) 定义的,尽管我不清楚。
我问这个问题是为了帮助我理解帧缓冲区,因为我确定我误解了一些东西。我觉得帧缓冲区 space 中的 (x,y) 很可能是图像 space 中的 (x,y)(因为没有办法控制 space 的哪一部分=38=]使用VkImageView).
我已经坚持了很长一段时间(~4 天),并且尝试了 Vulkan:Cookbook 和 Vulkan 编程指南,并阅读了大部分规范,并在线搜索。
如果问题需要澄清,请询问。只是不想写得太长。
感谢您的阅读。
控制渲染位置的方法是控制视口。也就是说,您指定的帧缓冲区大小实际上足以覆盖您可能想要渲染到的目标图像的总区域,并使用视口 transform/scissoring 渲染到这些图像的特定区域。
没有 post-从帧缓冲区 space 到图像 space 的视口转换。这显然是多余的,因为我们已经有了 post-NDC 转换。两个都没意义。
当然,VkRenderPassBeginInfo
有 renderArea
对象,但这更像是 来自 用户的承诺,而不是对系统的保证:
The application must ensure (using scissor if necessary) that all rendering is contained within the render area, otherwise the pixels outside of the render area become undefined and shader side effects may occur for fragments outside the render area.
所以基本上,实现不会对 renderArea
做任何事情。它没有设置转换或任何东西;您只是承诺该区域外的帧缓冲区像素不会受到影响。
无论如何,提供小于图像大小的帧缓冲区大小确实没有什么意义。这种事情更多的是 renderArea
的观点而不是帧缓冲区规范。
当帧缓冲区小于图像时,无法控制帧缓冲区使用图像的哪一部分。帧缓冲区原点始终映射到图像原点。
允许附件大于帧缓冲区仅意味着允许在一个框架中出于多种目的重复使用 memory/images/views,即使它们并不都需要相同的尺寸。典型的例子是为几个不同的渲染过程重用深度缓冲区(但不是它的内容)。您可以使用内存别名完成同样的事情,但是必须支持多个 API 的引擎可能会发现以这种方式更容易做到这一点。