Vulkan-点光源阴影映射

Vulkan-点光源阴影映射

  Cubemap是一种特殊数据结构,以其特殊的采样方式实现了球空间数据的采集。经典的使用是实现点光源的阴影映射。

  在openGL中实现cubemap纹理的生成,有两种方式:

  • 连续使用六次渲染,每次渲染cubemap的一面
  • 在几何着色器中直接投影六个方向,一次渲染

  两种渲染方式的性能在openL中差异不大。此次vulkan实现cubemap采用第一种方式。

  vulkan实现较为复杂,因为vulkan不支持直接将cubemap格式的纹理直接作为帧缓冲(FrameBuffer)的颜色附件(Color Attachment)。所以,只能将每一次渲染的结果拷贝到cubemap的一个面。拷贝指令需要记录到vulkan的commanBuffer中。但是由于CommandBuffer的不可修改(可连续记录,记录后不可修改)和块提交(为提高性能,所有六次渲染会被全部记录到commandBuffer中,一次全部执行),常用的uniform变量不能满足每次渲染一个cubemap面时,相机的参数改变。因此,此次实现关键分为两部分:

  • 使用push constant变量保存相机变换矩阵
  • 复制帧缓冲到cuemap的一个面

1 push constant使用

  简单介绍一下push constant,push constant是在管线布局(Pipeline Layout)中定义的着色器推送常量(shader push constants)。该常量并不通过在CPU端的内存拷贝更新(uniform变量是通过内存拷贝完成更新),而是通过vulkan指令(vkCmdPushConstants)实现。除却数据更新速度的差异,该常量对应的是在管线级别的数据更新。因此可以被用作每一次渲染,相机矩阵view矩阵数据的更新(投影矩阵不需要更新)。

  使用push constant,在vulkan中实现如下:

  • 在shader中定义代码如下:

    layout(push_constant) uniform ViewVec
    {
    	vec3 lookDir;
    	vec3 lookUp;
    } viewVec;
    
  • 在vulkan中需要配置与shader中对应的资源类型。在vulkan中,与shader中对应的资源据需要自己配置。

VkPushConstantRange ConstantRange;
ConstantRange.stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
ConstantRange.size = sizeof(SLookParmter);//SLookParmter是ViewVec数据类型
ConstantRange.offset = 0;
  • 在管线中配置该数据类型,我认为主要是分配数据空间:

    PipelineLayoutInfo.pushConstantRangeCount = vPushConstants.size();
    PipelineLayoutInfo.pPushConstantRanges = vPushConstants.data();
    //vpushConstants是对应VkPushConstantRange的数据
    
  • 使用vulkan指令更新push constant:

    switch (vFaceIndex)
    	{
    	case 0:
    		LookDir = glm::vec3(1.0f, 0.0f, 0.0f);//不能生成
    		LookUp = glm::vec3(0.0f, -1.0f, 0.0f);
    		break;
    	case 1:
    		LookDir = glm::vec3(-1.0f, 0.0f, 0.0f);
    		LookUp = glm::vec3(0.0f, -1.0f, 0.0f);
    		break;
    	case 2:
    		LookD
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值