这里对里面的一些设置的知识点给出比较详细的参考链接
[Shader]渲染Image,ZWrite Off ZTest Always的理解
下面给出的是纯透明知识点的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"
}
效果图