Может кто-нибудь объяснить, как работает закадровый пример Саши Виллема?
В его закадровом примере похоже, что сцена ДОЛЖНА сначала рендериться в закадровый фреймбуфер, а затем добавляться во второй рендер. Однако я не совсем понимаю, как это происходит, в коде построения буфера команд я не вижу, как в конечном итоге представляется закадровый буфер кадра.
В другом примере raytracingbasic я вижу следующий код, который, как мне кажется, легче понять (я полагаю, что здесь изображение с трассировкой лучей просто копируется на изображение презентации цепочки обмена, тем самым обеспечивая представление на экране)
vkCmdCopyImage(drawCmdBuffers[i], storageImage.image, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, swapChain.images[i], VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, ©Region);
Я понимаю, что это не отображается напрямую, но я не понимаю, как в примере содержимое закадрового буфера кадра влияет на окончательное изображение презентации.
Из документации я нашел «Базовый закадровый рендеринг в два прохода. Первый проход отображает зеркальную сцену в отдельный буфер кадра с вложениями цвета и глубины, второй проход — образцы из этого вложения цвета для рендеринга зеркальной поверхности». Я не могу понять, где в коде указана "выборка"...
Отсутствует представление закадрового изображения. Закадровое изображение отображается во втором проходе рендеринга путем рисования зеркальной плоскости, взятой из закадрового изображения.
Копирование изображения, как в упомянутом вами примере трассировки лучей, в этом случае невозможно, поскольку зеркальная плоскость представляет собой трехмерный объект, а не полноэкранный треугольник, который никогда не меняет размер или ориентацию.
Это делается путем настройки дескриптора комбинированного сэмплера изображения из закадрового изображения в 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;
};
«Я не понимаю, как в конечном итоге отображается закадровый буфер кадра». Если это «за кадром», то оно не отображается. Вот что значит называть его «закадровым буфером кадра».