unity中的阴影

ShadowMap技术原理是,将摄像机与光源的位置重合,场景中光源的阴影位置就是摄像机看不到的位置。
在forward rendering path中,场景中最重要的平行光在forwardbase中默认是开启了阴影的,unity就会为该光源计算其shadowmap(阴影映射纹理),这张纹理的本质也是一张深度图,这张深度图上的信息记录了,从光源的位置出发,能看到的场景中距离它最近的表面的信息。
为了得到这张shadowmap我们按照正常的流程应该是调用Base pass和Addition Pass来更新深度信息,但是因为这两个Pass中涉及到许多光照模型的计算,因此我们为了节省性能,我们应该写一个新的Pass名为“ShadowCaster”,这个Pass来专门更新光源的shadowmap。
当开启了光源的阴影效果之后,底层的渲染引擎会优先在shader中寻找LightMode为ShadowCaster的Pass,如果没有他就会在Fallback指定的shader中继续寻找。
对于获取ShadowMap是一种传统的方法,但在之后的unity中使用了一种新的技术为:屏幕空间的阴影映射技术(Screenspace Shadow Map),这种技术原本是延迟渲染中产生阴影的方法,而且移动平台不支持这种技术。
ScreenSpace Shadow Map中对阴影的计算是在平面空间中进行的,对于屏幕空间的阴影实现的步骤分为以下:
1、首先得到从当前摄像机观察到的深度纹理(在延迟渲染里的这张深度图本身就存在,但是如果是forward rendering就需要重新将整个场景渲染一遍,将深度渲染到深度图中)
2、然后得到光源的ShadowMap
3、然后在屏幕空间做一次阴影收集计算,这次的计算会得到一张屏幕空间阴影纹理, 这次的计算就是将每一个像素根据它在camera中的depth map得到世界空间坐标,再将其坐标从世界空间转换到光源空间,和光源的shadowMap里面的depth对比,如果大于ShadowMap中的深度距离,那么就说明光源无法照到,在阴影内。
4、最后一步就是将正在处理的像素在屏幕空间中的位置和步骤3中的得到的屏幕空间阴影纹理进行采样。
总结一下就是:camera的Depth Map( this.GetComponent<Camera>().depthTextureMode = DepthTextureMode.Depth;)//开启相机或许深度图
light的ShadowMap
根据两者得到的屏幕空间阴影纹理

!!!!!!!!!!!!!!!!!!!!!!!!!!!!

总的来说上面新的方法我不太明白,以下是另一位的解释的ShadowMap:
首先我们要确定的是,阴影和camera的位置无关,只与遮挡物和光源的位置有关。
1、Render To Texture!首先在light位置放置一个相机,和light保持相同的参数,如果是平行光则为正交相机,如果是点光源则为透视相机,然后我们得到了一张深度图也就是shadowMap

float4 worldPos=mul(WorldMatrix,Pos);//将当前坐标转换到世界空间
float Distance =(worldPos-LightPos).length;
//计算当前点的世界坐标和灯光的世界坐标的距离

2、根据深度图中的距离和计算点到灯光的实际距离进行比较,这里我们要明确一点的是,实际相机的位置对我们来说并不重要,因为阴影和实际相机的位置并没有关系,阴影的产生只和灯光的位置、方向和遮挡物有关,因此我们需要比较的两个变量是OB和OC,在shadowMap上的距离就是OC,因为OB比OC大,因此b点我们可以判断出在阴影区处。
在这里插入图片描述
伪代码如下:

float depth = (worldPos - LightPos).length;
float depthShadowMap = tex2D(ShadowMap, UVShadow);
If(depth > depthShadowMap){
return float4(0,0,0,1);}
else{
return tex2D(Texture, UVTexture);}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值