Unity学习shader笔记[七]简单透明shader

这里对里面的一些设置的知识点给出比较详细的参考链接

[Shader]渲染Image,ZWrite Off ZTest Always的理解

Shader山下(十八)混合(Blend)命令

下面给出的是纯透明知识点的shader

// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'

Shader "Wp/Blend"{
	Properties{
		_Color("Color", Color) = (1, 1, 1, 1)
		_MainTex("MainTex", 2D) = "White" {}
		_AlphaScale("AlphaScale", Range(0, 1)) = 1
	}

		SubShader{
			Tags{
				"Queue" = "Transparent"
				"Ignoreprojector" = "True"
				"RenderType" = "Transparent"
			}
			Pass{
						ZWrite off
						Blend SrcAlpha OneMinusSrcAlpha


						CGPROGRAM

						#pragma vertex vert
						#pragma fragment frag

						fixed4 _Color;
						sampler2D _MainTex;
						float4 _MainTex_ST;
						float _AlphaScale;

						struct a2v {
							float4 pos : POSITION;
							float4 normal : NORMAL;
							float texcoord : TEXCOORD0;
						};

						struct v2f {
							float4 pos : SV_POSITION;
							float3 worldNormal : TEXCOORD0;
							float3 worldPos : TEXCOORD1;
							float4 uv : TEXCOORD2;
						};

						v2f vert(a2v v) {
							v2f o;
							o.pos = UnityObjectToClipPos(v.pos);
							return o;
						}

						fixed4 frag(v2f i) : SV_Target{
							return fixed4(_Color.rgb, _Color.a * _AlphaScale);
						}

						ENDCG
					}
	}
		Fallback "Diffuse"
}

因为是纯透明控制 没有了法线和环境光的控制
一个球型的模型 看起来只是个透明的圆

在这里插入图片描述

下面给出的是带有材质贴图和法线贴图的shader代码
有关材质贴图和法线贴图的知识点可以参考我写的另外两篇博客
Unity学习shader笔记[六]法线贴图
Unity学习shader笔记[五]纹理贴图

// Upgrade NOTE: replaced '_World2Object' with 'unity_WorldToObject'
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
// Upgrade NOTE: replaced '_World2Object' with 'unity_WorldToObject'
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'

Shader"TsinNing/Transparent"{

	Properties{
		_texPlusC("TexPlusC", COLOR) = (1,1,1,1)
		_MainTex("Main Tex", 2D) = "white"{}
		_NormalMap("Normal Map", 2D) = "bump"{}
		_BumpScale("Bump Scale", Range(0, 5)) = 1
		_TransparentScale("TransparentScale",Range(0, 1)) = 0.5
	}


		SubShader{

		Tags{
		//渲染队列 
		//渲染队列有Background  Geometry  AlphaTest  Transparent  Overlay 
		//越后面的越靠后渲染
		//后面渲染的物体一般会遮住前面渲染的
		"Queue" = "Transparent"
		//这个SubShader渲染的物体 不会产生投影
		"IgnoreProjector" = "True"
		//渲染队列有Opaque  Transparent  Background  Overlay  
		//"Opaque":绝大部分不透明的物体都使用这个;
		//"Transparent":绝大部分透明的物体、包括粒子特效都使用这个;
		//"Background":天空盒都使用这个;
		//"Overlay":GUI、镜头光晕都使用这个
		"RenderType" = "Transparent"
		}
		Pass{
		Tags{"LightMode" = "ForwardBase"}
		//深度写入 关闭
		//一般半透明的物体 都会关闭深度写入
		ZWrite Off
		//这一部分语义的作用有点类似PS里面的溶解 叠加等效果
		//OneMinusSrcAlpha表示的是 正常模式(透明度混合) 
		//混合(Blend)被用于创建透明的对象。渲染图像时,当所有的着色器执行完并且所有的纹理都被应用之后,
		//像素点会被写入屏幕。如何将这些像素与已有图像进行组合?我们就需要使用混合命令来告诉GPU混合的方式。
		Blend SrcAlpha OneMinusSrcAlpha
		
		//上面五个语义写好之后 透明度才会真正开启


	   CGPROGRAM
 #include "Lighting.cginc"

 #pragma vertex vert
 #pragma fragment frag

		fixed4 _texPlusC;

		sampler2D _MainTex;
		sampler2D _NormalMap;
		float4 _MainTex_ST;
		float4 _NormalMap_ST;
		float _BumpScale;
		float _TransparentScale;

		 struct a2v {
			 float4 vertex:POSITION;
			 float4 texcoord:TEXCOORD0;
			 float3 normal:NORMAL;
			 float4 tangent:TANGENT;
		 };

		 struct v2f {
			 float4 position:SV_POSITION;
			 float4 uv : TEXCOORD0;
			 float3 lDir : COLOR0;
		 };

		v2f vert(a2v v)
		{
			 v2f f;
			 f.position = UnityObjectToClipPos(v.vertex);
			 f.uv.xy = v.texcoord.xy * _MainTex_ST.xy + _MainTex_ST.zw;
			 f.uv.zw = v.texcoord.xy * _NormalMap_ST.xy + _NormalMap_ST.zw;

			 TANGENT_SPACE_ROTATION;

			 float3 lDir = ObjSpaceLightDir(v.vertex);

			 f.lDir = normalize(mul(lDir, rotation));

			 return f;
		}

		fixed4 frag(v2f f) : SV_Target{

			 fixed3 texC = tex2D(_MainTex, f.uv.xy) * _texPlusC.rgb;
			 half4 norC = tex2D(_NormalMap, f.uv.zw);

			 fixed3 tNor = normalize(UnpackNormal(norC));

			 tNor.xy = tNor.xy * _BumpScale;

			 fixed3 amb = UNITY_LIGHTMODEL_AMBIENT.rgb * texC;

			 fixed3 c = _LightColor0.rgb * texC * max(dot(tNor, f.lDir), 0) + amb;

			 //最后一位是透明度
			 return fixed4(c, _TransparentScale);
		}

		  ENDCG

	   }
	}

		Fallback "Specular"
}


效果图
在这里插入图片描述

发布了84 篇原创文章 · 获赞 13 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_43149049/article/details/102994688