• [UnityShader]unity中2D Sprite显示阴影和接受阴影


    首先是效果

    要让2D显示阴影,首先假设知道Unity阴影来源(shader中的ShadowCaster)

    最简单的方法是,首先从官网下载Sprite-Default.Shader,查看源码

    然后复制粘贴到自己的Shader中,结尾加上一句FallBack "VertexLit",此时已经拥有投射阴影的能力了

    (复制代码保存到Shader中)

     1 // Unity built-in shader source. Copyright (c) 2016 Unity Technologies. MIT license (see license.txt)
     2 
     3 Shader "Custom/2DShadow"
     4 {
     5     Properties
     6     {
     7         [PerRendererData] _MainTex ("Sprite Texture", 2D) = "white" {}
     8         _Color ("Tint", Color) = (1,1,1,1)
     9         [MaterialToggle] PixelSnap ("Pixel snap", Float) = 0
    10         [HideInInspector] _RendererColor ("RendererColor", Color) = (1,1,1,1)
    11         [HideInInspector] _Flip ("Flip", Vector) = (1,1,1,1)
    12         [PerRendererData] _AlphaTex ("External Alpha", 2D) = "white" {}
    13         [PerRendererData] _EnableExternalAlpha ("Enable External Alpha", Float) = 0
    14     }
    15 
    16     SubShader
    17     {
    18         Tags
    19         {
    20             "Queue"="Transparent"
    21             "IgnoreProjector"="True"
    22             "RenderType"="Transparent"
    23             "PreviewType"="Plane"
    24             "CanUseSpriteAtlas"="True"
    25         }
    26 
    27         Cull Off
    28         Lighting Off
    29         ZWrite Off
    30         Blend One OneMinusSrcAlpha
    31 
    32         Pass
    33         {
    34         CGPROGRAM
    35             #pragma vertex SpriteVert
    36             #pragma fragment SpriteFrag
    37             #pragma target 2.0
    38             #pragma multi_compile_instancing
    39             #pragma multi_compile_local _ PIXELSNAP_ON
    40             #pragma multi_compile _ ETC1_EXTERNAL_ALPHA
    41             #include "UnitySprites.cginc"
    42         ENDCG
    43         }
    44     }
    45 
    46     FallBack "VertexLit"  //上面都是默认代码,只加了这一句,原因可以看看<UnityShader入门精要>,有讲Unity阴影原理
    47 }

    但是SpriteRndererreceiveShadows属性和shadowCastingMode属性是隐藏的(可以写编辑器扩展暴露出来)在代码中打开即可,挂上脚本,运行游戏便可以看到效果

    1 void Awake()
    2     {
    3         transform.GetComponent<SpriteRenderer>().receiveShadows = true;
    4         transform.GetComponent<SpriteRenderer>().shadowCastingMode = ShadowCastingMode.TwoSided;
    5     }

    更新:要让Sprite接受投影

    有新的需求要求Sprite能接受投影,那么上面这套就不适用了,因为Queue为Transparent时是收不到投影的

    直接将Shader替换为Legacy Shaders/Transparent/Cutout/Diffuse,这是利用内置的透明度测试来达成所想要的效果

    关于透明度测试可以看看<UnityShader 入门精要>,大概意思就是Alpha低于设定值,则直接丢弃不渲染

  • 相关阅读:
    第七周——Linux内核如何装载和启动一个可执行程序
    第十八章读书笔记
    第三章读书笔记
    第六周——分析Linux内核创建一个新进程的过程
    第五章读书笔记
    Linux内核分析——分析system_call中断处理过程
    第一二章读书笔记
    20145217《网络对抗》 Web安全基础实践
    20145217《网络对抗》web基础
    20145217《网络对抗》 MSF基础应用
  • 原文地址:https://www.cnblogs.com/wayneWy/p/13619324.html
Copyright © 2020-2023  润新知