• 传送门出现|消失效果


    在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);
     
     
     
     
     
  • 相关阅读:
    Android数据适配器(Adapter)优化:高效ViewHolder
    touch-css-margintop问题
    抽奖
    scroll03-节日两侧的渲染
    scroll02-滚动时显示当前主题菜单状态
    浏览器背景色半透明效果。
    scroll01-滚动到一定高度时,显示导航栏
    layout01-在布局ul时,给li设置margin-right的时候,每行的最后一个li有margin-right 导致ul 看上去不居中的问题
    placehoder兼容
    day03
  • 原文地址:https://www.cnblogs.com/Hichy/p/6707417.html
Copyright © 2020-2023  润新知