当前位置:网站首页>浅谈游戏中3种常用阴影渲染技术(1):平面阴影
浅谈游戏中3种常用阴影渲染技术(1):平面阴影
2022-08-10 05:37:00 【优梦创客】
浅谈游戏中3种常用阴影渲染技术(1):平面阴影
版权声明
- 本文为“优梦创客”原创文章,您可以自由转载,但必须加入完整的版权声明
- 更多学习资源请加QQ:1517069595获取(企业级性能优化/热更新/Shader特效/服务器/商业项目实战/每周直播/一对一指导)
前言
众所周知,在游戏当中,阴影是无处不在的,如果一款游戏没有阴影,那么不光画质会大大折扣,游戏性也会大大降低,因此,我将通过这篇文章给大家谈一谈关于三种阴影渲染方式相关的知识,由于篇幅所限,我将着重讲解一种基础的渲染方式即平面阴影的实现。如果你对其他两种进阶阴影方式的实现感兴趣,添加我们老师的QQ,进行详细的了解。
一、平面阴影
- 平面阴影虽然是一种相对简单的渲染方式,但是在我们的平面游戏中是一种非常普遍的阴影渲染方式,比如王者荣耀中就采用了这种阴影渲染方式,如下图,右侧代码实际上就是王者荣耀平面阴影的一个代码实现(关于王者荣耀阴影随距离衰减方案可以扫描二维码添加我们的老师获得相关资料)
1.1 实现步骤
对一个角色模型进行了两次绘制(两个Pass):
一次是利用模型数据绘制了游戏物体本身
第二次是利用模型数据绘制角色阴影,我称这种绘制方法为两遍绘制。
第一个Pass在我之前的视频中有介绍过,今天就不着重讲解了(关于卡通渲染可以观看我之前的公开课),这篇文章主要讲解第二个Pass的绘制
首先要给大家介绍一下图形着色器,图形着色器由两个部分组成:
第一部分为顶点渲染,确定顶点位置
- 我们可以将一个基础模型看做是一个三角形,这个三角形由三个点构成,如何去控制这个三角形在场景中的位置呢?这时,就需要用到我们的顶点渲染程序来确定三角形的绘制位置。下面是一段顶点渲染程序。
- 我们可以将一个基础模型看做是一个三角形,这个三角形由三个点构成,如何去控制这个三角形在场景中的位置呢?这时,就需要用到我们的顶点渲染程序来确定三角形的绘制位置。下面是一段顶点渲染程序。
第二部分为像素着色:
- 当我们确定了三角形在场景中的位置之后,他的内部需要填充一个什么样的颜色呢?像素着色程序就是对三角形内部填充颜色的一个设置。下面是一段像素着色程序。
- 当我们确定了三角形在场景中的位置之后,他的内部需要填充一个什么样的颜色呢?像素着色程序就是对三角形内部填充颜色的一个设置。下面是一段像素着色程序。
回到我们的游戏阴影绘制来说,我们究竟要在顶点程序和像素程序里面做什么呢?
首先,我们在顶点程序里面需要干两件事情,第一件事情,就是把所有的顶点变换到世界空间,同时在地面上产生一个垂直的投影,第二件事,我要计算我的光线,根据光线的投射方将对地面的投影做一个平移。
其次,当我们的模型投影好之后,就要对阴影进行一个着色,通过rgb和透明度的设置,也就是半透明混合,来达到本身的颜色和阴影的颜色进行混合,最后得到一个“五彩斑斓的黑“的阴影效果。
当你掌握了第二个pass的绘制,基本就达到了shader绘制入门的水平,但是在一个商业项目中,这样的一个阴影效果是不够完善的,如果单纯的利用这种方法渲染阴影,会产生很多问题。我会例举其中的几个问题,并提供我的解决方案。
1.2 平面阴影渲染所存在的问题
阴影重叠
什么是阴影重叠?:
- 阴影是半透明的,在渲染前,我们会开启阴影渲染的透明混合状态,模型的正面和背面的三角形可能重复渲染,造成不透明度的叠加,这种的叠加是非常杂乱无章的。如图所示,阴影非常地杂乱。
- 阴影是半透明的,在渲染前,我们会开启阴影渲染的透明混合状态,模型的正面和背面的三角形可能重复渲染,造成不透明度的叠加,这种的叠加是非常杂乱无章的。如图所示,阴影非常地杂乱。
造成阴影重叠的原因:
- 其实主要原因是我们Unity中默认的叠加方法是加法叠加,使得一个阴影被渲染了多次(关于更多阴影实现的具体算法可以扫描二维码 ,加我们的老师领取相关资料)。
解决方法:
我们为了解决阴影重叠的问题,应当保证每个阴影区域只被渲染一次,如何做到每个阴影只渲染一次呢?这里我要为大家介绍一种名为模板缓冲区的东西,什么是模板缓冲区呢?模板缓冲区实质上就是一个和我们屏幕大小一样的二维数组,他的原理如图所示。
模板缓冲区对阴影进行渲染时,我们会在每一帧渲染时,将像素点的值设置为零,我们用零与特定的参考数值进行比较,当他满足比较条件即通过我们的模板测试时。
对于通过测试的像素点,我们将他的模板值替换为参考值,当下一次在相同的位置进行渲染时,就无法通过模板测试,我们就舍弃了该片元,从而保证一个像素点只被渲染一次。
其他问题
除了阴影重叠的问题之外,还存在着两个问题:
- 由于平面阴影所在的高度与地面相同,由于浮点精度问题,会造成“深度抖动问题”
- 由于阴影是物体本体压扁形成的,所以,在地面边界处,物体的阴影可能超出边界
- 由于平面阴影所在的高度与地面相同,由于浮点精度问题,会造成“深度抖动问题”
如果想要深入解这些问题的解决方法,可以扫描二维码参加我们的公开课
1.3 小结
- 优势:
- 不需要打灯
- 渲染速度快
- 劣势
- 只适用于平面表面
- 高低起伏的地面上会出现阴影穿插,当出现地面起伏时,阴影会被凸起的地面遮挡
更多学习资源请加QQ:1517069595获取(/企业级性能优化/热更新/Shader特效/服务器/商业项目实战/每周直播/一对一指导)
边栏推荐
猜你喜欢
LeetCode 2011.执行操作后的变量值(简单)
PyTorch之训练技巧
通过配置CubeMX的TIMER的PWM初始化实现硬件PWM呼吸灯闪烁
STM32F407ZG GPIO输出相关实验
Pico设备中的截图以及视频文件通过adb命令保存到电脑中
LeetCode 94. Inorder Traversal of Binary Trees (Simple)
三种素数筛总结——(朴素筛,埃氏筛,线性筛)
LruCache与DiskLruCache结合简单实现ImageLoader
STM32单片机RGB红蓝调光植物补光系统红光蓝光PWM调色调节亮度
LeetCode 292. Nim Game (Simple)
随机推荐
【fiddler3】使用fiddler设置弱网模式
Unity中Xml简介以及通过脚本读取Xml文本中的内容
Notes for Netual Network
【目标检测】相关指标的引入与解析
LruCache与DiskLruCache结合简单实现ImageLoader
溶液中重金属去除
每日刷题(day03)——leetcode 899. 有序队列
LeetCode 100.相同的树(简单)
离散数学的学习记录
(Flutter报错)Cannot run with sound null safety, because the following dependencies
Convolutional Neural Network (CNN) for Clothing Image Classification
STM32单片机OLED俄罗斯方块单片机小游戏
Deep learning TensorFlow entry environment configuration
【图像识别】训练一个最最简单的AI使其识别Vtuber
【C语言】结构体变量学习笔记1
优先级队列,大小顶堆PriorityQueue
STM32单片机手机APP蓝牙高亮RGB彩灯控制板任意颜色亮度调光
ASP.NET连接SQL Server的步骤
.Net Core imports tens of millions of data to Mysql
51单片机RS485远程双机多机温度采集主从机多节点蜂鸣器报警