移动端实时阴影+自投影技术实现

news/2024/12/21 10:44:27/

说到实时阴影,现在市面上各个项目实现的实时阴影大部分都是平面阴影,比如王者荣耀实现的实时阴影以及一些RPG网络游戏实现实时阴影,所以项目在设计地形时都是有意回避地形高度差的出现,尽量让地形是平坦的。本篇博客介绍的实时阴影是可以在平面以及地形上进行的渲染。这样实现的实时阴影就可以在不同的地形上进行投影,实现方式采用的还是比较传统的实时阴影算法比如ShadowMap,CSM算法或者PSM算法等等都可以实现出来,另外,除了阴影投影到地面上的,我们还可以实现阴影的自投影,比如角色身上的盔甲可以投影到身体上面,类似崩坏三实现的效果。如下所示:
在这里插入图片描述
角色的投影地面并不是平坦的,再看一下自身投影的实现效果:
在这里插入图片描述
角色身上的头发或者裙子在自己身上投影。自身的投影实现相对来说比较耗,它要实时的计算遮挡关系。下面先给读者介绍将投影投到任意地形上面,实现的算法可以使用CSM算法,这个也是Unity引擎使用的算法。CSM算法是通过摄像机根据距离对场景由远及近进行划分,近处的物体投影比较精细,远处的物体投影相对来说比较简陋,这样对性能来说也是一种优化,如下所示:
在这里插入图片描述
摄像机生成好了后,需要加入Shader生成阴影其实简单点说就是像素深度的判断
代码如下所示:

		fixed4 frag (v2f i) : COLOR{float depth = i.depth.x/i.depth.y;#if defined (SHADER_TARGET_GLSL) depth = depth*0.5 + 0.5; //(-1, 1)-->(0, 1)#elif defined (UNITY_REVERSED_Z)depth = 1 - depth;       //(1, 0)-->(0, 1)#endifreturn EncodeFloatRGBA(depth);}

我们投影是投影到地面上或者墙上,从优化角度讲,我们会选择哪些可以接收阴影,哪些不接受阴影。这些需要接收的阴影的对象需要挂接一个Shader用于接收阴影,片段着色器代码如下所示:

			fixed4 frag (v2f i) : COLOR0 {fixed4 weights = getCascadeWeights(i.eyeZ);fixed4 coord = getShadowCoord(i.worldPos, weights);i.shadowCoord.xy = i.shadowCoord.xy/i.shadowCoord.w;float2 uv = i.shadowCoord.xy;uv = uv*0.5 + 0.5; //(-1, 1)-->(0, 1)fixed4 texcol = tex2D(_MainTex, uv);float depth = i.shadowCoord.z / i.shadowCoord.w;#if defined (SHADER_TARGET_GLSL)depth = depth*0.5 + 0.5; //(-1, 1)-->(0, 1)#elif defined (UNITY_REVERSED_Z)depth = 1 - depth;       //(1, 0)-->(0, 1)#endif// sample depth texturefloat4 col = SampleShadowTexture(i.worldPos, weights) * texcol;return col;}	

这样我们就完成了阴影的实现,效果如下所示:
在这里插入图片描述
这样我们的角色实现了可以将阴影投影到不同的地形上,下面再看看通过设置裁剪距离实现自身投影效果,如下所示:
在这里插入图片描述
大家可以看到红色方框内的阴影是角色衣服和武器投影到上面的,完美解决了该问题。

代码后续奉上。。。。。。。。。。


http://www.ppmy.cn/news/739110.html

相关文章

全息投影是计算机技术吗,全息投影、VR技术、AR增强现实技术的区别

2016年是AR/VR技术火热的一年,各大科技巨头相继涌入AR/VR领域,当更多的小伙伴更迷茫,分辨不清楚这几项科技到底是什么?为帮各位小伙伴解惑,光影百年给你带来的全新的解释。 一、全息投影 全息投影技术也称幻影成像技术…

【数字条纹投影技术基础2】非接触光学三维测量技术综述

Pre reading 它山之石可以攻玉,何况别人的方法可能是玉;依照惯例,书中第一章为技术综述,陈述DFP(Digital Fringe Projection)技术相对于其他技术的优势所在,并让大家对数字条纹投影技术这项技术…

数字光栅投影技术——相移轮廓术(PSP)

数字光栅投影技术——相移轮廓术 1. 前言2. 光栅投影的三维测量原理2.1 相位的获取2.2 相位——高度映射 3. 三维重建3.1 基于几何光路的模型3.2 基于双目视觉的模型3.3 重建结果 【参考文献】写在最后 1. 前言 光学三维测量技术种类繁多,其中结构光投影法是一种非常…

什么是轨道镜动态投影技术

轨道镜动态投影技术,市面上都叫轨道镜,我认为认为这个说法是不太直观和准确的,我更喜欢称呼它为泛空间投影技术,或动态投影技术。它实际上是投影手段的一种拓展,通过一面光损极小的前反射镜将投影机的画面发射出去&…

OpenCV图像处理中“投影技术”的使用

本文区分” 问题引出“、” 概念抽象 “、” 算法实现“三个部分 由表及里具体讲解OpenCV图像处理中“投影技术”的使用 ,并通过”答题卡识别“” OCR字符分割”“ 压板识别 ”“ 轮廓展开分析”四个的例子具体讲解算法使用。使得读者能够对 “投影技术”加速认识和理解,从而…

Shell脚本参数获取的两种方式

一、Shell 参数获取的两种方式 方式一 示例 新建一个test.sh文件 #!/bin/bash echo "shell 名称 $0" echo "参数1 $1" echo "参数2 $2" echo "参数3 $3" echo "参数4 $4" echo "参数5 $5"执行脚本 : sh…

vue有意思的图片动画插件direction-reveal

功能:操作简单好上头,动画特效很丝滑,有很多种供选择 1.下载插件 npm install direction-reveal --save-dev 2.使用 导入到需要使用动画的单页面 import DirectionReveal from direction-reveal; 使用样式 mounted() {this.query();},m…

解决HP ProLiant DL380 G5的安装与启动CentOS7时不能识别raid硬盘问题

最近去机房给一台HP DL380G5重装操作系统时,发现CentOS7无法识别到硬盘,这台服务器做的raid1,有理由怀疑新系统无法支持老机器的raid卡,查了些资料在此做个记录。 一、无法识别的原因 参看: https://www.kernel.org/…