UnityEffects(1)之shadowMap(阴影映射)

本文详细介绍了Unity中的阴影映射技术,包括原理和实现步骤。通过手动实现shadowMap,模拟方向光的阴影,阐述了从光源位置渲染深度图和以眼睛位置渲染场景的过程。文中还探讨了如何确定合适的光锥、处理深度图和解决Shadow Acne等问题,提供了相关的参考资料和优化建议。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

UnityEffects(1)之shadowMap(阴影映射)

效果图:


工程放在:https://github.com/aceyan/UnityEffects  使用unity5.4

场景是Scene/(1)ShadowMap

  shadowMap是一种常用的阴影技术,在各大引擎中被广泛使用,Unity中自带的阴影效果也是基于shadowMap的。

         为了理解这个常用技术,我们今天来造一个方形的轮子,手动在unity中实现一下shadowMap来模拟一个方向光的阴影。

一、原理:

阴影映射是一个双过程的技术:

1、  首先,场景以光源的位置为视点被渲染。每个渲染图像的像素的深度被记录在一个“深度纹理”中(这个纹理通常被称为阴影贴图)。

2、  然后,场景从眼睛的位置渲染,但是用标准的阴影纹理把阴影贴图从灯的位置投影到场景中。在每个像素,深度采样(从被投影的阴影贴图纹理)与片段到灯的距离进行比较。如果后者大,该像素就不是最靠近灯源的表面。这意味着这个片段是阴影,它在着色过程中不应该接受光照。

-------------------摘自《Cg教程_可编程实时图形权威指南

 

二、实现和细节

这一段话其实已经非常简明清晰的描述了shadowMap的实现原理(Cg教程是本好书^_^),那么接下来我们就把两个过程分解开来一步一步的在unity中实现:

1、以光源位置为视点渲染深度图

1)首先创建一个camera(这里叫做LightCamera)定义光的方向,我们要使用它来将我们需要产生阴影接受阴影的物体的深度渲染到一张纹理中(下面称作depthMap),因为是我要模拟的是平行光阴影,那么LightCamera使用正交投影。


 

那么问题来了!有了光的方向,这个相机的位置和视锥(后面称为光锥)相关的属性怎么确定呢?

 

举个栗子:试想一下,现在有一个场景一个plane上面有一个cube,现在我们要进行阴影映射的第二部,也就是从视点渲染这个场景,那么需要LightCamera渲染的深度图,查询当前要渲染像素对应的深度来完成渲染。如果这时LightCamera放歪了,没有渲染到这个部分的深度,那么岂不是渲染就出问题了?如果暴力的让LightCamera照射整个场景也不

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值