Unity Shader VRRingReticle

时间:2018-11-08 15:28:33

标签: unity3d shader fragment-shader

我有一个在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
    }
  }
}

0 个答案:

没有答案