利用fragment shader镂空出现一个圆

方案一

#version 430
	in vec2 TexCoords;
	out vec4 color;
	uniform sampler2D screenTexture;
	void main()
	{
		vec4 pixColor = texture(screenTexture, TexCoords);
		vec3 v_params = vec3(0.5, 0.5, 0.1);
		vec2 v_centerCoord = vec2(0.5, 0.5);
		float dist = length((TexCoords - v_centerCoord) * v_params.xy);
		float alpha = pixColor.a;
		if(dist < v_params.z)
		{
			float diff = dist - v_params.z;
			if(diff > 0.02)
			{
				alpha = 1.0 - diff/0.02;
			}else
			{
				alpha = 0.0;
			}
			pixColor.rgb = pixColor.rgb * alpha;
		}
		color = vec4(pixColor.rgb, alpha);
		
	}

方案二:画椭圆同理也可变成圆


#version 430
	in vec2 TexCoords;
	out vec4 color;
	uniform sampler2D screenTexture;
	void main()
	{		
		//获取纹理坐标下的颜色值  本是画圆 被拉伸 故画椭圆
		float _Radius=0.25;   //a=0.125 b=0.075  c=0.1
		vec4 pixColor = texture(screenTexture, TexCoords);
		//左上方区域  
		if(TexCoords.x<0.5 && TexCoords.y>0.5)  
		{  
			vec2 r1 = vec2(0.4-TexCoords.y,TexCoords.x-0.5);
			vec2 r2 = vec2(0.6-TexCoords.y,TexCoords.x-0.5);
			float r = length(r1) + length(r2);
			if(r<_Radius)//以r.x、r.y为两直角边长度,计算斜边长度  
			{  
				color = vec4(1,1,1,0);  
			}  
			else  
			{  
				color = pixColor;
			}  
		}  
		//左下方区域  
		else if(TexCoords.x<0.5 && TexCoords.y<0.5)  
		{  
			//vec2 r;  
			//r = vec2(0.5-TexCoords.x,0.5-TexCoords.y);
			vec2 r1 = vec2(0.4-TexCoords.y,0.5-TexCoords.x);
			vec2 r2 = vec2(0.6-TexCoords.y,0.5-TexCoords.x);
			float r = length(r1) + length(r2);
			if(r<_Radius)//以r.x、r.y为两直角边长度,计算斜边长度   
			{  
				color = vec4(1,1,1,0);  
			}  
			else  
			{  
				color = pixColor; 
			}  
		}  
		//右上方区域  
		else if(TexCoords.x>0.5 && TexCoords.y>0.5)  
		{  
			//vec2 r;  
			//r = vec2(TexCoords.x-0.5,TexCoords.y-0.5);
			vec2 r1 = vec2(TexCoords.y-0.4,TexCoords.x-0.5);
			vec2 r2 = vec2(TexCoords.y-0.6,TexCoords.x-0.5);
			float r = length(r1) + length(r2);
			if(r<_Radius)//以r.x、r.y为两直角边长度,计算斜边长度  
			{  
				color = vec4(1,1,1,0);  
			}  
			else  
			{  
				color = pixColor;
			}  
		}  
		//右下方区域  
		else if(TexCoords.x>0.5 && TexCoords.y<0.5)  
		{  
			//vec2 r;  
			//r = vec2(TexCoords.x-0.5,0.5-TexCoords.y);
			vec2 r1 = vec2(TexCoords.y-0.4,0.5-TexCoords.x);
			vec2 r2 = vec2(TexCoords.y-0.6,0.5-TexCoords.x);
			float r = length(r1) + length(r2);
			if(r<_Radius)//以r.x、r.y为两直角边长度,计算斜边长度  
			{  
				color = vec4(1,1,1,0);  
			}  
			else  
			{  
				color = pixColor;  
			}  
		}  

		
	}

画圆

 fixed4 frag(v2f f):SV_Target  
            {  
                //获取纹理坐标下的颜色值  
                fixed4 color = tex2D(_MainTex,f.texcoord);  
  
                //左上方区域  
                if(f.texcoord.x<0.5 && f.texcoord.y>0.5)  
                {  
                    float2 r;  
                    r.x=0.5-f.texcoord.x;  
                    r.y=f.texcoord.y-0.5;  
                    if(length(r)>_Radius)//以r.x、r.y为两直角边长度,计算斜边长度  
                    {  
                        return fixed4(1,1,1,0);  
                    }  
                    else  
                    {  
                        return color;  
                    }  
                }  
                //左下方区域  
                else if(f.texcoord.x<0.5 && f.texcoord.y<0.5)  
                {  
                    float2 r;  
                    r.x=0.5-f.texcoord.x;  
                    r.y=0.5-f.texcoord.y;  
                    if(length(r)>_Radius)  
                    {  
                        return fixed4(1,1,1,0);  
                    }  
                    else  
                    {  
                        return color;  
                    }  
                }  
                //右上方区域  
                else if(f.texcoord.x>0.5 && f.texcoord.y>0.5)  
                {  
                    float2 r;  
                    r.x=f.texcoord.x-0.5;  
                    r.y=f.texcoord.y-0.5;  
                    if(length(r)>_Radius)  
                    {  
                        return fixed4(1,1,1,0);  
                    }  
                    else  
                    {  
                        return color;  
                    }  
                }  
                //右下方区域  
                else if(f.texcoord.x>0.5 && f.texcoord.y<0.5)  
                {  
                    float2 r;  
                    r.x=f.texcoord.x-0.5;  
                    r.y=0.5-f.texcoord.y;  
                    if(length(r)>_Radius)  
                    {  
                        return fixed4(1,1,1,0);  
                    }  
                    else  
                    {  
                        return color;  
                    }  
                }  
  
                return color;  
            }  
  


猜你喜欢

转载自blog.csdn.net/HelloEarth_/article/details/80190041