• 虚拟平面光源的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

  • 相关阅读:
    Mac硬件设备系统环境的升级/更新 macOS
    Nginx源码分析
    【Redis入门笔记 03】三种特殊数据类型
    Goland debug runc step by step
    Open3D C++文章目录汇总
    即时编译(下)
    STC15单片机-状态机点灯
    企业部署,springboot+vue+vue,Linux上部署mysql与redis,docker中部署nginx,jenkins。完整详细。
    学生网站模板—千岛湖旅游(6页) HTML+CSS+JavaScript web网页设计—— 出游 旅途
    35-Java方法的定义格式、常见问题
  • 原文地址:https://blog.csdn.net/wqdqwass/article/details/126545820