谁能解释一下萨沙·威廉在屏幕外的例子是如何工作的?
在他的离屏示例中,看起来场景应该首先渲染到离屏帧缓冲区,然后添加到第二次渲染。然而,我不太清楚这是如何发生的,在命令缓冲区构建代码中,我没有看到屏幕外framebuffer最终是如何呈现的。
在另一个例子raytracingbasic中,我看到下面的代码,我觉得更容易理解(我相信这里的光线跟踪图像只是被复制到交换链表示图像上,从而允许在屏幕上显示)
vkCmdCopyImage(drawCmdBuffers[i], storageImage.image, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, swapChain.images[i], VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, ©Region);
没有显示屏幕外的图像。通过绘制从屏幕外图像采样的镜像平面,在第二次渲染通道中显示屏幕外图像。
在这种情况下,像你提到的光线追踪样本一样复制图像是不可能的,因为镜像平面是一个3D对象,而不是一个永远不会改变大小或方向的全屏三角形。
这是通过在setupDescriptorSet
中设置一个来自屏幕外图像的组合图像采样器描述符来完成的:
std::vector<VkWriteDescriptorSet> writeDescriptorSets =
{
// Binding 0 : Vertex shader uniform buffer
vks::initializers::writeDescriptorSet(
descriptorSets.mirror,
VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
0,
&uniformBuffers.vsMirror.descriptor),
// Binding 1 : Fragment shader texture sampler
vks::initializers::writeDescriptorSet(
descriptorSets.mirror,
VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
1,
&offscreenPass.descriptor),
};
采样本身然后在片段着色器(mirror.frag
)中完成:
layout (binding = 1) uniform sampler2D samplerColor;
...
if (gl_FrontFacing)
{
// Only render mirrored scene on front facing (upper) side of mirror surface
vec4 reflection = vec4(0.0);
for (int x = -3; x <= 3; x++)
{
for (int y = -3; y <= 3; y++)
{
reflection += texture(samplerColor, vec2(projCoord.s + x * blurSize, projCoord.t + y * blurSize)) / 49.0;
}
}
outFragColor += reflection;
};