虚拟平面光源的vulkanAPI复现-原文分析


前言

对原论文代码的结构解读,在进行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)); //渲染虚拟平面

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值