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

Пустой depth buffer, Vulkan (3 стр)

Страницы: 1 2 3
#30
14:54, 23 ноя. 2020

Dimich

Это перевод в VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL сразу после создания буфера, но это можно убрать так как пайплайн сам должен это делать. Я это конечно пробовал убирать, результат такой же - пустой буфер


#31
15:10, 23 ноя. 2020

Не надо чистить структуры через = {}. Явно заполняй все поля.

#32
22:36, 23 ноя. 2020

mrAndersen
> Да конечно, я скомпилил несколько демок, в них всё работает
Не переживай,  Открывай Render Doc и ставь диапазон глубин (у  меня к примеру 0.9 1.0):

[Vullkan RDoc Z Range | Пустой depth buffer, Vulkan]

или
поиграйся с  Z range в строках 345, 346
vkViewport.minDepth = 0.0f;
vkViewport.maxDepth = 1.0f;

не забудь про очистку Z другим значением:

.depthStencil = {1.0f, 0}

и для камеры Znear/Zfar:

uboProjection.projection = glm::perspective(glm::radians(45.0f), (float) vkExtent.width / (float) vkExtent.height, 0.0f, 100.0f)

В коде ошибок не нашел.

#33
0:13, 24 ноя. 2020

Andrey

Спасибо за советы! Попробовал поменять все значения, глубина не появляется =(. В рендердоке попробовал поставить другой диапазон как на скрине - но всё так же - просто меняется степень серого на сам аттач глубины полностью однотонный...

Так же не совсем мне понятно ведет себя znear\zfar, я правильно понимаю что я не должен видеть объекты которые находятся дальше чем zfar? При этом если выставить zfar = 1, я все равно вижу объекты дальше чем 1.0.

В каком именно месте пайплайна генерируется аттач глубин? Есть ли возможность продебажить только этот момент?

#34
11:27, 24 ноя. 2020
Andrey
> Не переживай

твоё старое демо? супердвижок

#35
11:30, 24 ноя. 2020

mrAndersen
> Есть ли возможность продебажить только этот момент?

запусти рендердок на примере саши и сравни

#36
18:13, 24 ноя. 2020

Автор, покажи как прикрепляешь фреймбуферы и как их чистишь в командном буфере.
Если ничего не помогает - сделай все как в Вулкан Туториал, без самодеятельности. Должно заработать.
Наверняка там наиглупейшая ошибка, сам постоянно такие делаю, потом ищу их по два дня. (Сейчас уже реже, но бывает).

#37
18:21, 24 ноя. 2020

MikeNew
> сделай все как в Вулкан Туториал, без самодеятельности. Должно заработать.
> Наверняка там наиглупейшая ошибка, сам постоянно такие делаю, потом ищу их по
> два дня

так я жеж так и предлагал :)
ключевое слово - без самодеятельности - инициатива наказуема

#38
19:29, 24 ноя. 2020

MikeNew

frameBuffers.resize(swapChainImages.size());

    for (int i = 0; i < frameBuffers.size(); i++) {
        std::vector<VkImageView> attachments = {
                swapChainImages[i].vkImageView,
                depthImageView
        };

        VkFramebufferCreateInfo vkFramebufferCreateInfo = {};
        vkFramebufferCreateInfo.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
        vkFramebufferCreateInfo.renderPass = renderPass;
        vkFramebufferCreateInfo.attachmentCount = attachments.size();
        vkFramebufferCreateInfo.pAttachments = attachments.data();
        vkFramebufferCreateInfo.width = vkExtent.width;
        vkFramebufferCreateInfo.height = vkExtent.height;
        vkFramebufferCreateInfo.layers = 1;


        assert_vk_result(
                vkCreateFramebuffer(m_gpu->getLogicalDevice(), &vkFramebufferCreateInfo, nullptr, &frameBuffers[i]),
                "Error creating frame buffer"
        )
    }

