简单理解ShadowMap阴影的实现

该博客详细解释了如何在OpenGL中使用ShadowMap实现阴影效果。通过透视投影变换和深度图,计算顶点到光源的距离,并利用FBO将深度信息存储到纹理中。在渲染场景时,通过比较场景顶点到摄像机的距离与深度图中的深度值来确定阴影。关键在于正确地将顶点转换为纹理坐标,并进行线性深度处理,以确保阴影效果的准确性。
摘要由CSDN通过智能技术生成

shadowmap阴影的原理:

判断顶点距离光源的位置,如果是最近的,那么顶点不会有阴影覆盖。否则,顶点被阴影覆盖。

所以,首先判断顶点到光源的位置。就要先获得离光源最近的片段的深度。

于是,深度图来了。深度图就渲染到纹理吧,这里就用到FBO了,这个我就不细说了。

透视投影变换可以得到3D到2D的图像,变换的最终结果是vec4 Final = Projection * View * Model * Vertex;

Vertex 顶点本来就是vec4(vec4(x,y,z,w))。而Direction 方向是vec3。

经过Perspective透视变换后,x/w,y/w,z/w。都会在[-1,1]这个范围内。


Perspective(fovy,ratio,znear,zfar)这个函数得到的深度值z/w的增长不是线性的。离znear越近深度值z/w越精确。

在视景锥空间内,当顶点到摄像机的距离刚好为znear,深度z/w为0。当顶点到摄像机的距离为zfar,深度z/w为1。

但由于不是线性的,深度值会越来越不准确。所以我们要实现一个线性的深度,写个shader。

主要的就是float depth =distance(CameraPostion.xyz,WorldPos.xyz);

CameraPostion为光源的位置,因为我们计算的是进过世界坐标变换后的顶点的位置到光源的位置。depth 就是两者之间的距离。

另外一点是,OpenGL的Texture采样的话 vec4 color = texture(sampler2D,texcoord);得到的vec4总是在0.0到1.0的颜色空间范围。

Unity中可以使用ShadowMap实现阴影效果,并且可以通过阴影的颜色、透明度等参数来实现阴影的分析和变化。以下是一个简单实现步骤: 1.在Unity中创建一个场景,并将需要投射阴影的物体放置在场景中。 2.在场景中创建一个光源,并将其设置为投影模式。在光源的参数设置中,选择Shadow Type为Hard Shadows或Soft Shadows,并将Resolution设置为需要的大小。 3.在被投射阴影的物体上,将其接收阴影的属性设置为true。这可以通过在物体的Renderer组件中设置Cast Shadows为On,或者通过代码设置。 4.在阴影的Material中,可以设置颜色、透明度等参数来实现阴影的分析和变化。例如,可以根据时间、位置等因素来改变阴影的颜色或透明度。 以下是一个示例代码,可以在Update函数中实现根据时间变化阴影颜色的效果: ```csharp public class ShadowColor : MonoBehaviour { public Material shadowMaterial; //阴影的材质 public Color startColor; //开始颜色 public Color endColor; //结束颜色 public float duration = 2.0f; //变化时长 private float startTime; //开始时间 void Start() { startTime = Time.time; } void Update() { float t = (Time.time - startTime) / duration; shadowMaterial.color = Color.Lerp(startColor, endColor, t); } } ``` 在该代码中,首先定义了阴影的材质和起始、结束颜色。然后,在Start函数中记录了开始时间,每帧根据时间变化计算阴影颜色,最终将其赋值给阴影的材质。可以根据需要修改该代码来实现不同的阴影分析和变化效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值