Vulkan переворачивает результат просмотра на черный экран - PullRequest
2 голосов
/ 05 апреля 2020

Я пытаюсь инвертировать окно просмотра vulkan вместо инвертирования всего остального, но это приводит к черному экрану. Черный экран выглядит так, будто он исходит от одного из моих шейдеров.

Код для инвертирования окна просмотра:

VkRect2D renderArea = {};
renderArea.offset = {0, 0};
renderArea.extent = {
    static_cast<uint32_t>(renderStage.GetSize().x),
    static_cast<uint32_t>(renderStage.GetSize().y)
};

VkViewport viewport;
viewport.x = 0.0f;
viewport.y = static_cast<float>(renderArea.extent.height); 
viewport.width = static_cast<float>(renderArea.extent.width);
viewport.height = -static_cast<float>(renderArea.extent.height);
viewport.minDepth = 0.0f;
viewport.maxDepth = 1.0f;
vkCmdSetViewport(
    *commandBuffers_[swapchain_->GetActiveImageIndex()],
    0,
    1,
    &viewport);

При рендеринге do c Я вижу, что материал отрисовывается в кадровом буфере, но в какой-то момент после указанного c шейдера все становится черным (это работает просто отлично, если я не делаю инверсию). Вершинный шейдер (световой проход в отложенном рендеринге)

void main() 
{
    outUV = vec2((gl_VertexIndex << 1) & 2, gl_VertexIndex & 2);
    gl_Position = vec4(outUV * 2.0f - 1.0f, 0.0f, 1.0f);
}

Ввод прохода enter image description here

Вывод прохода enter image description here

1 Ответ

1 голос
/ 06 апреля 2020

Черный вывод, вероятно, является вашим чистым цветом, что означает, что ваша геометрия либо отбрасывается, либо выходит за пределы области просмотра.

Если вы переворачиваете область просмотра в Vulkan 1.0, вам также необходимо включить VK_KHR_maintenance1 (в Vulkan 1.1. Это было повышено до уровня ядра).

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

...