此问题主要与结构VkFramebufferCreateInfo中的尺寸参数(宽度,高度和图层)有关。< / p>
如果创建VkImageViews时使用的VkFrameBuffer中的一个或多个维度的维度大于用于创建VkFramebufferCreateInfo的VkFrameBuffer中指定维度的维度如何在渲染过程实例中控制VkImageView的哪一部分?
我基本上要求的是图像比帧缓冲区更大(不是相同的尺寸),是什么定义了图像的哪一部分被使用(读/写)?
规范声明这是一个有效的情况(我看到很多人说帧缓冲器使用的附件必须与帧缓冲器本身的尺寸相匹配,但我在规范中找不到对此的支持):< / p>
pAttachments的每个元素的尺寸必须至少与相应的帧缓冲尺寸一样大。
我想清楚,我明白如果我只是想要绘制图像的一部分,我可以使用与图像具有相同尺寸的帧缓冲,并使用{{3 }和viewports。但据我所知,剪刀和视口是相对于帧缓冲区(0,0)定义的,尽管我不清楚。
我问这个问题是为了帮助我了解帧缓冲,因为我确信我误解了一些东西。我觉得很可能是帧缓冲空间中的(x,y)总是(x,y)在图像空间中(因为没有办法控制 VkImageView 的哪一部分是使用)。
我已经坚持了很长一段时间(约4天),并尝试了 Vulkan:Cookbook 和 Vulkan编程指南,并阅读了大部分内容规范,并在线搜索。
如果问题需要澄清,请询问。我只是不想让它过长。
感谢您的阅读。
答案 0 :(得分:1)
控制渲染位置的方法是控制视口。也就是说,您指定的帧缓冲区大小实际上足以覆盖您可能想要渲染的目标图像的总面积,并使用视口变换/剪切渲染到这些图像的特定区域。
没有从帧缓冲区空间到图像空间的视口后转换。这绝对是多余的,因为我们已经有了NDC后变换。拥有其中两个是没有意义的。
当然,VkRenderPassBeginInfo
有renderArea
个对象,但这更多是来自用户的承诺,而不是对系统的保证:
应用程序必须确保(必要时使用剪刀)所有渲染都包含在渲染区域内,否则渲染区域外的像素将变为未定义,着色器副作用可能在渲染区域外发生碎片。
基本上,实现对renderArea
没有任何作用。它没有建立转变或任何东西;你只是承诺不会影响该区域之外的帧缓冲像素。
无论如何,提供一个小于图像大小的帧缓冲区大小真的没什么意义。这种事情更像是renderArea
的视角而不是帧缓冲规范。
答案 1 :(得分:1)
当帧缓冲区小于图像时,没有办法控制帧缓冲区使用图像的哪个部分。帧缓冲区原点始终映射到图像原点。
允许附件大于帧缓冲区只是为了允许在帧中重用内存/图像/视图用于多种用途,即使它们不需要相同的尺寸。典型的例子是重复使用深度缓冲区(但不是它的内容)用于几个不同的渲染过程。你可以用内存别名来完成同样的事情,但是必须支持多个API的引擎可能会更容易这样做。