0
votes

I am looking in this demo for rendering a scene in vulkan using depth peeling Order Independent Transparency

Blog: https://matthewwellings.com/blog/depth-peeling-order-independent-transparency-in-vulkan/ Code: https://github.com/openforeveryone/VulkanDepthPeel

I have modified the code so that I am able to save the final render in an output image(png) before presenting for rendering to the surface.

Once the primary command buffer consisting secondary command buffers responsible for drawing operations is submitted to queue for execution & rendering is finished, I am using vkCmdCopyImageToBuffer for copying the data from the current swap chain image(The copy operation is done after introducing the image barrier to make sure rendering is completed first) to a VkBuffer & then mapping the buffer memory to an unsigned char pointer & writing this information to the PNG file. But the output which I see in the PNG is different from the one rendered on window as the boxes are almost entirely transparent with some RGB information as you can see in the image below.

My guess is this might be the case due to this particular demo involving multiple subpasses & I am not copying the data properly but only thing bothering me is that since I am directly copying from swapchain image just before finally presenting to the surface, I should be having the final color data in the image & hence PNG & render should match.

Rendered Frame: enter image description here Saved Frame:

enter image description here

Let me know if I have missed explaining any details, any help is appreciated. Thanks!

1
If I had to guess: I think you have transparency used as opacity (or vice versa) while saving the image to PNG. Or saved unintentionally with transparency anyway. - krOoze
I have another demo which is a simple triangle rendered on the cleared surface with all rendering done in single subpass being saved with the same png library correctly, so I think there aren't problems while saving the frame to png but there can be issues while reading the data for saving it to png which I am trying to figure out here. - Dilip Dewani

1 Answers

0
votes

You have alpha value 41 in the saved image.

If I just rewrite it to 255 then the images are identical.

You are probably using VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR with the swapchain, which does that automatically. But typical image viewer will treat the alpha as premultiplied — hence the perceived (brighter) image difference.