精华内容
下载资源
问答
  • unity 半透明效果shader
    千次阅读
    2022-02-18 00:48:00
    Shader "Unlit/半透明"
    {
        Properties
        {
            _Diffuse("Diffuse",Color) = (1,1,1,1)  //  漫反射
            _MainTex("MainTex",2D) = "white"{}  //  2D纹理贴图
            _AlphaScale("Alpha Scale",Range(0,1)) = 1  //  控制Alpha参数
        }
            SubShader
            {
                Tags { "Queue" = "Transparent" "IgnoreProjector" = "True" "RenderType" = "Transparent" }   //  渲染顺序设置Transparent
                LOD 100
    
                Pass  //  用两个pass通道来处理,防止出现渲染错误,第一个pass通道  每个pass通道都会渲染一次
                {
    
                    ZWrite On  //  写入深度  为了确认渲染顺序
                    ColorMask 0  //  掩码遮罩  代表这个pass通道不写入任何颜色值
    
                }
    
    
    
                Pass  //  第二个pass通道
                {
                    Tags{"LightMode" = "ForwardBase"}
    
                    ZWrite Off  //  关闭ZWrite(深度写入)
                    Blend SrcAlpha OneMinusSrcAlpha  //  源颜色因子  正常透明混合
    
                    CGPROGRAM
                    #pragma vertex vert
                    #pragma fragment frag
                    #include "UnityCG.cginc"
                    #include "Lighting.cginc"
    
                    struct v2f {
    
                        float4 vertex :SV_POSITION;  //  输出顶点信息
                        fixed3 worldNormal : TEXCOORD0;
                        float3 worldPos:TEXCOORD1;
                        float2 uv:TEXCOORD2;
    
                    };
    
                    fixed4 _Diffuse;
                    float _AlphaScale;
                    sampler2D _MainTex;
                    float4 _MainTex_ST;  //  是MainTex的Tiling和Offset两个属性  不需要在外面定义
    
                    v2f vert(appdata_base v)  //  顶点着色器
                    {
    
                        v2f o;  //  用这个结构体
                        o.vertex = UnityObjectToClipPos(v.vertex);  //  顶点信息从模型转到裁剪空间再放到输出结构体
                        fixed3 worldNormal = UnityObjectToWorldNormal(v.normal);  //  法线从模型变换到世界坐标
                        o.worldNormal = worldNormal;
                        o.worldPos = mul(unity_ObjectToWorld, v.vertex);  //  顶点信息从模型转到世界坐标系
                        //o.uv = v.texcoord.xy * _MainTex_ST.xy + _MainTex_ST.zw;  //  为了让MainTex的Tiling和Offset两个属性能影响到uv
                        o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);  //  unity纹理函数,和上面效果一样
                        return o;
                    }
    
                    fixed4 frag(v2f i) : SV_Target  //  片元着色器  片元高光反射
                    {
    
                        fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;  //  环境光
    
                        fixed4 texColor = tex2D(_MainTex, i.uv);  //  采样这个图
    
                        
    
                        //  漫反射
                        //fixed3 worldLightDir = normalize(_WorldSpaceLightPos0.xyz);
                        fixed3 worldLightDir = UnityWorldSpaceLightDir(i.worldPos);
    
                        fixed3 diffuse = texColor.rgb * _LightColor0.rgb * _Diffuse.rgb * max(0, dot(worldLightDir,i.worldNormal) * 0.5 + 0.5);  //  漫反射公式  图的纹理采样乘进来,纹理属于漫反射
    
                        fixed3 color = ambient + diffuse;
                        return fixed4(color, texColor.a * _AlphaScale);  //  texColor的a值就是颜色通道的值  乘上_AlphaScale来控制
    
                    }
                    ENDCG
                }
            }
                        FallBack "Transparent/VertexLit"    
    }

    更多相关内容
  • 一个项目,做世界地图时,希望未开启的地块是线稿,新地块开启时,做一个上色处理。 想到的方案就是:上了色的彩图盖在线稿上,然后用mask 控制彩图的局部显隐。 然后用mask不同的颜色来区分不同的色块,控制是否...
  • 2.很多游戏用到残影,一般残影都是透的,然后慢慢透明 从左到右 1.使用标准材质球 2.使用透材质球 3.使用外发光的透材质球 4.使用内发光和外发光的材质球 shader比较简单直接上代码 这些都是surface ...

    半透shader什么时候用到呢

    1.如果主角被东西挡住,摄像机要不拉近要不把挡住的物体半透

    2.很多游戏用到残影,一般残影都是半透的,然后慢慢透明

    从左到右

    1.使用标准材质球

    2.使用半透材质球

    3.使用外发光的半透材质球

    4.使用内发光和外发光的材质球

    shader比较简单直接上代码

    这些都是surface shader

    1.半透shader

    Shader "Snoopy/AlphaBase"
    {
    	Properties
    	{
    		_MainTex("Particle Texture", 2D) = "white" {}
    		_Color("Color", Color) = (1,1,1,1)
    	}
    	
    	SubShader
    	{
    		Tags{ "Queue" = "Transparent" "IgnoreProjector" = "True" "RenderType" = "Transparent" }
    
    		//这里加一个pass为了不会穿透叠自己的颜色,可以取消这个pass看看效果
    		Pass
    		{
    			ZWrite On
    			ColorMask 0
    		}
    
    		CGPROGRAM
    		//使用alpha通道
    		#pragma surface surf Lambert alpha
    
    		struct Input
    		{
    			float2 uv_MainTex;
    		};
    
    		sampler2D _MainTex;
    		fixed4 _Color;
    
    		void surf(Input IN, inout SurfaceOutput o)
    		{
    			float4 col = tex2D(_MainTex, IN.uv_MainTex);
    			o.Albedo = col.rgb * _Color.rgb;
    			o.Alpha = _Color.a;
    		}
    		ENDCG
    	}
    	Fallback "VertexLit"
    }

    2.外发光的半透shader

    Shader "Snoopy/AlphaRimBase"
    {
    	Properties
    	{
    		_MainTex("Particle Texture", 2D) = "white" {}
    		_Color("Color", Color) = (1,1,1,1)
    		_RimColor("Rim Color", Color) = (0.5,0.5,0.5,0.5)
    		_RimPower("Rim Power", Range(0.0,5.0)) = 2.5
    	}
    	SubShader
    	{
    		Tags{ "Queue" = "Transparent" "IgnoreProjector" = "True" "RenderType" = "Transparent" }
    
    		Pass
    		{
    			ZWrite On
    			ColorMask 0
    		}
    
    		CGPROGRAM
    		#pragma surface surf Lambert alpha
    
    		struct Input
    		{
    			float3 viewDir;
    			float2 uv_MainTex;
    		};
    
    		sampler2D _MainTex;
    		float4 _Color;
    		float4 _RimColor;
    		float _RimPower;
    
    		void surf(Input IN, inout SurfaceOutput o)
    		{
    			float4 col = tex2D(_MainTex, IN.uv_MainTex);
    			o.Albedo = col.rgb * _Color.rgb;
    			//边缘高光
    			half rim = 1.0 - saturate(dot(normalize(IN.viewDir), o.Normal));
    			o.Emission = _RimColor.rgb * pow(rim, 6 - _RimPower);
    			o.Alpha = _Color.a;
    		}
    		ENDCG
    	}
    	Fallback "VertexLit"
    }

    3.外发光和内发光的半透shader

    Shader "Snoopy/AlphaRimPro"
    {
    	Properties
    	{
    		_MainTex ("Particle Texture", 2D) = "white" {}
    		_RimColor ("Rim Color", Color) = (0.5,0.5,0.5,0.5)
    		_InnerColor ("Inner Color", Color) = (0.5,0.5,0.5,0.5)
    		_InnerColorPower ("Inner Color Power", Range(0.0,1.0)) = 0.5
    		_RimPower ("Rim Power", Range(0.0,5.0)) = 2.5
    		_AlphaPower ("Alpha Rim Power", Range(0.0,8.0)) = 4.0
    		_AllPower ("All Power", Range(0.0, 10.0)) = 1.0
    		_InnerAlphaBase ("Inner Alpha Base", Range(0.0, 1.0)) = 1.0
    	}
    	SubShader
    	{
    		Tags{ "Queue" = "Transparent" "IgnoreProjector" = "True" "RenderType" = "Transparent" }
    
    		Pass
    		{
    			// 开启深度写入
    			ZWrite On
    			// 设置颜色通道的写掩码,0为不写入任何颜色
    			ColorMask 0
    		}
    
    		CGPROGRAM
    		#pragma surface surf Lambert alpha
    	
    		struct Input
    		{
    			float3 viewDir;
    			float2 uv_MainTex;
    			INTERNAL_DATA
    		};
    	
    		sampler2D _MainTex;
    		float4 _RimColor;
    		float _RimPower;
    		float _AlphaPower;
    		float _AlphaMin;
    		float _InnerColorPower;
    		float _AllPower;
    		float4 _InnerColor;
    		float _InnerAlphaBase;
    		
    		void surf (Input IN, inout SurfaceOutput o)
    		{
    			float4 col = tex2D (_MainTex, IN.uv_MainTex);
    			o.Albedo = col.rgb;
    			half rim = 1.0 - saturate(dot (normalize(IN.viewDir), o.Normal));
    			o.Emission = _RimColor.rgb * pow (rim, _RimPower)*_AllPower+(_InnerColor.rgb*2*_InnerColorPower);
    			o.Alpha = (_InnerAlphaBase + (pow (rim, _AlphaPower))*_AllPower) * col.a;
    		}
    		ENDCG
    	}
    Fallback "VertexLit"
    } 

    工程下载地址

    链接:https://pan.baidu.com/s/11LTiIW0lIosNqokpucq6SQ 
    提取码:td8s 

    展开全文
  • 文章目录透明度测试透明度混合开启深度写入的半透明常见的混合类型双面渲染透明度测试的双面渲染透明度混合的双面渲染 实现透明效果的方法有两种:透明度测试和透明度混合 透明度测试 透明度测试实现的效果只有...


    在这里插入图片描述
    实现透明效果的方法有两种:透明度测试和透明度混合

    透明度测试

    透明度测试实现的效果只有不透明和完全透明两种效果,不需要关闭深度写入。只要小于阈值就舍弃、
    在这里插入图片描述

    Shader "Unity Shaders Book/Chapter 8/Alpha Test" {
    	Properties {
    		_Color ("Color Tint", Color) = (1, 1, 1, 1)
    		_MainTex ("Main Tex", 2D) = "white" {}
    		_Cutoff ("Alpha Cutoff", Range(0, 1)) = 0.5
    	}
    	SubShader {
    	//IgnoreProjector:使这个shader不受投影器的影响
    	//RenderType:将这个shader归入提前定义的组
    		Tags {"Queue"="AlphaTest" "IgnoreProjector"="True" "RenderType"="TransparentCutout"}
    		
    		Pass {
    			Tags { "LightMode"="ForwardBase" }
    			
    			CGPROGRAM
    			
    			#pragma vertex vert
    			#pragma fragment frag
    			
    			#include "Lighting.cginc"
    			
    			fixed4 _Color;
    			sampler2D _MainTex;
    			float4 _MainTex_ST;
    			fixed _Cutoff;
    			
    			struct a2v {
    				float4 vertex : POSITION;
    				float3 normal : NORMAL;
    				float4 texcoord : TEXCOORD0;
    			};
    			
    			struct v2f {
    				float4 pos : SV_POSITION;
    				float3 worldNormal : TEXCOORD0;
    				float3 worldPos : TEXCOORD1;
    				float2 uv : TEXCOORD2;
    			};
    			
    			v2f vert(a2v v) {
    				v2f o;
    				o.pos = UnityObjectToClipPos(v.vertex);
    				
    				o.worldNormal = UnityObjectToWorldNormal(v.normal);
    				
    				o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;
    				
    				o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
    				
    				return o;
    			}
    			
    			fixed4 frag(v2f i) : SV_Target {
    				fixed3 worldNormal = normalize(i.worldNormal);
    				fixed3 worldLightDir = normalize(UnityWorldSpaceLightDir(i.worldPos));
    				
    				fixed4 texColor = tex2D(_MainTex, i.uv);
    				
    				// Alpha test
    				clip (texColor.a - _Cutoff);
    				// Equal to 
    //				if ((texColor.a - _Cutoff) < 0.0) {
    //					discard;
    //				}
    				
    				fixed3 albedo = texColor.rgb * _Color.rgb;
    				
    				fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz * albedo;
    				
    				fixed3 diffuse = _LightColor0.rgb * albedo * max(0, dot(worldNormal, worldLightDir));
    				
    				return fixed4(ambient + diffuse, 1.0);
    			}
    			
    			ENDCG
    		}
    	} 
    	FallBack "Transparent/Cutout/VertexLit"
    }
    
    

    透明度混合

    使用当前片元的透明度作为和混合因子和颜色缓冲中的颜色值混合,需要关闭深度写入。
    在这里插入图片描述

    Shader "Unity Shaders Book/Chapter 8/Alpha Blend" {
    	Properties {
    		_Color ("Color Tint", Color) = (1, 1, 1, 1)
    		_MainTex ("Main Tex", 2D) = "white" {}
    		_AlphaScale ("Alpha Scale", Range(0, 1)) = 1
    	}
    	SubShader {
    		Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"}
    		
    		Pass {
    			Tags { "LightMode"="ForwardBase" }
    
    			ZWrite Off
    			Blend SrcAlpha OneMinusSrcAlpha
    			
    			CGPROGRAM
    			
    			#pragma vertex vert
    			#pragma fragment frag
    			
    			#include "Lighting.cginc"
    			
    			fixed4 _Color;
    			sampler2D _MainTex;
    			float4 _MainTex_ST;
    			fixed _AlphaScale;
    			
    			struct a2v {
    				float4 vertex : POSITION;
    				float3 normal : NORMAL;
    				float4 texcoord : TEXCOORD0;
    			};
    			
    			struct v2f {
    				float4 pos : SV_POSITION;
    				float3 worldNormal : TEXCOORD0;
    				float3 worldPos : TEXCOORD1;
    				float2 uv : TEXCOORD2;
    			};
    			
    			v2f vert(a2v v) {
    				v2f o;
    				o.pos = UnityObjectToClipPos(v.vertex);
    				
    				o.worldNormal = UnityObjectToWorldNormal(v.normal);
    				
    				o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;
    				
    				o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
    				
    				return o;
    			}
    			
    			fixed4 frag(v2f i) : SV_Target {
    				fixed3 worldNormal = normalize(i.worldNormal);
    				fixed3 worldLightDir = normalize(UnityWorldSpaceLightDir(i.worldPos));
    				
    				fixed4 texColor = tex2D(_MainTex, i.uv);
    				
    				fixed3 albedo = texColor.rgb * _Color.rgb;
    				
    				fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz * albedo;
    				
    				fixed3 diffuse = _LightColor0.rgb * albedo * max(0, dot(worldNormal, worldLightDir));
    				
    				return fixed4(ambient + diffuse, texColor.a * _AlphaScale);
    			}
    			
    			ENDCG
    		}
    	} 
    	FallBack "Transparent/VertexLit"
    }
    
    

    开启深度写入的半透明

    增加一个pass,只开启深度写入,不输出颜色值

    Shader "Unity Shaders Book/Chapter 8/Alpha Blending With ZWrite" {
    	Properties {
    		_Color ("Color Tint", Color) = (1, 1, 1, 1)
    		_MainTex ("Main Tex", 2D) = "white" {}
    		_AlphaScale ("Alpha Scale", Range(0, 1)) = 1
    	}
    	SubShader {
    		Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"}
    		
    		// Extra pass that renders to depth buffer only
    		Pass {
    			ZWrite On
    			//ColorMask RGBA0,0代表不输出颜色值
    			ColorMask 0
    		}
    		
    		Pass {
    			Tags { "LightMode"="ForwardBase" }
    			
    			ZWrite Off
    			Blend SrcAlpha OneMinusSrcAlpha
    			
    			CGPROGRAM
    			
    			#pragma vertex vert
    			#pragma fragment frag
    			
    			#include "Lighting.cginc"
    			
    			fixed4 _Color;
    			sampler2D _MainTex;
    			float4 _MainTex_ST;
    			fixed _AlphaScale;
    			
    			struct a2v {
    				float4 vertex : POSITION;
    				float3 normal : NORMAL;
    				float4 texcoord : TEXCOORD0;
    			};
    			
    			struct v2f {
    				float4 pos : SV_POSITION;
    				float3 worldNormal : TEXCOORD0;
    				float3 worldPos : TEXCOORD1;
    				float2 uv : TEXCOORD2;
    			};
    			
    			v2f vert(a2v v) {
    				v2f o;
    				o.pos = UnityObjectToClipPos(v.vertex);
    				
    				o.worldNormal = UnityObjectToWorldNormal(v.normal);
    				
    				o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;
    				
    				o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
    				
    				return o;
    			}
    			
    			fixed4 frag(v2f i) : SV_Target {
    				fixed3 worldNormal = normalize(i.worldNormal);
    				fixed3 worldLightDir = normalize(UnityWorldSpaceLightDir(i.worldPos));
    				
    				fixed4 texColor = tex2D(_MainTex, i.uv);
    				
    				fixed3 albedo = texColor.rgb * _Color.rgb;
    				
    				fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz * albedo;
    				
    				fixed3 diffuse = _LightColor0.rgb * albedo * max(0, dot(worldNormal, worldLightDir));
    				
    				return fixed4(ambient + diffuse, texColor.a * _AlphaScale);
    			}
    			
    			ENDCG
    		}
    	} 
    	FallBack "Transparent/VertexLit"
    }
    
    

    常见的混合类型

    在这里插入图片描述

    双面渲染

    透明度测试的双面渲染

    Cull Back(剔除背面) | Front(正面) | Off(关闭,即双面渲染)

    透明度混合的双面渲染

    分成三个Pass:背面——正面——混合(因为Pass顺序执行,所以先渲染背面)
    只需要在前两个Pass中cull front 和cull back即可

    Shader "Unity Shaders Book/Chapter 8/Alpha Test With Both Side" {
    	Properties {
    		_Color ("Color Tint", Color) = (1, 1, 1, 1)
    		_MainTex ("Main Tex", 2D) = "white" {}
    		_Cutoff ("Alpha Cutoff", Range(0, 1)) = 0.5
    	}
    	SubShader {
    		Tags {"Queue"="AlphaTest" "IgnoreProjector"="True" "RenderType"="TransparentCutout"}
    		
    		Pass {
    			Tags { "LightMode"="ForwardBase" }
    			
    			// Turn off culling
    			Cull Off
    			
    			CGPROGRAM
    			
    			#pragma vertex vert
    			#pragma fragment frag
    			
    			#include "Lighting.cginc"
    			
    			fixed4 _Color;
    			sampler2D _MainTex;
    			float4 _MainTex_ST;
    			fixed _Cutoff;
    			
    			struct a2v {
    				float4 vertex : POSITION;
    				float3 normal : NORMAL;
    				float4 texcoord : TEXCOORD0;
    			};
    			
    			struct v2f {
    				float4 pos : SV_POSITION;
    				float3 worldNormal : TEXCOORD0;
    				float3 worldPos : TEXCOORD1;
    				float2 uv : TEXCOORD2;
    			};
    			
    			v2f vert(a2v v) {
    				v2f o;
    				o.pos = UnityObjectToClipPos(v.vertex);
    				
    				o.worldNormal = UnityObjectToWorldNormal(v.normal);
    				
    				o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;
    				
    				o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
    				
    				return o;
    			}
    			
    			fixed4 frag(v2f i) : SV_Target {
    				fixed3 worldNormal = normalize(i.worldNormal);
    				fixed3 worldLightDir = normalize(UnityWorldSpaceLightDir(i.worldPos));
    				
    				fixed4 texColor = tex2D(_MainTex, i.uv);
    
    				clip (texColor.a - _Cutoff);
    				
    				fixed3 albedo = texColor.rgb * _Color.rgb;
    				
    				fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz * albedo;
    				
    				fixed3 diffuse = _LightColor0.rgb * albedo * max(0, dot(worldNormal, worldLightDir));
    				
    				return fixed4(ambient + diffuse, 1.0);
    			}
    			
    			ENDCG
    		}
    	} 
    	FallBack "Transparent/Cutout/VertexLit"
    }
    
    
    展开全文
  • Unity Shader 实现半透明效果

    万次阅读 2019-07-04 16:48:51
    想要实现如下效果:主角可以遮挡背景,背景遮挡主角时候半透明混合 研究了一周,shader知识了解从无到稍稍入门,终于解决了,记录一下实现方案。 实现方法 使用 Blend One OneMinusSrcAlpha指令,也就是SrcColor + ...

    背景

    想要实现如下效果:主角可以遮挡背景,背景遮挡主角时候半透明混合
    研究了一周,shader知识了解从无到稍稍入门,终于解决了,记录一下实现方案。

    实现方法

    1. 使用 Blend One OneMinusSrcAlpha指令,也就是SrcColor + DstColor * (1 - SrcAlpha),假设A和B重叠,先渲染A,然后渲染B,指令在B的shader里,那么SrcColor是B的颜色,DstColor是A的颜色,SrcAlpha是B的透明度,由此可以实现A和B混合后半透明效果
    2. 使用Stencil标记重叠部分,可以实现只让重叠部分半透明
    3. 所有shader基于Sprite-Default修改

    步骤说明

    1. 主角shader:使用Stencil标记像素索引为1,所有被主角渲染过的像素的索引均为1
    				Stencil
    				{
    					Ref 1
    					Pass replace
    				}
    
    1. 背景shader:采用两个pass
    • 第一个pass:识别到不是主角渲染的像素,按照Sprite-Default正常渲染
    				Stencil
    				{
    
    					Ref 1
    					Comp notequal
    				}
    
    • 第二个pass:识别到主角渲染过的像素后,表明是重叠区域,混合两者颜色,实现半透明
    				Stencil
    				{
    
    					Ref 1
    					Comp equal
    				}
    				//混合半透明效果,背景 + 主角色* (1-SrcAlpha)
    				Blend One OneMinusSrcAlpha
    				...
    				fixed4 frag(v2f IN) : SV_Target
    				{
    					fixed4 c = SampleSpriteTexture(IN.texcoord) * IN.color;
    					c.a *= 0.5; c.a就是SrcAlpha
    					c.rgb *= c.a;
    					return c;
    				}
    
    1. 背景和主角layer均为default,但是order分别为0、1,也就是主角先渲染,最终效果为:在这里插入图片描述
    2. 背景和主角layer均为default,但是order分别为0、-1,也就是背景先渲染,最终效果为:在这里插入图片描述
    3. 最终实现:主角可以遮挡背景;背景遮挡主角时,重叠部分半透明混合效果

    注意事项

    在frag里通过clip可以过滤一些隐藏像素点,不会被strencil标记

    shader源码

    1. 主角shader
    Shader "Custom/SpriteDefaltChar"
    {
    	Properties
    	{
    		[PerRendererData] _MainTex("Sprite Texture", 2D) = "white" {}
    		_Color("Tint", Color) = (1,1,1,1)
    		[MaterialToggle] PixelSnap("Pixel snap", Float) = 0
    	}
    
    		SubShader
    		{
    			Tags
    			{
    				"Queue" = "Transparent"
    				"IgnoreProjector" = "True"
    				"RenderType" = "Transparent"
    				"PreviewType" = "Plane"
    				"CanUseSpriteAtlas" = "True"
    			}
    
    			Cull Off
    			Lighting Off
    			ZWrite Off
    			Blend One OneMinusSrcAlpha
    
    			Pass
    			{
    
    				Stencil
    				{
    					Ref 1
    					Pass replace
    				}
    
    			CGPROGRAM
    				#pragma vertex vert
    				#pragma fragment frag
    				#pragma multi_compile _ PIXELSNAP_ON
    				#include "UnityCG.cginc"
    
    				struct appdata_t
    				{
    					float4 vertex   : POSITION;
    					float4 color    : COLOR;
    					float2 texcoord : TEXCOORD0;
    				};
    
    				struct v2f
    				{
    					float4 vertex   : SV_POSITION;
    					fixed4 color : COLOR;
    					float2 texcoord  : TEXCOORD0;
    				};
    
    				fixed4 _Color;
    
    				v2f vert(appdata_t IN)
    				{
    					v2f OUT;
    					OUT.vertex = UnityObjectToClipPos(IN.vertex);
    					OUT.texcoord = IN.texcoord;
    					OUT.color = IN.color * _Color;
    					#ifdef PIXELSNAP_ON
    					OUT.vertex = UnityPixelSnap(OUT.vertex);
    					#endif
    
    					return OUT;
    				}
    
    				sampler2D _MainTex;
    				sampler2D _AlphaTex;
    				float _AlphaSplitEnabled;
    
    				fixed4 SampleSpriteTexture(float2 uv)
    				{
    					fixed4 color = tex2D(_MainTex, uv);
    
    	#if UNITY_TEXTURE_ALPHASPLIT_ALLOWED
    					if (_AlphaSplitEnabled)
    						color.a = tex2D(_AlphaTex, uv).r;
    	#endif //UNITY_TEXTURE_ALPHASPLIT_ALLOWED
    
    					return color;
    				}
    
    				fixed4 frag(v2f IN) : SV_Target
    				{
    					fixed4 c = SampleSpriteTexture(IN.texcoord) * IN.color;
    					c.rgb *= c.a;
    					return c;
    				}
    			ENDCG
    			}
    		}
    }
    
    1. 背景shader
    Shader "Custom/SpriteDefaltBg"
    {
    	Properties
    	{
    		[PerRendererData] _MainTex("Sprite Texture", 2D) = "white" {}
    		_Color("Tint", Color) = (1,1,1,1)
    		[MaterialToggle] PixelSnap("Pixel snap", Float) = 0
    	}
    
    		SubShader
    		{
    			Tags
    			{
    				"Queue" = "Transparent"
    				"IgnoreProjector" = "True"
    				"RenderType" = "Transparent"
    				"PreviewType" = "Plane"
    				"CanUseSpriteAtlas" = "True"
    			}
    
    
    			Pass
    			{
    				Stencil
    				{
    
    					Ref 1
    					Comp notequal
    				}
    
    				Cull Off
    				Lighting Off
    				ZWrite Off
    				Blend One OneMinusSrcAlpha
    
    			CGPROGRAM
    				#pragma vertex vert
    				#pragma fragment frag
    				#pragma multi_compile _ PIXELSNAP_ON
    				#include "UnityCG.cginc"
    
    				struct appdata_t
    				{
    					float4 vertex   : POSITION;
    					float4 color    : COLOR;
    					float2 texcoord : TEXCOORD0;
    				};
    
    				struct v2f
    				{
    					float4 vertex   : SV_POSITION;
    					fixed4 color : COLOR;
    					float2 texcoord  : TEXCOORD0;
    				};
    
    				fixed4 _Color;
    
    				v2f vert(appdata_t IN)
    				{
    					v2f OUT;
    					OUT.vertex = UnityObjectToClipPos(IN.vertex);
    					OUT.texcoord = IN.texcoord;
    					OUT.color = IN.color * _Color;
    					#ifdef PIXELSNAP_ON
    					OUT.vertex = UnityPixelSnap(OUT.vertex);
    					#endif
    
    					return OUT;
    				}
    
    				sampler2D _MainTex;
    				sampler2D _AlphaTex;
    				float _AlphaSplitEnabled;
    
    				fixed4 SampleSpriteTexture(float2 uv)
    				{
    					fixed4 color = tex2D(_MainTex, uv);
    
    	#if UNITY_TEXTURE_ALPHASPLIT_ALLOWED
    					if (_AlphaSplitEnabled)
    						color.a = tex2D(_AlphaTex, uv).r;
    	#endif //UNITY_TEXTURE_ALPHASPLIT_ALLOWED
    
    					return color;
    				}
    
    				fixed4 frag(v2f IN) : SV_Target
    				{
    					fixed4 c = SampleSpriteTexture(IN.texcoord) * IN.color;
    					c.rgb *= c.a;
    					return c;
    				}
    			ENDCG
    			}
    
    			Pass
    			{
    				Stencil
    				{
    
    					Ref 1
    					Comp equal
    				}
    
    				Cull Off
    				Lighting Off
    				ZWrite Off
    				Blend One OneMinusSrcAlpha
    
    			CGPROGRAM
    				#pragma vertex vert
    				#pragma fragment frag
    				#pragma multi_compile _ PIXELSNAP_ON
    				#include "UnityCG.cginc"
    
    				struct appdata_t
    				{
    					float4 vertex   : POSITION;
    					float4 color    : COLOR;
    					float2 texcoord : TEXCOORD0;
    				};
    
    				struct v2f
    				{
    					float4 vertex   : SV_POSITION;
    					fixed4 color : COLOR;
    					float2 texcoord  : TEXCOORD0;
    				};
    
    				fixed4 _Color;
    
    				v2f vert(appdata_t IN)
    				{
    					v2f OUT;
    					OUT.vertex = UnityObjectToClipPos(IN.vertex);
    					OUT.texcoord = IN.texcoord;
    					OUT.color = IN.color * _Color;
    					#ifdef PIXELSNAP_ON
    					OUT.vertex = UnityPixelSnap(OUT.vertex);
    					#endif
    
    					return OUT;
    				}
    
    				sampler2D _MainTex;
    				sampler2D _AlphaTex;
    				float _AlphaSplitEnabled;
    
    				fixed4 SampleSpriteTexture(float2 uv)
    				{
    					fixed4 color = tex2D(_MainTex, uv);
    
    	#if UNITY_TEXTURE_ALPHASPLIT_ALLOWED
    					if (_AlphaSplitEnabled)
    						color.a = tex2D(_AlphaTex, uv).r;
    	#endif //UNITY_TEXTURE_ALPHASPLIT_ALLOWED
    
    					return color;
    				}
    
    				fixed4 frag(v2f IN) : SV_Target
    				{
    					fixed4 c = SampleSpriteTexture(IN.texcoord) * IN.color;
    					c.a *= 0.5;
    					c.rgb *= c.a;
    					return c;
    				}
    			ENDCG
    			}
    		}
    }
    
    展开全文
  • 简单阴影制作思路:1:在角色脚底 放置一块平板2:shader中 根据平板传入的矩阵 以及 光照 对角色进行变换3: 得到投影在地面上的阴影4:阴影直接渲染到 屏幕上缺点:上面的阴影无法 增加半透明阴影效果,因为如果...
  • Unity3d之shader透明模式双pass解决方案

    千次阅读 2021-12-01 00:14:36
    Shader "Unlit/AlphaBlend_2pass" { Properties { _Color("Main Tint",Color)=(1,1,1,1) _MainTex ("Texture", 2D) = "white" {} _AlphaScale("Alpha Scale",Range(0,1))=1 } SubShader { Tags { "Queue"=...
  • unity透明shader

    2020-11-04 14:58:21
    unity使用,发光透明shader,公司大神写的,很好用。直接挂载,调一下颜色就好,用来做一些水一样或其他透效果
  • Shader "Custom/StencilStandardTransparentCull" { Properties { _Color ("Color", Color) = (1,1,1,1) _MainTex ("Albedo (RGB)", 2D) = "white" {} _NormalMap("NormalMap", 2D) = "bump" {} _BumpScale(...
  • 笔者使用的是 Unity 2018.2.0f2 + VS2017,建议读者使用与 Unity 2018 相近的版本,避免一些因为版本不一致而出现的问题。 【Unity Shader】(三) ------ ... 【Unity Shader】(五) ------ 透明效果之透明效...
  • UnityShader 遮挡半透明Shader //渲染被遮挡部分的Pass pass{ blend SrcAlpha OneMinusSrcAlpha ZTest greater // 把被遮住的部分的深度值写入深度缓存,和平时情况正好相反 Zwrite ON //开启深度写入 frag{ ...
  • Unity Shader透明效果

    千次阅读 2022-02-16 16:53:04
    unity中,我们通常使用两种方法来实现透明效果:第一种是使用透明度测试,这种方法其实无法得到真正的半透明效果;另一种就是透明度混合。 对于不透明物体,不考虑他们的渲染顺序也能得到正确的排序效果,这是...
  • Unity半透明物体+投射阴影+接受阴影

    千次阅读 2020-07-31 18:03:19
    物体实现半透明有透明度测试和透明度混合两种方式,不同方式接受和投射阴影的方式有所差别。 【透明度测试阴影效果图】 正方体的阴影一部分打在了水平面上,一部分在白色平面上。由于透明度测试使得水平面的右半...
  • UnityShader透明效果和渲染顺序

    千次阅读 2020-06-25 09:39:59
    Unity 中实现透明效果的方法: 透明度测试; 透明度混合; 深度缓冲 深度缓冲,根据深度缓存中的值来判断该片元距离摄像机的距离,当渲染一个片元时,需要把它的深度值和已经存在于深度缓冲中的进行比较(如果开启...
  • UnityShader透明效果

    2021-09-01 14:22:05
    UnityShader的渲染顺序 Unity为解决渲染顺序的问题提供了渲染队列这一解决方案。我们可以使用SubShader的Queue标签来决定我们的模型将归于哪个渲染队列。 透明度测试 只要一个片元的透明度不满足条件(通常是小于...
  • unity中会有两种方法实现透明效果 透明度测试 透明度混合 unity里面,倘若场景中包含很多模型时,我们需要考虑他们的渲染顺序来得到正确的排序效果,这就需要 深度缓冲(z-buffer):根据深度缓存中的值来判断该...
  • 一、半透明材质 SSS(sub-Surface Scattering,3S)的中文意思是次表面散射或称半透明材质。它适用于表现各种有次表面反射的材质,如透明橡胶、有机玻璃或玉石等。因为实时渲染是不可能做大量的运算来计算光的折射和...
  • Unity Shader 之遮挡透明

    2022-04-05 19:28:31
    Unity Shader 之遮挡透明
  • Shader "Unlit/fresnel" { Properties { _FresnelColor("Fresnel Color",Color)=(1,1,1,1) _Fresnel("Fade(X) Intensity(Y)",vector)=(3,1,0,0) } SubShader { Tags { "RenderPipeline"="UniversalPipeline...
  • unity玻璃双面透明显示材质shader

    热门讨论 2015-06-10 15:12:29
    解决三维模型导入unity中,玻璃双面透明显示的材质问题。
  • 确定透明alpha //透明度 float GetAlpha (Interpolators i) { float alpha = _Tint.a; #if !defined(_SMOOTHNESS_ALBEDO) alpha *= tex2D(_MainTex, i.uv.xy).a; #endif return alpha; } 在片元着色器上 ...
  • 一般用到的渲染模式有以下四种:不透明、裁剪半透明(CutOut)、半透明(Fade)、漫反射半透明(Transparent) 代码设置如下: // 各个渲染模式的设置,和枚举RenderingMode对应 public static ...
  • 问题是这样的:伸出水面的柱子底部有半透明的材质,用来营造水深的效果,水面也是半透明的,放在一起就出现了半透明穿插的问题,渲染序列出错了。 这个问题在计算机图形学上看成经典案例,在unity上解决方法很...
  • 基于物理渲染-unity实现PBR shader + 多光源 + 半透明物体和阴影一,PBR光照1.1直接光照1.1.1直接光照漫反射1.1.2直接光照镜面反射1.2间接光照1.2.1间接光照漫反射1.2.2间接光照镜面反射二,多光源处理+阴影三,...
  • Unity Shader透明遮罩效果

    千次阅读 2019-12-17 10:40:06
    透明遮罩位于被遮住物体(图中红色)和显示物体(绿色和白色)前面,优先渲染遮罩,第一个Pass记录透明遮罩的深度之后在绘制透明颜色,这样到绘制被遮住物体时,只要开启ZTest就可以使其深度测试失败,透明遮罩罩住...
  • UnityShader-透明效果

    2020-10-16 17:01:27
    透明度测试 透明度测试: 只要一个片元的透明度不满足条件(通常小于某个值),那么他对应的片元就会舍弃。被舍弃的片元不会进行任何处理,也不会对颜色缓冲产生任何影响;...Shader "cc/shader10" { Properties {
  • Unity Shader 透明效果

    2021-03-24 10:29:52
    透明效果 导言 每个片元除了颜色值和深度值之外,它还有一个透明度属性。当透明度为1时,表示该像素是完全不透明的,而当其为0时,则该...透明度混合,这种方法可以得到半透明的效果。它使用当前片元的透明度作为混合
  • Unity中双面显示shader

    2019-01-15 09:33:44
    Unity中比较常用的双面显示shader,希望对需要的朋友带来帮助!
  • Unity 面板中将两个图片的透明度分别下调至50%,此时红色已经遮挡不住黄色了。 我从网上找了一堆教程,大概都是通过自定义shader去实现下图效果。 今天告诉大家一个奇淫巧计,只在特定条件下能用,就是黄色和...
  • Unity Shader透明并具有遮挡效果

    千次阅读 2022-04-01 13:17:37
    Shader "MASK/PortalMaskShader" { SubShader { Tags{ "RenderType" = "Opaque" "Queue" = "Geometry-3" } ColorMask 0 ZWrite on CGINCLUDE #include "UnityCG.cginc" struct appdata { float4 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,267
精华内容 1,306
关键字:

unity半透明shader