Vulkan API — урок 57. Этап проверки глубины (+листинг)

Вложение глубины теперь готово к использованию, но проверку глубины все еще нужно активировать в графическом конвейере. Сие действо настраивается в структуре VkPipelineDepthStencilStateCreateInfo.

VkPipelineDepthStencilStateCreateInfo depthStencil = {};
depthStencil.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO;

Поле depthTestEnable думаю понятно из названия, активирует проверку глубины.

Поле depthWriteEnable определяет, будет ли глубина фрагментов, прошедших проверку, записана в буфер глубины. Это будет полезно для прозрачных объектов, их нужно сравнить с предыдущими непрозрачными объектами, но не причина отменять отрисовку последующих прозрачных объектов.

depthStencil.depthTestEnable = VK_TRUE;
depthStencil.depthWriteEnable = VK_TRUE

Поле  depthCompareOp определяет сравнение, которое сохранит или отбросит фрагмент.

depthStencil.depthCompareOp = VK_COMPARE_OP_LESS;

Поля depthBoundsTestEnable, minDepthBounds и maxDepthBounds используют для дополнительного теста связанной глубины. По сути, это позволяет сохранить фрагменты, которые находятся в пределах заданного диапазона глубины, нам не понадобится.

depthStencil.depthBoundsTestEnable = VK_FALSE;
depthStencil.minDepthBounds = 0.0f; // Optional
depthStencil.maxDepthBounds = 1.0f; // Optional

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

depthStencil.stencilTestEnable = VK_FALSE;
depthStencil.front = {}; // Optional
depthStencil.back = {}; // Optional

Далее обновим структуру VkGraphicsPipelineCreateInfo, включив в неё описанную выше структуру. Если проход рендера содержит вложение глубины, то этот шаг обязан быть описан.

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

realy_3d

Изменение разрешения

И последний штрих. Разрешение буфера глубины должно изменяться вслед за разрешением окна, потому добавим вызов createDepthResources() в recreateSwapChain:

void recreateSwapChain() {
    vkDeviceWaitIdle(device);

    createSwapChain();
    createImageViews();
    createRenderPass();
    createGraphicsPipeline();
    createDepthResources();
    createFramebuffers();
    createCommandBuffers();
}

И листинг.

Main Admin

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *