浅谈游戏中3种常用阴影渲染技术(1):平面阴影

12 篇文章 1 订阅
12 篇文章 4 订阅

浅谈游戏中3种常用阴影渲染技术(1):平面阴影

版权声明

  • 本文为“优梦创客”原创文章,您可以自由转载,但必须加入完整的版权声明
  • 更多学习资源请加QQ:1517069595获取(企业级性能优化/热更新/Shader特效/服务器/商业项目实战/每周直播/一对一指导)

前言

众所周知,在游戏当中,阴影是无处不在的,如果一款游戏没有阴影,那么不光画质会大大折扣,游戏性也会大大降低,因此,我将通过这篇文章给大家谈一谈关于三种阴影渲染方式相关的知识,由于篇幅所限,我将着重讲解一种基础的渲染方式即平面阴影的实现。如果你对其他两种进阶阴影方式的实现感兴趣,添加我们老师的QQ,进行详细的了解。

一、平面阴影

  • 平面阴影虽然是一种相对简单的渲染方式,但是在我们的平面游戏中是一种非常普遍的阴影渲染方式,比如王者荣耀中就采用了这种阴影渲染方式,如下图,右侧代码实际上就是王者荣耀平面阴影的一个代码实现(关于王者荣耀阴影随距离衰减方案可以扫描二维码添加我们的老师获得相关资料)在这里插入图片描述

1.1 实现步骤

  • 对一个角色模型进行了两次绘制(两个Pass):

    • 一次是利用模型数据绘制了游戏物体本身

    • 第二次是利用模型数据绘制角色阴影,我称这种绘制方法为两遍绘制。

  • 第一个Pass在我之前的视频中有介绍过,今天就不着重讲解了(关于卡通渲染可以观看我之前的公开课),这篇文章主要讲解第二个Pass的绘制

  • 首先要给大家介绍一下图形着色器,图形着色器由两个部分组成:

    • 第一部分为顶点渲染,确定顶点位置

      • 我们可以将一个基础模型看做是一个三角形,这个三角形由三个点构成,如何去控制这个三角形在场景中的位置呢?这时,就需要用到我们的顶点渲染程序来确定三角形的绘制位置。下面是一段顶点渲染程序。在这里插入图片描述
    • 第二部分为像素着色:

      • 当我们确定了三角形在场景中的位置之后,他的内部需要填充一个什么样的颜色呢?像素着色程序就是对三角形内部填充颜色的一个设置。下面是一段像素着色程序。在这里插入图片描述
  • 回到我们的游戏阴影绘制来说,我们究竟要在顶点程序和像素程序里面做什么呢?

    1. 首先,我们在顶点程序里面需要干两件事情,第一件事情,就是把所有的顶点变换到世界空间,同时在地面上产生一个垂直的投影,第二件事,我要计算我的光线,根据光线的投射方将对地面的投影做一个平移。

    2. 其次,当我们的模型投影好之后,就要对阴影进行一个着色,通过rgb和透明度的设置,也就是半透明混合,来达到本身的颜色和阴影的颜色进行混合,最后得到一个“五彩斑斓的黑“的阴影效果。

    3. 当你掌握了第二个pass的绘制,基本就达到了shader绘制入门的水平,但是在一个商业项目中,这样的一个阴影效果是不够完善的,如果单纯的利用这种方法渲染阴影,会产生很多问题。我会例举其中的几个问题,并提供我的解决方案。

1.2 平面阴影渲染所存在的问题

  1. 阴影重叠

    • 什么是阴影重叠?:

      • 阴影是半透明的,在渲染前,我们会开启阴影渲染的透明混合状态,模型的正面和背面的三角形可能重复渲染,造成不透明度的叠加,这种的叠加是非常杂乱无章的。如图所示,阴影非常地杂乱。 在这里插入图片描述
    • 造成阴影重叠的原因:

      • 其实主要原因是我们Unity中默认的叠加方法是加法叠加,使得一个阴影被渲染了多次(关于更多阴影实现的具体算法可以扫描二维码 ,加我们的老师领取相关资料)。
    • 解决方法:

      • 我们为了解决阴影重叠的问题,应当保证每个阴影区域只被渲染一次,如何做到每个阴影只渲染一次呢?这里我要为大家介绍一种名为模板缓冲区的东西,什么是模板缓冲区呢?模板缓冲区实质上就是一个和我们屏幕大小一样的二维数组,他的原理如图所示。
        在这里插入图片描述

      • 模板缓冲区对阴影进行渲染时,我们会在每一帧渲染时,将像素点的值设置为零,我们用零与特定的参考数值进行比较,当他满足比较条件即通过我们的模板测试时。

      • 对于通过测试的像素点,我们将他的模板值替换为参考值,当下一次在相同的位置进行渲染时,就无法通过模板测试,我们就舍弃了该片元,从而保证一个像素点只被渲染一次。

  2. 其他问题

    • 除了阴影重叠的问题之外,还存在着两个问题:

      1. 由于平面阴影所在的高度与地面相同,由于浮点精度问题,会造成“深度抖动问题”
        在这里插入图片描述
      2. 由于阴影是物体本体压扁形成的,所以,在地面边界处,物体的阴影可能超出边界
        在这里插入图片描述

如果想要深入解这些问题的解决方法,可以扫描二维码参加我们的公开课

1.3 小结

  • 优势:
    • 不需要打灯
    • 渲染速度快
  • 劣势
    • 只适用于平面表面
    • 高低起伏的地面上会出现阴影穿插,当出现地面起伏时,阴影会被凸起的地面遮挡
      在这里插入图片描述

系列配套视频戳这里

更多学习资源请加QQ:1517069595获取(/企业级性能优化/热更新/Shader特效/服务器/商业项目实战/每周直播/一对一指导)

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
《3D游戏:卷2 动画与高级实时渲染技术》是一本关于3D游戏开发的书籍。在这本书,作者详细介绍了动画制作和高级实时渲染技术游戏开发的应用。 首先,动画在游戏扮演着非常重要的角色。书介绍了不同类型的动画技术,包括骨骼动画、关键帧动画和蒙皮动画等。通过学习这些动画技术,开发者可以创建逼真的角色动作,使游戏世界更加生动和有趣。 其次,高级实时渲染技术是现代游戏开发的一个关键领域。书深入介绍了一些常用的高级实时渲染技术,如PBR(Physically Based Rendering)渲染、全局光照(Global Illumination)和HDR(High Dynamic Range)渲染等。这些技术可以使游戏画面更加逼真、细腻,并提升整体的视觉效果。 此外,书还介绍了一些实践案例和实用技巧,帮助读者更好地理解和应用所学知识。例如,如何创建合适的动画帧率、如何优化渲染性能等等。这些实用的技巧对于开发人员来说非常有价值,可以帮助他们提升游戏的质量和用户体验。 总的来说,《3D游戏:卷2 动画与高级实时渲染技术》是一本非常实用的游戏开发指南。通过学习这本书,开发人员可以了解并掌握动画制作和高级实时渲染技术,从而创建出更加引人入胜且视觉效果出色的3D游戏作品。无论是对于游戏开发初学者还是有经验的开发人员来说,这本书都是一本值得阅读的参考书籍。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值