文章目录

  • 其他阴影
  • Projector 的思路
  • Projector [假]阴影的思路
    • ReplacementShader 都替换为以下 shader 渲染:
    • Projector 组件材质上的 Shader
  • 效果
    • 问题
  • Project
  • References

制作原因

因为项目运营中,有部分崩溃的日志显示的是,ShadowMap Jobs 中的 GetLocalKeywords 导致崩溃

当时有同学提出的:

  • 可以尝试更新 unity 的版本,因为在网上查了,也有人遇到类似的问题,还说了部分 unity 的版本是修复了的,所以才提议可以升级 unity 版本,出问题的时候我们使用的是:unity 2019 4.0f1 的版本的,这个也是我比较推荐的方式
  • 可以自己重写一个简单的 shadow map,但是 shadow map 会增加大量 DC,但是基于 unity 先用的一些 API 来制作的话,会有很多限制问题
  • 可以使用 shadow projector ,而 unity built-in 管线中的 projector 组件只是和 projector 有碰撞的才会重绘被投影的网格,所以相对 shadow map 来说只是少了另一份 render texture 的内存消耗,但起码可以绕过 unity 内置 projector 崩溃的问题
    • 但是projector 方式也有很多限制

      • 一般固定视角
      • 不会有高于投影物体的场景
      • 阴影并不会有遮挡的情况
        • 即投影穿透,假设有 A,B,C 三个物体,A 里 projector 最近,看似挡住了 B,C 的投影效果,但是 B,C 如果与 projector 有碰撞都会有投影效果,这就是投影穿透

(但是由于这个 Projector [假]阴影显示太多,最后我们没去使用该方案,但是预研的过程当作是学习,所以记录在此博客)


其他阴影

一般阴影又多种方式实现:

  • shadow map

    • Unity Shader - Custom DirectionalLight ShadowMap 自定义方向光的ShadowMap
    • Unity Shader - Custom SSSM(Screen Space Shadow Map) 自定义屏幕空间阴影图
    • Unity Shader - Custom Shadow Map (New Version)
  • shadow volume(没去研究过)
  • ray marching (隐式几何场景适合)
    • Unity Shader - Ray Marching - T5 - Shadow
    • Unity Shader - Ray Marching - T6 - SoftShadow/PenumbraShadow
  • projector (上述)
  • planar shadow
    • Unity Shader - Planar Shadow - 平面阴影

Projector 的思路

  • 将所有与 Projector 的 OOB 有碰撞的,都有会有投影效果
  • 被投影的物体都会重新绘制一次,使用 投影材质来绘制
  • 将被投影物体的逐片段坐标作为 投影器下的投影面坐标转为 投影时的 cookie 纹理采样坐标
  • 使用 投影面的 uv 坐标采样 cookie 纹理作为像素颜色,至于如何混合,就是根据投影器使用的 材质的混合系数配置来决定,如:Blend SrcAlpha OneMinusSrcAlpha 就是混合透明度的方式叠加上去

Projector [假]阴影的思路

  • 先得有一个 DirectionalLight 方向光,关闭 DirecitonLight 的 shadow
  • 创建 Shadow Projector 添加上 Projector 组件,transform.forward 与 DirectionalLight 一致
  • 创建 Shadow Camera 添加上 Camera 组件,transform.forward 也与 DirectionalLight 一致
  • 将 Shadow Camera.ReplacementShader 替换渲染视角中的物体在一张 ShadowRT 上
  • 将 ShadowRT 纹理给到 Shadow Projector 上的 Projector 组件的材质中的 Cookie 纹理

ReplacementShader 都替换为以下 shader 渲染:

