如何解决在片段着色器中显示格式为 VK_FORMAT_D24_UNORM_S8_UINT 的图像的深度
上下文
我目前正在尝试显示使用 VK_FORMAT_D24_UnorM_S8_UINT
存储的图像的深度。
如果我正确阅读了文档,这种格式会将深度分量存储在 24 位浮点数(值介于 0
和 1
之间),并将深度存储在无符号 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);
}
结果
这确实产生了与我正在渲染的形状相对应的输出(具有后剔除的单一立方体,逆时针三角形顺序):
不要介意边框不对称,我懒得截图了。
但我宁愿期待这样的事情:
猜测问题原因
我的猜测是 glsl float
存储在 32 位上(如果我没有误解 this page),但是由于深度是 24 位浮点,这完全与显示值。
最后,问题:
假设我无法更改深度模板图像的格式,在片段着色器中显示格式为 VK_FORMAT_D24_UnorM_S8_UINT
的图像的深度的正确方法是什么?
更一般地说,显示此类图像的正确方法是什么(“选择 VK_FORMAT_D32_SFLOAT
”的解决方案当然是微不足道的)。
如果我忘记提供任何相关信息,请告诉我。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。