Войти
ПрограммированиеФорумГрафика

Пустой depth buffer, Vulkan

Страницы: 1 2 3 Следующая »
#0
21:51, 22 ноя. 2020

Привет, понимаю что вопрос очень общий, но тем не менее. В vulkan никак не получается сделать depth buffer, всеми правдами и неправдами искал в чем может быть подвох, так и не нашёл. Рендер сейчас выглядит так

Изображение

При этом при дебаге в renderdoc четко видно что Depth Attachment белый, то есть сама картинка глубин как бы есть, но она пустая, при этом генерация других картинок (COLOR_BIT например) сделанная ровно таким же образом работает.

Так же если в VkPipelineDepthStencilStateCreateInfo при создании пайплайна указать не VK_COMPARE_OP_LESS_OR_EQUAL (как сейчас), а VK_COMPARE_OP_LESS то не показывается вообще ничего, что довольно логично при учете белого z-буфера.

Сам буфер делается ровно так же как в каждом мануале, который я находил в интернете, абсолютно никаких отличий. Генерация картинки, создание буфера на устройстве, выделение памяти и так далее.

Кусок с созданием аттачментов

std::vector<VkAttachmentDescription> attachments = {
            //color
            {
                    .format = colorFormat,
                    .samples = VK_SAMPLE_COUNT_1_BIT,
                    .loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR,
                    .storeOp = VK_ATTACHMENT_STORE_OP_STORE,
                    .stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE,
                    .stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE,
                    .initialLayout = VK_IMAGE_LAYOUT_UNDEFINED,
                    .finalLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR,
            },
            //depth
            {
                    .format = findDepthFormat(),
                    .samples = VK_SAMPLE_COUNT_1_BIT,
                    .loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR,
                    .storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE,
                    .stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE,
                    .stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE,
                    .initialLayout = VK_IMAGE_LAYOUT_UNDEFINED,
                    .finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
            }
    };

    std::vector<VkAttachmentReference> colorRefs = {
            //color
            {
                    .attachment = 0,
                    .layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
            },
    };

    std::vector<VkAttachmentReference> depthRefs = {
            //depth
            {
                    .attachment = 1,
                    .layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL
            },
    };

Кусок с VkSubpassDependency (наиболее не понятная до сих пор мне часть)

    std::vector<VkSubpassDependency> dependencies(2);

    dependencies[0].srcSubpass = VK_SUBPASS_EXTERNAL;
    dependencies[0].dstSubpass = 0;
    dependencies[0].srcStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT;
    dependencies[0].dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
    dependencies[0].srcAccessMask = VK_ACCESS_MEMORY_READ_BIT;
    dependencies[0].dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
    dependencies[0].dependencyFlags = VK_DEPENDENCY_BY_REGION_BIT;

    dependencies[1].srcSubpass = 0;
    dependencies[1].dstSubpass = VK_SUBPASS_EXTERNAL;
    dependencies[1].srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
    dependencies[1].dstStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT;
    dependencies[1].srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
    dependencies[1].dstAccessMask = VK_ACCESS_MEMORY_READ_BIT;
    dependencies[1].dependencyFlags = VK_DEPENDENCY_BY_REGION_BIT;

Кусок с VkPipelineDepthStencilStateCreateInfo

VkPipelineDepthStencilStateCreateInfo vkPipelineDepthStencilStateCreateInfo = {
            .sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO,
            .depthTestEnable = VK_TRUE,
            .depthWriteEnable = VK_TRUE,
            .depthCompareOp = VK_COMPARE_OP_LESS_OR_EQUAL,
            .depthBoundsTestEnable = VK_FALSE,
            .stencilTestEnable = VK_TRUE,
    };

Указатели на VkImageView генерируются перед созданием фрейм-буффера. Есть стойкое ощущение, что я что-то очень сильно делаю не так...


#1
22:05, 22 ноя. 2020

mrAndersen
примеры от саши смотри

#2
22:20, 22 ноя. 2020

VK_ATTACHMENT_STORE_OP_DONT_CARE поменяй на store у depth buffer-а для начала. Если тебе охота на него посмотреть в рендердоке.

