深度缓冲区未填充阴影贴图渲染通道中的数据

Depth buffer is not filled with data in shadow map render pass

本文关键字:通道 数据 缓冲区 填充 阴影 深度      更新时间:2023-10-16

我目前正在 Vulkan 中研究我的着色。我已经根据SaschaWillem和Itoral的代码为我的阴影贴图创建了一个单独的渲染通道。我的应用程序的基础是基于VulkanTutorial的。

我遇到的问题是 Z 值应该写入的深度缓冲区完全由零填充。我目前正在将与相机相同的 MVP 传递给阴影贴图着色器。我已经将 RenderDoc 附加到我的应用程序,阴影贴图通道的网格输出选项卡包含与常规通道完全相同的gl_Position值。不幸的是,这些值没有像纹理查看器显示的那样保存到缓冲区。

同时,常规深度缓冲区使用常规着色器中计算的值正确填充。

"每次光栅器产生碎片时,深度测试都会 检查新片段是否比前一个片段更近。如果它 不是,则丢弃新片段。传递 深度测试将其自己的深度写入深度缓冲区。

看起来好像所有的碎片都被丢弃了。

我对如何进行完全没有想法。您能否指出我在哪里寻找此问题的原因的方向?

似乎渲染通道的清晰值是这里的问题。

std::array<VkClearValue, 1> clearValues = {}; 
clearValues[0].depthStencil = { 1.0f, 0 }; 
renderPassInfoStruct.clearValueCount = 1; 
renderPassInfoStruct.pClearValues = clearValues.data(); 

是为我解决了问题。以前索引 0 的颜色值设置为 { 0.f, 0.f, 0.f, 1.f };

谢谢杰西的建议,再次经历它,否则我可能永远不会找到它:)