Unity Shader VRRingReticle - PullRequest
       7

Unity Shader VRRingReticle

0 голосов
/ 08 ноября 2018

У меня есть шейдер, используемый в Vr как сетка, он расширяется и сжимается в зависимости от расстояния, на которое указывает камера. Теперь мне нужно иметь еще один круг вокруг того, который будет действовать как загрузочный круг, он будет использоваться, когда пользователь смотрит на тот же объект в течение 3 секунд, круг вокруг взгляда будет постепенно заполняться. Мне удалось создать шейдер, который будет принимать угол и создавать частичное заполнение окружности, но как мне объединить, чтобы шейдер мог создать два отдельных круга один вокруг друг друга.

Вот код шейдера

Shader "Custom/VRRingReticle" {
  Properties {
    _Color  ("Color", Color) = ( 1, 1, 1, 1 )
    _Color2  ("Color2", Color) = ( 1, 1, 1, 1 )
    _InnerDiameter ("InnerDiameter", Range(0, 10.0)) = 1.5
    _OuterDiameter ("OuterDiameter", Range(0.00872665, 10.0)) = 2.0
    _DistanceInMeters ("DistanceInMeters", Range(0.0, 100.0)) = 2.0
    _Angle ("Angle", Range(0, 360)) = 360

  }

  SubShader {
    Tags { "Queue"="Overlay" "IgnoreProjector"="True" "RenderType"="Transparent" }
    Pass {
      Blend SrcAlpha OneMinusSrcAlpha
      AlphaTest Off
      Cull Back
      Lighting Off
      ZWrite Off
      ZTest Always

      Fog { Mode Off }
      CGPROGRAM

      #pragma vertex vert
      #pragma fragment frag
    

      
      #include "UnityCG.cginc"

      uniform float4 _Color;
      uniform float _InnerDiameter;
      uniform float _OuterDiameter;
      uniform float _DistanceInMeters;
      uniform float _Angle;
      
      struct vertexInput 
      {
        float4 vertex : POSITION;
      };

      struct fragmentInput
      {
          float4 position : SV_POSITION;
      };

      fragmentInput vert(vertexInput i)
       {
         
       // this i one circle scaleing based on distance
        float scale = lerp(_OuterDiameter, _InnerDiameter, i.vertex.z);
        float4 vert_out = float4(i.vertex.x * scale, i.vertex.y * scale, _DistanceInMeters, 1.0);
          
        fragmentInput o;
        o.position = UnityObjectToClipPos (vert_out);
        return o;
        
        // this i only one circle with angle control
    //    fragmentInput o;
    
    //    float limit = - (_Angle-180)*0.0161111111;
    //    float3 vert_out = float3(0, 0, _DistanceInMeters);
    //    float a =  - atan2( i.vertex.x , i.vertex.y );
    //    if(a >= limit)
    //    { 
    //       float scale = lerp(_OuterDiameter, _InnerDiameter, i.vertex.z);
    //       vert_out = float3(i.vertex.x * scale, i.vertex.y * scale, _DistanceInMeters); 
    //       o.position = UnityObjectToClipPos (vert_out);       
    //    }
    //return o;
      
      
      }
     
      fixed4 frag(fragmentInput i) : SV_Target
       {
        fixed4 ret = _Color;
        return ret;
      }   
      
      ENDCG
    }
  }
}
...