Я пытаюсь реализовать отображение теней в рендере компании, но я застрял при записи результатов глубины в приложение глубины. Я хочу записать в нормализованное расстояние вложения глубины от источника света до фрагмента через gl_FragDepth
выходную переменную внутри фрагментного шейдера, но документ рендера показывает, что вложение глубины вообще не обновляется. В качестве глубинного прикрепления я использую вид для многослойного 2D-изображения с 6 слоями и установленным флагом CubeCompatible
, с форматом D32Sfloat
и во время подпрохода изображение имеет макет DepthStencilAttachmentOptimal
. Каждая из граней куба имеет свой собственный вид и прикрепляется как вложенная глубина внутри рендеринга прохода рендеринга в него. Для прохода рендеринга описание вложения настроено как:
format = shadowCubeMap.getDescription().format;
samples = vk::SampleCountFlagBits::e1;
loadOp = vk::AttachmentLoadOp::eLoad;
storeOp = vk::AttachmentStoreOp::eStore;
stencilLoadOp = vk::AttachmentLoadOp::eDontCare;
stencilStoreOp = vk::AttachmentStoreOp::eDontCare;
initialLayout = vk::ImageLayout::eDepthStencilAttachmentOptimal;
finalLayout = vk::ImageLayout::eDepthStencilAttachmentOptimal;
И, конечно, при создании конвейера для подпроцесса 0 в rp (во время которого устанавливается, что макет остается eDepthStencilAttachmentOptimal), я настраиваю PipelineDepthStencilState
как:
depthTestEnable = VK_TRUE;
depthWriteEnable = VK_TRUE;
depthCompareOp = vk::CompareOp::eLessOrEqual;
Я несколько раз проверял, правильно ли записал cmd-буфер (что я связываюсь с собственными ресурсами состояния буфера cmd).
Render Doc показывает мне, что есть некоторые вершины, образующие треугольник, выходящий из вершинного шейдера, который должен быть растеризован и обработан фрагментным шейдером, где я должен быть в состоянии вычислить глубину и записать ее во вложении через gl_FragDepth, но внутри него ничего не написано , Кто-нибудь знает, где проблема должна лежать?
Извините, ребята, что я не могу показать вам весь код, во-первых, весь код Vulkan абстрагируется с помощью методов и объектов-обёрток, во-вторых, и самое главное, код является частным.
p.s: Я не знаю, какую еще информацию я должен включить, но спросите меня более подробно, если вы найдете что-то, что должно помочь решить это дело.