在片段着色器中显示格式为 VK_FORMAT_D24_UNORM_S8_UINT 的图像的深度

问题描述

上下文

我目前正在尝试显示使用 VK_FORMAT_D24_UnorM_S8_UINT 存储的图像的深度。

如果我正确阅读了文档,这种格式会将深度分量存储在 24 位浮点数(值介于 01 之间),并将深度存储在无符号 8 位整数。


Vulkan 设置

我尝试做的是首先使用 vkCmdcopyImage 复制此图像,然后使用以下复制参数“仅提取深度”:

constexpr VkImageAspectFlags source_aspects = VK_IMAGE_ASPECT_DEPTH_BIT
                                              | VK_IMAGE_ASPECT_STENCIL_BIT;

constexpr VkImageAspectFlags destination_aspects = VK_IMAGE_ASPECT_DEPTH_BIT;

const VkImagecopy copY_informatION =
{
    .srcSubresource =
    {
        .aspectMask     = source_aspects,.mipLevel       = 0,.baseArrayLayer = 0,.layerCount     = 1
    },.srcOffset =
    {
        .x = 0,.y = 0,.z = 0
    },.dstSubresource =
    {
        .aspectMask     = destination_aspects,.dstOffset =
    {
        .x = 0,.extent =
    {
        .width  = WIDTH,.height = HEIGHT,.depth  = 1
    }
};

GLSL 设置

然后我将它传递给看起来像这样的片段着色器:

#version 450

layout(set = 0,binding = 0) uniform sampler2D depth_sampler;


layout(location = 0) in vec2 screen_quad_position;


layout(location = 0) out vec4 fragment_colour;



void main()
{

    float depth = texture(depth_sampler,screen_quad_position).r;

    if(depth > 0.9999f)
    {
        discard;
    }

    fragment_colour = vec4(vec3((depth)),1);
}

如 Sacha Willems 先生所描述的那样,相应的顶点着色器只是一个全屏三角形(如此有效的全屏四边形)here

#version 450

layout(location = 0) out vec2 screen_quad_position;

out gl_PerVertex{vec4 gl_Position;};

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

结果

这确实产生了与我正在渲染的形状相对应的输出(具有后剔除的单一立方体,逆时针三角形顺序):

obtained result

不要介意边框不对称,我懒得截图了。

但我宁愿期待这样的事情:

expected result


猜测问题原因

我的猜测是 glsl float 存储在 32 位上(如果我没有误解 this page),但是由于深度是 24 位浮点,这完全与显示值。


最后,问题:

假设我无法更改深度模板图像的格式,在片段着色器中显示格式为 VK_FORMAT_D24_UnorM_S8_UINT 的图像的深度的正确方法是什么?

更一般地说,显示此类图像的正确方法是什么(“选择 VK_FORMAT_D32_SFLOAT”的解决方案当然是微不足道的)。

如果我忘记提供任何相关信息,请告诉我。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)