zoukankan      html  css  js  c++  java
  • Shader剔除像素绘制扇形

    Shader "Custom/Indicator" {
        Properties {  
            _MainTex("Main Texture", 2D) = "white" {}
            _Color ("Color", Color) = (0.17,0.36,0.81,0.0)
            _Angle ("Angle", Range(0, 360)) = 60
            _Gradient ("Gradient", Range(0, 1)) = 0
        }
    
        SubShader {
        Tags { "Queue"="Transparent" "RenderType"="Transparent" "IgnoreProjector"="True" }
             Pass {
                ZWrite Off
                Blend SrcAlpha OneMinusSrcAlpha
                CGPROGRAM
     
                #pragma vertex vert
                #pragma fragment frag
                #include "UnityCG.cginc"
    
                sampler2D _MainTex;
                float4 _Color;
                float _Angle;
                float _Gradient;
     
                struct fragmentInput {
                    float4 pos : SV_POSITION;
                    float2 uv : TEXTCOORD0;
                };
    
                fragmentInput vert (appdata_base v)
                {
                    fragmentInput o;
    
                    o.pos = mul (UNITY_MATRIX_MVP, v.vertex);
                    o.uv = v.texcoord.xy;
    
                    return o;
                }
     
                fixed4 frag(fragmentInput i) : SV_Target {
                	// 离中心点的距离
                    float distance = sqrt(pow(i.uv.x - 0.5, 2) + pow(i.uv.y - 0.5, 2));
                    // 在圆外
                    if(distance > 0.5f){
                        discard;
                    }
                    // 根据距离计算透明度渐变
                    float grediant = (1 - distance - 0.5 * _Gradient) / 0.5;
                    // 正常显示的结果
                    fixed4 result = tex2D(_MainTex, i.uv) * _Color * fixed4(1,1,1, grediant);
                    float x = i.uv.x;
                    float y = i.uv.y;
                    float deg2rad = 0.017453;	// 角度转弧度
                    // 根据角度剔除掉不需要显示的部分
                    // 大于180度
                    if(_Angle > 180){
                        if(y > 0.5 && abs(0.5 - y) >= abs(0.5 - x) / tan((180 - _Angle / 2) * deg2rad))
                            discard;// 剔除
                    }
                    else    // 180度以内
                    {
                        if(y > 0.5 || abs(0.5 -y) < abs(0.5 - x) / tan(_Angle / 2 * deg2rad))
                            discard;
                    }
                    return result;
                }
    
                ENDCG
            }
        }  
        FallBack "Diffuse"
    }
    

      转自:http://baizihan.me/2016/10/draw-sector/

  • 相关阅读:
    HDU 1076 An Easy Task
    299 Train Swapping
    HDU 1092 A+B for InputOutput Practice (IV)
    HDU 1093 A+B for InputOutput Practice (V)
    HDU 1049 Climbing Worm
    HDU 1032 The 3n + 1 problem
    HDU 1089 A+B for InputOutput Practice (I)
    HDU 1091 A+B for InputOutput Practice (III)
    Vimperator
    成为高效程序员的搜索技巧[转自月光博客]
  • 原文地址:https://www.cnblogs.com/louissong/p/8328650.html
Copyright © 2011-2022 走看看