// jave.lin 2021/08/17
// 绘制到 Projector Cookie RT 上的 shaderShader "Test/Draw2ProjCookieRT"
{SubShader{Tags { "RenderType"="Opaque" "Draw2ProjTex"="A" }LOD 100Pass{CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"struct appdata{float4 vertex : POSITION;};struct v2f{float4 vertex : SV_POSITION;};v2f vert (appdata v){v2f o;o.vertex = UnityObjectToClipPos(v.vertex);return o;}fixed4 frag (v2f i) : SV_Target{return 1;}ENDCG}}
}

Projector 组件材质上的 Shader

// jave.lin 2021/08/17
// draw projector shadowShader "Test/DrawProjectorShadow"
{Properties{_MainTex ("Texture", 2D) = "white" {}_Color ("Color", Color) = (1, 1, 1, 1)}SubShader{Tags { "Queue"="Transparent" }LOD 100Pass{ZWrite OffColorMask RGBBlend SrcAlpha OneMinusSrcAlphaCGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"struct appdata{float4 vertex : POSITION;float2 uv : TEXCOORD0;float3 normal : NORMAL;};struct v2f{float4 vertex : SV_POSITION;float4 uvShadow : TEXCOORD0;float4 uvFalloff : TEXCOORD1;half3 wNormal : TEXCOORD2;};sampler2D _MainTex;float4 _MainTex_ST;float4x4 unity_Projector;float4x4 unity_ProjectorClip;fixed4 _Color;v2f vert (appdata v){v2f o;o.vertex = UnityObjectToClipPos(v.vertex);o.uvShadow = mul(unity_Projector, v.vertex);o.uvFalloff = mul(unity_ProjectorClip, v.vertex);o.wNormal = UnityObjectToWorldNormal(v.normal);return o;}fixed4 frag(v2f i) : SV_Target{half3 L = normalize(_WorldSpaceLightPos0.xyz);half3 N = normalize(i.wNormal);half fade = max(0, dot(L, N));// >= 0 ? 1 : 0;fade *= saturate(1 - i.uvFalloff.x);fixed shadow = tex2Dproj(_MainTex, UNITY_PROJ_COORD(i.uvShadow));return shadow * _Color * fade;}ENDCG}}
}

效果

问题

可以看到如下图,投影物体一旦比被投影提的深度还小,但是仍然可以看到阴影部分,这就太假了
所以这就适合那种只有全是平面的场景,如果全是平面的场景,还不如使用:Planar Shadow 的方式 Unity Shader - Planar Shadow - 平面阴影


Project

TestingProjector 提取码: s7fd

unity 版本:2019.3.8f1
测试场景:ShadowProjectorScene.unity
渲染管线:built-in


References

  • 【Unity Shader】结合Projector和Rendertexture实现实时阴影
  • UnityEffects(2)之ProjectorShadow(手游上的实时阴影方案)

Unity - Projector - 实时[假]阴影相关推荐

  1. 2d shader unity 阴影_【Unity Shader】平面阴影(Planar Shadow)

    来介绍一种适用于移动平台的高性能实时阴影解决方案--平面阴影(Planar Shadow). 由于Unity内置的实时阴影实现方式是屏幕空间阴影贴图(Screen Space Shadow Map)非 ...

  2. Unity移动端动态阴影

    译文: https://developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch10.html 基于Cubemap的动态软阴影 ARM公司曾利用Unity开发 ...

  3. Unity中的半透明阴影

    Unity中的半透明阴影 在Unity中渲染半透明阴影可以使用Unity提供的dither texture.在这之前,先考虑一般半透明物体的渲染流程: 设置render queue为Transpare ...

  4. Unity角色实时阴影方案

    角色实时阴影是游戏开发中比较常见的需求了,但是阴影的实现原理比较难懂,网上有很多关于阴影原理的解释和案例,可以研究一下,这里给出两种在unity中阴影的具体实现. 1.使用Untiy自带的实时阴影 u ...

  5. unity 半透明混合问题_Unity 实时 半透明 阴影 shader

    简单阴影制作思路: 1:在角色脚底 放置一块平板 2:shader中 根据平板传入的矩阵 以及 光照 对角色进行变换 3: 得到投影在地面上的阴影 4:阴影直接渲染到 屏幕上 缺点: 上面的阴影无法 ...

  6. unity planar实时阴影

    废话不多先上图片 实时阴影效果 带渐变的 接着上代码 Shader "Custom/NewShader" {Properties {_MainTex ("Base (RG ...

  7. unity projector相关探讨和使用

    projector 用到的组件 Projector组件 可以实现 0 角色选择光圈 1 普通圆点阴影 2 伪动态阴影 http://qiankanglai.me/2016/11/14/unity-pr ...

  8. (投影:Projector)Unity Projector 投影器原理以及优化

    很久很久以前,做过一个离线Mesh切割方式的Decay效果Unity3D中的贴花效果 适合场景景观布置,批次合并等,但运行时性能较差,这次我们来玩玩运行时投影器. 先上成平图 测试效果图, 图中的裤子 ...

  9. unity+opencv实时检测人脸及眼睛区域检测

    这是最近做的一个工作,由于要调用电脑摄像头实时检测人眼主要是检测闭眼睁眼 ** 1.工具 ** 1.1unity(作者用的是2020.3.25 大部分版本都ok 1.2opencv for unity ...

  10. 【Unity】在Unity中实时显示北京时间

    感觉在网上搜到的大部分Unity或者C#获取北京时间的方法都已经不提供服务了,搜到一个可用的稍微拓展下做成了实时显示北京时间的脚本. 但因为只在程序启动的时候有获取北京时间,接下来显示的时间都是每秒钟 ...

最新文章

  1. 开源点云实时压缩方案测试
  2. 用python画玫瑰花代码-用python画一朵玫瑰花
  3. c语言求5个数最小公倍数,C语言,求从键盘输入的五个自然数的最小公倍数
  4. BZOJ-1053-反素数ant
  5. 深度学习-机器学习(5.2支持向量机SVM上的Python应用)
  6. HTML5来到,原生Native APP是否还有市场
  7. 这周,全球首个IT技术全中文免费学习平台诞生了!太惊艳!
  8. 一步步手动实现热修复(一)-dex文件的生成与加载
  9. 2021年中国自有品牌行业发展白皮书
  10. vscode设置缩进2个空格
  11. 31.整数中1出现的次数(从1到n整数中1出现的次数)
  12. Xcode设置编译链接-framework CoreFoundation
  13. 微信飞机大战游戏开发
  14. JUnit 5- 概述
  15. grid 与axis
  16. 冰点还原标准版-中文版(全面支持Windows 7)7.0.020.3172(最新版)下载与注册
  17. PLC、PAC、PC-Based、软PLC傻傻分不清
  18. vue中a的href写法
  19. Qt(C++)入门学习
  20. 人生是一个连续的过程,没什么东西能影响人的一生,怎么选择不是问题。问题是每天都要努力 (转)...

热门文章

  1. 【jQuery】jQuery本地时间与世界时间时差转换
  2. 在网页中插入视频代码大全
  3. Android帧动画分析
  4. 基于SpringBoot+Vue开发的一个知识社区分享平台
  5. html粒子特效图片切换,javascript转换静态图片,增加粒子动画效果_javascript技巧...
  6. 计算机系统盘怎么扩充,c盘扩大,教您怎么把c盘扩大
  7. 加密经济学应用的机制设计
  8. 怎么在搜索计算机学报的论文,计算机学报-模式搜索法
  9. 新西兰梅西大学有计算机专业吗,新西兰梅西大学世界排名|怎么样|入学条件_海外院校库-柳橙网...
  10. 解决阿里云FTP 227 Entering Passive Mode