当执行VkAttachmentDescription中的“ loadOp”时?

时间:2019-08-30 17:52:15

标签: c++ vulkan

我正在创建一个使用简单的阴影贴图渲染阴影的应用程序。

通行证是这样完成的: 屏幕外通过创建阴影贴图->最后通过渲染到交换链,并使用上一遍的深度纹理

我的问题是第一次通过。我使用单个顶点着色器渲染模型,并且仅关联深度纹理。 在管道中,我只有一个附件:

VkAttachmentDescription depthAttachment = {};
depthAttachment.format = m_depthFormat;
depthAttachment.samples = m_msaaSamples;
depthAttachment.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
depthAttachment.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
depthAttachment.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
depthAttachment.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;

在这里,我将“ loadOp”设置为VK_ATTACHMENT_LOAD_OP_CLEAR,但似乎该操作在第二遍执行之前完成。 将“ loadOp”设置为VK_ATTACHMENT_LOAD_OP_DONT_CARE可以在IntelHD Graphics上使用,但不能在Nvidia显卡上使用。

我不确定何时执行“ loadOp”。

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

问题出在值明确。

我使用了2个明确的值:

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

正确的清除只有深度清除:

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