Unity Shader案例04-------透明
Posted clf125800
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity Shader案例04-------透明相关的知识,希望对你有一定的参考价值。
Shader "CLF/SetTransparent" 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"
以上是关于Unity Shader案例04-------透明的主要内容,如果未能解决你的问题,请参考以下文章
浅墨Unity3D Shader编程之十三 单色透明Shader & 标准镜面高光Shader
Unity Shader ------ 透明效果之半透明效果的实现及原理