Создание фреймбуферов.

for (int i = 0; i < commandBuffers.size(); i++) {
        auto buf = commandBuffers[i];
        auto bufHandle = buf->getHandle();

        vkWaitForFences(m_gpu->getLogicalDevice(), 1, &drawFences[i], VK_TRUE, INT32_MAX);

        vkResetCommandBuffer(bufHandle, VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT);
        vkRenderPassBeginInfo.framebuffer = frameBuffers[i];

        buf->begin();

        {
            vkCmdBeginRenderPass(bufHandle, &vkRenderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);

            //main draw
            {
                vkCmdBindPipeline(bufHandle, VK_PIPELINE_BIND_POINT_GRAPHICS, graphicsPipeline);

                for (uint32_t j = 0; j < meshes.size(); j++) {
                    auto m = meshes[j];
                    auto info = m->getInfo();

                    vertices += m->getVertexCount();
                    VkBuffer v_buffers[] = {m->getVertexBuffer()};

                    auto i_buffer = m->getIndexBuffer();
                    VkDeviceSize offsets[] = {0};

                    vkCmdBindVertexBuffers(bufHandle, 0, 1, v_buffers, offsets);
                    vkCmdBindIndexBuffer(bufHandle, i_buffer, 0, VK_INDEX_TYPE_UINT32);

                    //Dynamicoffset
                    uint32_t offset = m_gpu->getRecommendedUniformBufferAlignment() * j;

                    vkCmdBindDescriptorSets(
                            bufHandle,
                            VK_PIPELINE_BIND_POINT_GRAPHICS,
                            vkPipelineLayout,
                            0,
                            1,
                            &info->descriptorSet,
                            1,
                            &offset
                    );

                    vkCmdDrawIndexed(bufHandle, m->getIndexCount(), 1, 0, 0, 0);
                }
            }

            //imgui draw
            {
                if (imDrawData) {
                    ImGui_ImplVulkan_RenderDrawData(imDrawData, bufHandle);
                }
            }

            vkCmdEndRenderPass(bufHandle);
        }

        buf->end();
    }

Перезапись команд буфера каждый фрейм. Что имеется ввиду под чисткой не совсем понял. То что ошибка тупая - я не сомневаюсь, но я уже по моему больше чем 2 дня потратил....

#39
19:41, 24 ноя. 2020

mrAndersen
> но я уже по моему больше чем 2 дня потратил....

берёшь код саши - меняешь строчку - смотришь - если успешно меняешь вторую и тд

#40
4:10, 25 ноя. 2020

mrAndersen
> Что имеется ввиду под чисткой не совсем понял.
Та, что при создание рендерпасса в коммандном буфере (вот так сделана в вулкан туториал):
(так то она не должна влиять, но я вспомнил что вроде как когда чистил несколько цветовых вложений что-то напутал с размерностью, и у меня в буфер глубины попадали значения для очистки цветовых вложений и вроде как я имел проблемы с буфером глубины из-за этого (но это не точно). В любом случае, не помешает проверить абсолютно все что имеет отношение к буферу глубины, даже если кажется что оно не может вызвать подобной ошибки):

            VkRenderPassBeginInfo renderPassInfo{};
            renderPassInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
            renderPassInfo.renderPass = renderPass;
            renderPassInfo.framebuffer = swapChainFramebuffers[i];
            renderPassInfo.renderArea.offset = {0, 0};
            renderPassInfo.renderArea.extent = swapChainExtent;

            std::array<VkClearValue, 2> clearValues{};
            clearValues[0].color = {0.0f, 0.0f, 0.0f, 1.0f};
            clearValues[1].depthStencil = {1.0f, 0};

            renderPassInfo.clearValueCount = static_cast<uint32_t>(clearValues.size());
            renderPassInfo.pClearValues = clearValues.data();
Страницы: 1 2 3
ПрограммированиеФорумГрафика

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