前言
对原论文代码的结构解读,在进行vulkanVPI进行复现,以此来学习全局光照以及vulkan代码的相关操作。
一、main函数以及渲染通道的设置
1.文件模型的加载以及相关准备
//加载渲染文件以及各种视角等设置
ElayGraphics::ResourceManager::registerGameObject(std::make_shared<CSponza>("Sponza", 1));
ElayGraphics::ResourceManager::registerGameObject(std::make_shared<CLightCamera>("LightCamera", 2));
ElayGraphics::ResourceManager::registerGameObject(std::make_shared<CDynamicObject>("DynamicObject", 3));
2.渲染通道
1.其中SponzaGBufferPass 在原作者第二个复现论文中可以看到就是将原本的sponza渲染结果通过FBO存储了他的Albedo,Normal,Position.
2.RSMBufferPass :计算RSM 并输出RadiantFlux_,NormalAndRoughness_,Position_,AlbedoAndMetallic_;
3.LowRSMBufferPass:只输出了一个名为PlaneCentreTexture的Position的FOB。其作用是为了低等效果?不过作者并没有在着色器文件中添加额外的东西。应该是找到整个平面的中心?因为作者还设定了Type4MinFilter等东西。也设定了mipmap。
4.NormalComputePass:生成了一个两个纹理分别是:FirstTexture,SecondTexture。以及记录了RSMsize的2对数 - block 的对数值。同样没有采用计算着色器。内容较为复杂。不过它调用了自己的纹理图片说明需要进行更新。
5. CalculateEigenPass(计算特征的渲染通道):使用了计算着色器,应该是要计算特征值要用的,其中利用计算着色器存储了u_Normals[fragIndex]。绑定了Binding = 7 用于存储特征值。
6. CalculatePlanePass:使用了计算着色器。通过计算着色器的绑定使用了上面一个步骤生成的u_Normals。而生成的平面已备使用。绑定了Binding = 1用于存储平面。
7. FitContinuityPlanePass:拟合连续性平面,通过光场法拟合出一个更好的平面备用。绑定了Binding = 2 用于存储虚拟平面,又使用了binding = 3 记录了虚拟平面的个数。
8. CCalculateWeight:计算权重?使用计算着色器。一样生成了一个m_TextureConfig4AlbedoAndMetallic二维纹理图片。长度和宽度一样是RSMResolution。的长度与宽度。应该是用于计算虚拟平面的光照权重大小。
9. GaussianBlurPass:高斯模糊通道。通过半径生成了高斯模糊后的图片,用到了mipmap。也用到了上一步生成的CCalculateWeight作为输入纹理。一共输出10个纹理。
10.DirectLightPass :使用计算着色器,正常的直接光照效果并进行存储。
11.ShadingWithRSMPass:使用计算着色器渲染简介光照并且进行存储。
//渲染通道
ElayGraphics::ResourceManager::registerRenderPass(std::make_shared<GBufferPass>("SponzaGBufferPass", 0));
ElayGraphics::ResourceManager::registerRenderPass(std::make_shared<CRSMBufferPass>("RSMBufferPass", 3));
ElayGraphics::ResourceManager::registerRenderPass(std::make_shared<CLowRSMBufferPass>("LowRSMBufferPass", 4));
ElayGraphics::ResourceManager::registerRenderPass(std::make_shared<CNormalComputePass>("NormalComputePass", 5));
ElayGraphics::ResourceManager::registerRenderPass(std::make_shared<CCalculateEigenPass>("CalculateEigenPass", 6));
ElayGraphics::ResourceManager::registerRenderPass(std::make_shared<CCalculatePlane>("CalculatePlanePass", 7));
ElayGraphics::ResourceManager::registerRenderPass(std::make_shared<CFitContinuityPlanePass>("FitContinuityPlanePass", 8));
ElayGraphics::ResourceManager::registerRenderPass(std::make_shared<CCalculateWeight>("CCalculateWeight", 9));
ElayGraphics::ResourceManager::registerRenderPass(std::make_shared<CGaussianBlurPass>("GaussianBlurPass", 10));
ElayGraphics::ResourceManager::registerRenderPass(std::make_shared<CDirectLightPass>("DirectLightPass", 12));
ElayGraphics::ResourceManager::registerRenderPass(std::make_shared<CShadingWithRSMAndTilePass>("ShadingWithRSMPass", 13));
ElayGraphics::ResourceManager::registerRenderPass(std::make_shared<CScreenQuadPass>("ScreenQuadPass", 14)); //对屏幕空间进行总体渲染,顶点使用的是sponza
//ElayGraphics::ResourceManager::registerRenderPass(std::make_shared<CLightSourcePass>("LightSourcePass", 31)); //渲染虚拟平面