微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Vulkan Depth 缓冲区是 0 或 1永远不要介于两者之间

如何解决Vulkan Depth 缓冲区是 0 或 1永远不要介于两者之间

我遇到了深度缓冲区/测试不工作的问题。当我检查 RenderDoc 时,我发现深度缓冲区始终为 1,其中已呈现对象:depth_example。我期待在黑白之间有一种平滑的渐变。

编辑:GIF of problem

从昨天开始我一直在尝试解决这个问题,并且尝试了很多事情,例如:更改管道设置、更改渲染通道设置、检查帧缓冲区和深度纹理设置,甚至更改投影/视图矩阵。

验证层没有抛出任何错误,我一直在使用 RenderDoc 进行测试/调试。

如果有人想查看,我已经保存并上传了应用程序的 RenderDoc 捕获,它处于我尝试进行更改之前的状态:RenderDoc Capture

我将在下面发布一些我认为相关的代码,但在此之前我应该​​提到我正在使用 GLM 创建带有 GLM_FORCE_DEPTH_ZERO_TO_ONE + GLM_FORCE_LEFT_HANDED 定义的渲染矩阵。

rasterizerState.depthClampEnable = false;
rasterizerState.rasterizerdiscardEnable = false;
rasterizerState.polygonMode = vk::polygonMode::eFill;
rasterizerState.linewidth = 1.0f;
rasterizerState.cullMode = vk::CullModeFlagBits::eBack;
rasterizerState.frontFace = vk::FrontFace::eCounterClockwise;
rasterizerState.depthBiasEnable = false;

depthstencilstate.depthTestEnable = true;
depthstencilstate.depthWriteEnable = true;
depthstencilstate.depthCompareOp = vk::CompareOp::eLess;
depthstencilstate.depthBoundsTestEnable = false;
depthstencilstate.stencilTestEnable = false;
vk::ImageCreateInfo imageInfo{};
imageInfo.imageType = vk::ImageType::e2D;
imageInfo.format = depthFormat;
imageInfo.extent.width = m_swapchainWidth;
imageInfo.extent.height = m_swapchainHeight;
imageInfo.extent.depth = 1.0f;
imageInfo.mipLevels = 1;
imageInfo.arrayLayers = 1;
imageInfo.samples = vk::SampleCountFlagBits::e1;
imageInfo.tiling = vk::ImageTiling::eOptimal;
imageInfo.usage = vk::ImageUsageFlagBits::eDepthStencilAttachment | vk::ImageUsageFlagBits::eTransferSrc;

allocator.Allocate(imageInfo,VMA_MEMORY_USAGE_GPU_ONLY,&m_depthStencil.Image,&m_depthStencil.Allocation);

vk::ImageViewCreateInfo imageViewInfo{};
imageViewInfo.viewType = vk::ImageViewType::e2D;
imageViewInfo.image = m_depthStencil.Image;
imageViewInfo.format = depthFormat;
imageViewInfo.subresourceRange.baseMipLevel = 0;
imageViewInfo.subresourceRange.levelCount = 1;
imageViewInfo.subresourceRange.baseArrayLayer = 0;
imageViewInfo.subresourceRange.layerCount = 1;
imageViewInfo.subresourceRange.aspectMask = vk::ImageAspectFlagBits::eDepth;
if (depthFormat >= vk::Format::eD16UnormS8Uint)
{
    imageViewInfo.subresourceRange.aspectMask |= vk::ImageAspectFlagBits::eStencil;
}
vk::AttachmentDescription depthAttachment{};
depthAttachment.format = m_context->GetDepthFormat();
depthAttachment.samples = vk::SampleCountFlagBits::e1;
depthAttachment.loadOp = vk::AttachmentLoadOp::eClear;
depthAttachment.storeOp = vk::AttachmentStoreOp::eDontCare;
depthAttachment.stencilLoadOp = vk::AttachmentLoadOp::eDontCare;
depthAttachment.stencilstoreOp = vk::AttachmentStoreOp::eDontCare;
depthAttachment.initialLayout = vk::ImageLayout::eUndefined;
depthAttachment.finalLayout = vk::ImageLayout::eDepthStencilAttachmentOptimal;

vk::AttachmentReference depthAttachmentRef{};
depthAttachmentRef.attachment = 1;
depthAttachmentRef.layout = vk::ImageLayout::eDepthStencilAttachmentOptimal;

vk::SubpassDependency dependency{};
dependency.srcSubpass = VK_SUBPASS_EXTERNAL;
dependency.dstSubpass = 0;
dependency.srcStageMask = vk::PipelinestageFlagBits::eColorAttachmentOutput;
dependency.dstStageMask = vk::PipelinestageFlagBits::eColorAttachmentOutput;
dependency.srcAccessMask = {};
dependency.dstAccessMask = vk::AccessFlagBits::eColorAttachmentWrite;
renderPassInfo.dependencyCount = 1;
renderPassInfo.pDependencies = &dependency;
auto TransformComponent::GetTransform() const -> glm::mat4
{
    auto rot = glm::eulerAngleXYZ(Rotation.x,Rotation.y,Rotation.z);
    return glm::translate(glm::mat4(1.0f),Position) * rot * glm::scale(glm::mat4(1.0f),Scale);
}
auto TransformComponent::GetView() const -> glm::mat4
{
    auto transform = glm::translate(glm::mat4(1.0f),Position);
    transform = glm::rotate(transform,glm::radians(Rotation.y),{ 0,1.0f,0 });
    transform = glm::rotate(transform,glm::radians(Rotation.x),{ 1.0f,0 });
    return glm::inverse(transform);
}
auto CameraComponent::GetProj() const -> glm::mat4
{
    auto windowSize = Application::Get()->Getwindow()->GetSize();
    auto proj = glm::perspective(glm::radians(FieldOfView),windowSize.x / (float)windowSize.y,Near,Far);
    proj[1][1] *= -1.0f;
    return proj;
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。