• 虚拟平面光源的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));
    
    • 1
    • 2
    • 3
    • 4

    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("LightSourcePass", 31)); //渲染虚拟平面
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

  • 相关阅读:
    Ubuntu20.04安装gRPC-go
    网安学习笔记-day14,nmap和hydra常用命令
    使用Python实现3D曲线拟合
    flink1.10袋鼠云 迁移 flink1.15原生环境 事项汇总
    mediapipe 实现姿态分析——举手检测
    Android 顶部标签栏及内容列表的设计与实现
    第一章 数据分析与可视化概述
    2023年10月腾讯云优惠活动汇总:腾讯云最新优惠、代金券整理
    Transformer和Self-Attention
    基于FPGA 的SDRAM控制器
  • 原文地址:https://blog.csdn.net/wqdqwass/article/details/126545820