Вопрос о внеэкранном рендерере Vulkan относительно примера кода от Саши Виллемса

Может кто-нибудь объяснить, как работает закадровый пример Саши Виллема?

В его закадровом примере похоже, что сцена ДОЛЖНА сначала рендериться в закадровый фреймбуфер, а затем добавляться во второй рендер. Однако я не совсем понимаю, как это происходит, в коде построения буфера команд я не вижу, как в конечном итоге представляется закадровый буфер кадра.

В другом примере raytracingbasic я вижу следующий код, который, как мне кажется, легче понять (я полагаю, что здесь изображение с трассировкой лучей просто копируется на изображение презентации цепочки обмена, тем самым обеспечивая представление на экране)

vkCmdCopyImage(drawCmdBuffers[i], storageImage.image, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, swapChain.images[i], VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &copyRegion);

«Я не понимаю, как в конечном итоге отображается закадровый буфер кадра». Если это «за кадром», то оно не отображается. Вот что значит называть его «закадровым буфером кадра».

Nicol Bolas 08.04.2023 22:01

Я понимаю, что это не отображается напрямую, но я не понимаю, как в примере содержимое закадрового буфера кадра влияет на окончательное изображение презентации.

spaghettifactory 08.04.2023 22:35

Из документации я нашел «Базовый закадровый рендеринг в два прохода. Первый проход отображает зеркальную сцену в отдельный буфер кадра с вложениями цвета и глубины, второй проход — образцы из этого вложения цвета для рендеринга зеркальной поверхности». Я не могу понять, где в коде указана "выборка"...

spaghettifactory 08.04.2023 22:38
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
64
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Отсутствует представление закадрового изображения. Закадровое изображение отображается во втором проходе рендеринга путем рисования зеркальной плоскости, взятой из закадрового изображения.

Копирование изображения, как в упомянутом вами примере трассировки лучей, в этом случае невозможно, поскольку зеркальная плоскость представляет собой трехмерный объект, а не полноэкранный треугольник, который никогда не меняет размер или ориентацию.

Это делается путем настройки дескриптора комбинированного сэмплера изображения из закадрового изображения в 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;
    };

Другие вопросы по теме