Unity Shader realizes 3D pie chart

I wrote this article with some depravity and sadness. Today I want to use Shader to write a 3D pie chart effect, but I didn't think of another more efficient way of writing, and the function is more efficient. If you want to see this article have a better way to implement it, please send me a private message, thank you.

The code itself looks very long. In fact, it just passes its own coordinate vertices into the fragment shader, and then judges the connection between the point and the center, and the degree of the angle with the center point to determine which color to use. Use a lot of if else... please correct me.

You only need to achieve the following effects.
Insert picture description hereInsert picture description here
Here is the original code:

Shader "Custom/PieGraph" {
	Properties{
		_element1("element%1",Range(0.00,100.00))=0
		_element2("element%2",Range(0.00,100.00))=0
		_element3("element%3",Range(0.00,100.00))=0
		_element4("element%4",Range(0.00,100.00))=0
		_element5("element%5",Range(0.00,100.00))=0
		_element6("element%6",Range(0.00,100.00))=0
		_element7("element%7",Range(0.00,100.00))=0
		_element8("element%8",Range(0.00,100.00))=0
		_element9("element%9",Range(0.00,100.00))=0
		_Angle1Color("Color1",Color)=(1,1,1,1)
		_Angle2Color("Color2",Color)=(1,1,1,1)
		_Angle3Color("Color3",Color)=(1,1,1,1)
		_Angle4Color("Color4",Color)=(1,1,1,1)
		_Angle5Color("Color5",Color)=(1,1,1,1)
		_Angle6Color("Color6",Color)=(1,1,1,1)
		_Angle7Color("Color7",Color)=(1,1,1,1)
		_Angle8Color("Color8",Color)=(1,1,1,1)
		_Angle9Color("Color9",Color)=(1,1,1,1)

		
		_Diffuse("Diffuse",Color)=(0.1,0.1,0.1,1)
		_Specular("Specular",Color)=(1,1,1,1)
		_Gloss("Gloss",Range(8,256))=20
	}
	SubShader{
		Tags{"IgnoreProjector"="True"}

		Pass{
			Tags{"LightMode"="ForwardBase"}

			CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag
			#include "Lighting.cginc"

			fixed4 _Color;
			float _element1;
			float _element2;
			float _element3;
			float _element4;
			float _element5;
			float _element6;
			float _element7;
			float _element8;
			float _element9;
			fixed4 _Angle1Color;
			fixed4 _Angle2Color;
			fixed4 _Angle3Color;
			fixed4 _Angle4Color;
			fixed4 _Angle5Color;
			fixed4 _Angle6Color;
			fixed4 _Angle7Color;
			fixed4 _Angle8Color;
			fixed4 _Angle9Color;

			fixed4 _Diffuse;
			fixed4 _Specular;
			float _Gloss;
			
			struct a2v{
				float4 vertex:POSITION;
				float2 uv:TEXCOORD0;
				float3 normal:NORMAL;
			};
			
			struct v2f{
				float4 pos:SV_POSITION;
				float2 uv:TEXCOORD0;
				float4 objPos:TEXCOORD1;
				float3 worldPos:TEXCOORD2;
				float3 normal:TEXCOORD3;
			};

			v2f vert(a2v v){
				v2f o;
				o.pos = UnityObjectToClipPos(v.vertex);
				o.objPos = v.vertex;
				o.uv = v.uv;
				o.worldPos =mul(unity_ObjectToWorld,v.vertex);
				o.normal = normalize(mul(v.normal,(float3x3)unity_WorldToObject));

				return o;
			}
			   
			float4 frag(v2f i):SV_TARGET{

				float2 thisline = i.objPos.zx;
				float angle = atan2(thisline.y,thisline.x)*15.92;
				_element1 = _element1-50;

				_element2 +=_element1 ;
				_element3 +=_element2 ;
				_element4 +=_element3 ;
				_element5 +=_element4 ;
				_element6 +=_element5 ;
				_element7 +=_element6 ;
				_element8 +=_element7 ;
				_element9 +=_element8 ;
				
				fixed3 additionaryColor;
				if(angle<_element1){
					additionaryColor = _Angle1Color;
				}else if(angle<_element2){
					additionaryColor = _Angle2Color;
				}else if(angle<_element3){
					additionaryColor = _Angle3Color;
				}else if(angle<_element4){
					additionaryColor = _Angle4Color;
				}else if(angle<_element5){
					additionaryColor = _Angle5Color;
				}else if(angle<_element6){
					additionaryColor = _Angle6Color;
				}else if(angle<_element7){
					additionaryColor = _Angle7Color;
				}else if(angle<_element8){
					additionaryColor = _Angle8Color;
				}else if(angle<_element9){
					additionaryColor = _Angle9Color;
				}

				fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;
				fixed3 worldLightDir = normalize(_WorldSpaceLightPos0.xyz);
				fixed3 diffuse = _LightColor0.rgb*_Diffuse.rgb*saturate(dot(i.normal,worldLightDir));
				fixed3 reflectDir = normalize(reflect(-worldLightDir,i.normal));
				fixed3 viewDir = normalize(_WorldSpaceCameraPos.xyz-i.worldPos.xyz);
				fixed3 specular = _LightColor0.rgb * _Specular.rgb *pow(saturate(dot(reflectDir,viewDir)),_Gloss);
				float3 color = (ambient+diffuse+specular)*additionaryColor;

				return fixed4(color,1);
			}
			ENDCG
		}
	}
}

Guess you like

Origin blog.csdn.net/ww1351646544/article/details/90609863