• 传送门出现|消失效果


    在shader 中判断定点与传送平面的位置关系,改变其透明度
     
    问题:所有会被用到的shader都要改
     
    算法:
        1,需要 面上一点,和面的法向量
        2,(目标点-面上点)点乘 法向量  即 cos夹角
        3,d>0 :在法向指向的一侧
              d=0: 点在面上
              d<0:点在法向的所指方向的另一侧    
    透明度要做渐变的话可以计算在法向量的投影 ,法向量为单位法向量即可
     
    基础知识
    向量a·向量b=| a |*| b |*cosΘ
    Θ为两向量夹角
    | b |*cosΘ叫做向量b在向量a上的投影
    | a |*cosΘ叫做向量a在向量b上的投影
     
    效果

    代码
     
    1. Shader"Cerulean/CanBeTransfer"
    2. {
    3. Properties
    4. {
    5. _BaseTex("Base Texture",2D)="white"{}
    6. _PlanePoint("Plane Point",Vector)=(0,0,0,0)
    7. _PlaneNormal("Plane Normal",Vector)=(1,0,0,0)
    8. }
    9. SubShader
    10. {
    11. Tags{"Queue"="Transparent""RenderType"="Transparent"}
    12. BlendSrcAlphaOneMinusSrcAlpha
    13. LightingOffZTestOn
    14. LOD 100
    15. Pass
    16. {
    17. CGPROGRAM
    18. #pragma vertex vert
    19. #pragma fragment frag
    20. #include"UnityCG.cginc"
    21. sampler2D _BaseTex;
    22. float4_BaseTex_ST;
    23. fixed3 _PlanePoint;
    24. fixed3 _PlaneNormal;
    25. //计算某个点在某平面的法向量上的投影
    26. fixed Projection2PlaneNormal(fixed3 planePoint, fixed3 normal, fixed3 pos)
    27. {
    28. fixed3 dis = pos - planePoint;
    29. return dot(dis, normal);
    30. }
    31. struct appdata
    32. {
    33. float4 vertex : POSITION;
    34. float2 uv : TEXCOORD0;
    35. };
    36. struct v2f
    37. {
    38. float4 vertex : SV_POSITION;
    39. float2 baseuv : TEXCOORD0;
    40. float4 global : TEXCOORD1;
    41. };
    42. v2f vert (appdata v)
    43. {
    44. v2f o;
    45. o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
    46. o.baseuv = TRANSFORM_TEX(v.uv,_BaseTex);
    47. o.global = mul(unity_ObjectToWorld, v.vertex);
    48. return o;
    49. }
    50. fixed4 frag (v2f i): SV_Target
    51. {
    52. fixed3 baseCol = tex2D(_BaseTex, i.baseuv);
    53. fixed alpha = saturate(Projection2PlaneNormal(_PlanePoint,_PlaneNormal, i.global));
    54. return fixed4(baseCol, alpha);
    55. }
    56. ENDCG
    57. }
    58. }
    59. }
     
    传送门脚本
    1. //找到要被传送的物体设置shader的变量
    2. material.SetVector("_PlanePoint", transform.position);
    3. material.SetVector("_PlaneNormal", transform.forward);
     
     
     
     
     
  • 相关阅读:
    让超链接点击后不跳转,可以用href = "#",但是这个#就会锚点到页面最上边 点击链接后不跳转可以设置成
    js 小数取整的函数
    谷歌浏览器常用快捷键
    Vi问题
    UbuntuFAQ
    Ubuntu下配置C/C++开发环境
    win7硬盘安装ubuntu双系统——注意项
    怎样判断自己是否在平庸者之列?
    2012年软件开发者薪资调查报告
    VIM常用快捷键~网页上查找
  • 原文地址:https://www.cnblogs.com/Hichy/p/6707417.html
Copyright © 2020-2023  润新知