Unity 实时 半透明 阴影 shader
2016-01-21 00:00
1396 查看
简单阴影制作思路:
1:在角色脚底 放置一块平板
2:shader中 根据平板传入的矩阵 以及 光照 对角色进行变换
3: 得到投影在地面上的阴影
4:阴影直接渲染到 屏幕上
缺点:
上面的阴影无法 增加半透明阴影效果,因为如果直接设置渲染阴影的 pass 为半透明,就会导致阴影不同面片的阴影 之间重叠的部分颜色加深,导致半透明阴影颜色不均匀。
因此采用另一种思路,将阴影作为独立的渲染层, 增加一个相机只用于渲染玩家阴影,使用
Camera.RenderWithShader 接口来渲染,
将阴影渲染到一个 RenderTexture 上面,
接着在主镜头的 OnRenderImage 接口中,将渲染的阴影 renderTexture 和 主镜头渲染的正常场景进行alpha混合。
上面混合主要问题是 如何处理 阴影 renderTexture和 主镜头渲染对象的 深度问题,防止阴影遮挡住其它对象。
Unity中可以设置镜头 Camera.depth 深度模式为 depth,我们设置主镜头深度模式depth,这样主镜头就会产生一个 depthTexture;
这个depthTexture 在shader里面可以通过 _CameraDepthTexture 来访问;
接着我们在阴影渲染shader里面,通过这个_CameraDepthTexture 得到阴影所在位置的深度信息,如果比阴影靠近镜头,我们就将阴影裁减掉。
这样阴影就不会遮挡住其它对象了。
但是再人物脚底可能会因为存在浮点数误差,导致的一些问题,可以在人物脚底增加黑色圆圈,来弥补这个缺陷。
shader中从_CameraDepthTexture 中获得深度信息的核心代码是:
vert(){
}
frag() {
}
参考 Unity Image Effect 代码中的:
MotionBlurClear.shader
需要注意问题:
深度计算需要根据根据 投影的平面阴影来计算 不要用 原始模型计算,因此需要 ComputerSceenPos 代码调整
1:在角色脚底 放置一块平板
2:shader中 根据平板传入的矩阵 以及 光照 对角色进行变换
3: 得到投影在地面上的阴影
4:阴影直接渲染到 屏幕上
缺点:
上面的阴影无法 增加半透明阴影效果,因为如果直接设置渲染阴影的 pass 为半透明,就会导致阴影不同面片的阴影 之间重叠的部分颜色加深,导致半透明阴影颜色不均匀。
因此采用另一种思路,将阴影作为独立的渲染层, 增加一个相机只用于渲染玩家阴影,使用
Camera.RenderWithShader 接口来渲染,
将阴影渲染到一个 RenderTexture 上面,
接着在主镜头的 OnRenderImage 接口中,将渲染的阴影 renderTexture 和 主镜头渲染的正常场景进行alpha混合。
上面混合主要问题是 如何处理 阴影 renderTexture和 主镜头渲染对象的 深度问题,防止阴影遮挡住其它对象。
Unity中可以设置镜头 Camera.depth 深度模式为 depth,我们设置主镜头深度模式depth,这样主镜头就会产生一个 depthTexture;
这个depthTexture 在shader里面可以通过 _CameraDepthTexture 来访问;
接着我们在阴影渲染shader里面,通过这个_CameraDepthTexture 得到阴影所在位置的深度信息,如果比阴影靠近镜头,我们就将阴影裁减掉。
这样阴影就不会遮挡住其它对象了。
但是再人物脚底可能会因为存在浮点数误差,导致的一些问题,可以在人物脚底增加黑色圆圈,来弥补这个缺陷。
shader中从_CameraDepthTexture 中获得深度信息的核心代码是:
vert(){
v.pos = mul(MVP, vertex); v.screen = CameraScreenPos(v.pos); EyeLinear(v.screen.z); v.uv = v.pos.xy;
}
frag() {
d = SAMPLE_DEPTH_PROJ(_CameraDepthTexture, v.uv); EyeLinear(d); clip(d, v.screen, 1e-2f)
}
参考 Unity Image Effect 代码中的:
MotionBlurClear.shader
需要注意问题:
深度计算需要根据根据 投影的平面阴影来计算 不要用 原始模型计算,因此需要 ComputerSceenPos 代码调整
相关文章推荐
- Unity Motion Blur 运动模糊的实现
- Unity 中实现 打击感的物理
- unity初学(基本的方法)
- Unity 编辑器环境下不能正确加载Android Assetbundle 中的 Shader 解决方法
- Unity3d获取物体的所有子物体对象(child)
- unity car demo解析
- Unity 往复运动的一种计算方法
- Unity Button 动画
- Unity3D学习之Camera
- Unity判断当前鼠标顺逆时针旋转的简单算法
- Unity3D Android手机开发环境配置
- Unity3D插件之FingerGesture的使用
- Unity unsafe
- unity 更换鼠标图标 脚本
- Unity 4.2.0 官方最新破解版(Unity3D 最新破解版,3D游戏开发工具和游戏引擎套件)
- 下次有人不会配unity 安卓环境,就让他看看这个吧
- Unity3d 中的 A*寻路
- unity3d 2d游戏制作的模式
- Unity工具菜单翻译(二)
- Unity 快捷键