以区块链为核心的数字科技可以推动信息技术服务,从而促进数字产业化;元宇宙可以创造和创新更广泛的应用场景,拉动信息消费促进产业数字化。因此,以区块链为核心的Web3.0技术体系推动形成的元宇宙数字生态,将对数字产业化和产业数字化提供有力支撑,为数字经济高质量发展打造新引擎。
Shader"iPhone/SimpleShadow"
{
Properties
{
_MainTex("MainTex",2D)=""{}
}
SubShader
{
Tags{"Queue"="Transparent"}
Pass
{
Blend SrcAlpha OneMinusSrcAlpha
Color[_clrBase]
Cull Off
Lighting Off
SetTexture[_MainTex]{combine texture,one-texture}
}
}
}
通过以上设置即可生成最简单的阴影效果,大家可以通过自己设定脚本来控制阴影的移动和变化等等。
但是,该阴影生成方法有一个明显的“硬伤”,即该阴影只能适用于平坦的地面,一旦地面凹凸不平或有遮挡物,则会出现“穿帮”的效果,如下图所示,该方法生成的阴影对脚下的正方体完全没有影响,所以为了解决这种问题,投影生成法应运而生。
2、投影生成法
该方法本质上来说是一种贴花(Decal)技术,即设定一个投影器,然后将阴影贴图投射到你想展现阴影的地方,该方法的优点在于投影效果不取决于被投影区域的几何形状,即被投影区域可以任意凹凸的曲面,也可以处理各种障碍物。
下面我就具体介绍一下该阴影的生成方法:
(1)通过“GameObject->Create Empty”来创建一个空的物体,并取名为“Shadow Projector”。
(2)通过“Component->Effects->Projector”在该空物体上加入Projector组件,并通过平移、旋转和调整参数
(3)然后在Material选项中拖入已经准备好的材质,即可投影出阴影,效果如下:
我们看到,场景中不仅生成了阴影,同时角色的身体也“变黑”了,这是因为投影器的“Ignore Layers”设定为“Nothing”的缘故,我们将可忽略层设为角色的层“Player”,则可使角色不再被投影,
(4)最终的Shadow Projector的Inspector视图如下:
其中材质所用到的shader为:
Shader"Projector/Multiply"{
Properties{
_ShadowTex("Cookie",2D)="gray"{TexGen ObjectLinear}
_FalloffTex("FallOff",2D)="white"{TexGen ObjectLinear}
}
Subshader{
Tags{"RenderType"="Transparent-1"}
Pass{
ZWrite Off
Fog{Color(1,1,1)}
AlphaTest Greater 0
ColorMask RGB
Blend DstColor Zero
Offset-1,-1
SetTexture[_ShadowTex]{
combine texture,ONE-texture
Matrix[_Projector]
}
SetTexture[_FalloffTex]{
constantColor(1,1,1,0)
combine previous lerp(texture)constant
Matrix[_ProjectorClip]
}
}
}
}
通过以上的步骤,我们即可实现投影式的阴影生成方法。与第一种方法一样,可以设定一些特定脚本来控制该阴影的移动以及变化等等。另外,需要注意的一点是“Ignore Layers”选项的设定,原则上是尽量去掉那些不需要被投影的层,从而来减少不必要的计算量。
上述两种方法是目前移动平台上的主流阴影生成方法,优点是生成简单,使用方便、计算量较小,但缺点同样突出,即该阴影是假的,并不是真的物体投射阴影,所以真实感并不强。下面我就介绍两种目前可以在移动平台上使用的实时动态阴影生成方法,不过在这篇中我们只介绍阴影效果,并不介绍具体的实现技术和生成方法,留待以后高级教程中讲解。
3、Shadow Map方法
虽然Unity目前并不支持在移动设备上生成动态阴影,但同样可以通过RenderTexture来生成简单的Shadow Map,效果图如下所示:
我们看到所生成的阴影存在锯齿,这是由于Shadow Map分辨率不够所致,你可以通过增加RenderTexture的分辨率来减少锯齿的影响,如下图所示,当然这样做的同时也会带来一定的渲染消耗。
4、环境遮挡方法
该方法取自于游戏《Shadow Gun》,通过分析物体的近似环境遮挡信息来实时生成动态阴影,
图片
其生成方法大致为如下三步:
首先在角色脚底生成一个显示阴影的网格。
其次,根据分别在角色的跨步以及两腿处生成三个圆球,通过这三个圆球来计算底面的环境遮挡(Ambient Occlusion)信息。
最后,根据计算所得AO信息来动态细分网格,这样就可以生成最终的AO阴影。