zoukankan      html  css  js  c++  java
  • Unity3D手游开发日记(1)

    阴影这个东西,说来就话长了,很多年前人们就开始研究出各种阴影技术,但都存在各种瑕疵和问题,直到近几年出现了PSSM,也就是CE3的CSM,阴影技术才算有个比较完美的解决方案.Unity自带的实时阴影,也是这种技术,在电脑上很成熟的.我也是目睹了阴影技术的发展,以前也自己写过一些阴影,本来以为以后再也不用担心阴影了,结果做移动游戏以后,发现情况没那么乐观.这种基于深度的shadow map 技术,需要浮点纹理的支持,但有的移动平台不支持浮点纹理,即使支持,这种技术开销也特别大.所以我们需要重新思考,移动平台到底什么样的阴影方案比较合适.

    我把常见的实时阴影技术分3个大的类别,逐一分析.

    1. 基于模板的体积阴影

    基于模型边缘的,模型需要特别处理,正是由于基于模型边缘的,属于顶点级别,而不是像素级别,导致不能支持alpha test,比如主角的翅膀.放弃

    2. 基于投影Projector的shadow map

    基于投影的,投影纹理,需要RenderTexture,支持alpha test,

    但是这种技术也有很多问题,比如反向投影(可加一张fall of 纹理解决), 多重投影(比如桥上和桥下),等等

    阴影质量和RenderTexture纹理大小关闭很大,如果要一张RenderTexture纹理渲染很多角色,纹理就要大一些,要处理阴影边缘,

    但是用来处理单个角色,就能避免很多问题.可考虑.

    3. 基于深度Depth的shadow map

    Unity自带的就是这种,保存深度需要浮点纹理,但是有的手机不支持,且开销很大,不考虑.

    通过以上分析,再结合自己游戏的实际情况,45度视角游戏,我最后定的方案是:

    中等画质:

     

    1.只有主角采用基于投影Projector的shadow map

    2.其他角色,采用最简单的阴影面片绑在脚下.(如果怪物被击浮空,就隐藏面片,落地再显示,防止穿帮)

    这样的好处是,既有实时阴影,又保证了效率.

    高画质:

    1.视野内全部角色基于投影Projector的shadow map

    实现原理:

    很简单,先渲染角色到RenderTexture,再用Projector投影到地面.

     

    1.投射shader:

    [csharp] view plain copy
     
    1. Shader "Luoyinan/Projector/ShadowCast"   
    2. {   
    3.     Properties   
    4.     {  
    5.         _ShadowColor ("Main Color", COLOR) = (0.5, 0.5, 0.5, 1)  
    6.     }  
    7.   
    8.     SubShader   
    9.     {  
    10.         Pass   
    11.         {  
    12.             Color [_ShadowColor]  
    13.         }  
    14.     }  
    15. }  


    2.接收shader:

    [csharp] view plain copy
     
    1. Shader "Luoyinan/Projector/ShadowReceive"   
    2. {   
    3.     Properties   
    4.     {  
    5.         _Color ("Main Color", Color) = (1,1,1,1)  
    6.         _ShadowTex ("Cookie", 2D) = "" {}  
    7.         _MaskTex ("Mask", 2D) = "" {}  
    8.     }  
    9.        
    10.     Subshader   
    11.     {  
    12.         Tags {"Queue"="Transparent"}  
    13.         Pass   
    14.         {  
    15.             ZWrite Off  
    16.             Fog { Mode Off }  
    17.             ColorMask RGB  
    18.             Blend DstColor Zero  
    19.             Offset -1, -1  
    20.        
    21.             CGPROGRAM  
    22.             #pragma vertex vert  
    23.             #pragma fragment frag  
    24.             #include "UnityCG.cginc"  
    25.               
    26.             struct v2f   
    27.             {  
    28.                 float4 uvShadow : TEXCOORD0;  
    29.                 float4 pos : SV_POSITION;  
    30.             };  
    31.               
    32.             float4x4 _Projector;  
    33.             v2f vert (float4 vertex : POSITION)  
    34.             {  
    35.                 v2f o;  
    36.                 o.pos = mul (UNITY_MATRIX_MVP, vertex);  
    37.                 o.uvShadow = mul (_Projector, vertex);  
    38.                 return o;  
    39.             }  
    40.               
    41.             sampler2D _ShadowTex;  
    42.             sampler2D _MaskTex;  
    43.             fixed4 frag (v2f i) : SV_Target  
    44.             {  
    45.                 fixed4 texM = tex2Dproj(_MaskTex, UNITY_PROJ_COORD(i.uvShadow));  
    46.                 fixed4 texS = tex2Dproj(_ShadowTex, UNITY_PROJ_COORD(i.uvShadow));  
    47.                 texS.rgb += texM.rgb;  
    48.   
    49.                 return texS;  
    50.             }  
    51.             ENDCG  
    52.         }  
    53.     }  
    54. }  


    优化:

    1. RenderTexture尽量简单,大小最好不要超过512,格式用没alpha通道的565,关闭抗锯齿,因为只渲染单一颜色,可关闭深度,

    2. 阴影投射的shader尽量简单,为了效率,我的shader没用主纹理,所以不支持alpha test.如要支持,可自行修改shader.

    3. 阴影摄像机看到的对象比游戏主摄像机看的多一些,只让主摄像机看到的对象才产生阴影.能少渲染几个角色.用OnBecameVisible来实现.

    4. 为了避免反向投影穿帮,阴影方向尽量不要太斜.

    5. 远处的阴影边缘衰减,用一张掩码纹理:

     

    最终效果,可以看到远处的阴影自然衰减,也能投影到斜坡上,:

     
     
  • 相关阅读:
    Ajax基础:3.Json
    Head First Design Patterns State Pattern
    Head First Design Patterns Template Method Pattern
    Articles For CSS Related
    Head First Design Patterns Decorator Pattern
    代码审查工具
    How To Be More Active In A Group
    Head First Design Patterns Factory Method Pattern
    Head First Design Patterns Composite Pattern
    Tech Articles
  • 原文地址:https://www.cnblogs.com/czaoth/p/5785625.html
Copyright © 2011-2022 走看看