#3
22:28, 22 ноя. 2020

HolyDel
А я и так и так делал, он всё равно белый, но насколько я понял рендердок показывает в моменте данные, а буфер отбрасывается уже после прохода если не ставить VK_ATTACHMENT_STORE_OP_STORE, но это не точно, в любом случае он белый и так и так =(

#4
22:28, 22 ноя. 2020

innuendo
А где это можно найти?

#5
22:30, 22 ноя. 2020

https://github.com/SaschaWillems/Vulkan/tree/master/examples

#6
22:35, 22 ноя. 2020

Ааа, так я конечно же его примеры смотрел, и не только его, один в один у меня сделано как в этом примере https://github.com/SaschaWillems/Vulkan/blob/master/examples/pipe… pipelines.cpp (и не только в этом) =( Собственно у меня и работает всё что я хочу кроме глубин, я уже отчаялся, убил часа 3 на самую простую кажется часть...

#7
22:40, 22 ноя. 2020

И слои, конечно, молчат?
Стенсил тест пробовал не включать?

#8
22:47, 22 ноя. 2020

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

На всякий случай дублирую картинку из renderdoc с VK_ATTACHMENT_STORE_OP_STORE, просто белый аттачмент

Изображение
#9
22:54, 22 ноя. 2020

Такой вот он Vulkan молчаливый :)))

#10
23:00, 22 ноя. 2020

mrAndersen
> один в один у меня сделано как в этом примере

там есть простые примеры - запускаешь - смотришь - анализируешь - кумекаешь

#11
23:11, 22 ноя. 2020

mrAndersen
ща посмотрел в своем фреймворке, где depth буфер работает. Вроде все тоже самое.

Вот на всякий случай как у меня DepthState задается:

VkStencilOpState zeroStencilState = {};
zeroStencilState.compareMask = 0xFFFFFFFFu;
zeroStencilState.compareOp = VkCompareOp::VK_COMPARE_OP_ALWAYS;
zeroStencilState.depthFailOp = VkStencilOp::VK_STENCIL_OP_ZERO;
zeroStencilState.failOp = VkStencilOp::VK_STENCIL_OP_ZERO;
zeroStencilState.passOp = VkStencilOp::VK_STENCIL_OP_ZERO;
zeroStencilState.reference = 0xFFFFFFFFu;
zeroStencilState.writeMask = 0xFFFFFFFFu;

VkPipelineDepthStencilStateCreateInfo depthStencilState = {};
depthStencilState.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO;
depthStencilState.pNext = nullptr;
depthStencilState.flags = 0;
depthStencilState.depthTestEnable = desc.depthTest;
depthStencilState.depthWriteEnable = desc.depthWrite;
depthStencilState.depthCompareOp = desc.depthTest ? VkCompareOp::VK_COMPARE_OP_LESS_OR_EQUAL : VkCompareOp::VK_COMPARE_OP_NEVER;
depthStencilState.depthBoundsTestEnable = false;
depthStencilState.stencilTestEnable = false;
depthStencilState.front = zeroStencilState;
depthStencilState.back = zeroStencilState;
depthStencilState.minDepthBounds = 0.0f;
depthStencilState.maxDepthBounds = 1.0f;
#12
23:20, 22 ноя. 2020

Там разве в рендере не надо еще чего-то там добавить ?
1) Create the depth buffer image object
2) Allocate the depth buffer device memory
3) Bind the memory to the image object
4) Create the depth buffer image view

https://vulkan-tutorial.com/Depth_buffering
https://vulkan.lunarg.com/doc/view/1.2.135.0/windows/tutorial/htm… h_buffer.html

#13
23:30, 22 ноя. 2020

ronniko

Всё это делаю, причем теми же функциями что и обычные картинки создаются с изменением флагов  на VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT соответственно

#14
0:28, 23 ноя. 2020

И очистку Depth делаешь как надо ?
https://stackoverflow.com/questions/35995198/vulkan-failing-to-clear-depth

Страницы: 1 2 3 Следующая »
ПрограммированиеФорумГрафика

Тема в архиве.