UnityShader案例(八)——透明效果(1)
来源:互联网 发布:祁县哪个宽带网络好 编辑:程序博客网 时间:2024/06/06 04:48
一、实现原理
透明度测试:它采用一种这样一种机制,只要一个片元的透明度不满足条件(通常是小于某个阈值),那么它对应的片元就会舍弃。被舍弃的片元将不会进行任何的处理,也不会对颜色缓冲产生任何影响;否则,就会按照普通的不透明的物体来处理它,即进行深度测试。
通常我们就是根据这个原理来实现透明效果的,我们会在片元着色器中使用clip函数来进行透明度测试。Clip是CG中的一个函数。
二、代码实现
Shader "Custom/Transparent/AlphaTest"{ Properties { _MainTex ("Texture", 2D) = "white" {} _Color("Color",Color)=(1,1,1,1) _Cutoff("AlphaTest",Range(0,1))=0.5 } SubShader { Tags { "Queue"="AlphaTest" "IgnoreProjector"="True" "RenderType"="TransparentCutout" } LOD 100 Pass { Tags{"LightMode"="ForwardBase"} CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" #include "Lighting.cginc" #include "AutoLight.cginc" sampler2D _MainTex; fixed4 _Color; float4 _MainTex_ST; fixed _Cutoff; struct appdata { float4 vertex : POSITION; float4 uv : TEXCOORD0; float3 normal:NORMAL; }; struct v2f { float2 uv : TEXCOORD0; float3 worldNormal:TEXCOORD1; float3 worldPos:TEXCOORD2; float4 vertex : SV_POSITION; }; v2f vert (appdata v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); o.worldNormal=UnityObjectToWorldNormal(v.normal); o.worldPos=mul(unity_ObjectToWorld,v.vertex); o.uv = TRANSFORM_TEX(v.uv, _MainTex); return o; } fixed4 frag (v2f i) : SV_Target { float3 worldNormal=normalize(i.worldNormal); float3 worldLightDir=normalize(UnityWorldSpaceLightDir(i.worldPos)); fixed4 col = tex2D(_MainTex, i.uv); clip(col.a-_Cutoff); fixed3 albedo=col.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"}
纹理图片,每一块的纹理的Alpha值各不相同
三、代码详解
1、变量属性_Cutoff参数用于决定我们调用clip进行透明度测试时使用的判断条件,它的范围在0到1之间,这是因为纹理的像素的透明度就是在此范围之间。
2、在Unity中透明度测试使用的渲染队列是名为AlphaTest的队列,因此我们需要把Queue标签设置为AlphaTest,而RenderType标签可以让Unity把这个Shader归入到提前定义的组(TransparentCutout组)中,以指明该shader是一个透明度测试的shader。RenderType通常被用于着色器替换功能。我们还把IgnoreProjector设置为true,这意味着这个shader不会受投影器的影响。
阅读全文
0 0
- UnityShader案例(八)——透明效果(1)
- UnityShader案例(九)——透明效果(2)
- UnityShader案例(一)——漫反射
- UnityShader案例(二)——Phong高光反射
- UnityShader案例(三)——BlinnPhong高光反射
- UnityShader案例(四)——单张纹理
- UnityShader案例(五)——法线纹理
- UnityShader案例(六)——渐变纹理
- UnityShader案例(七)——遮罩纹理
- unity shader学习笔记(八)——Unity中的透明效果之透明测试
- unityShader之遮挡透明效果
- UnityShader官方案例讲解——SurfaceShader(1)
- UnityShader学习笔记(1)
- UnityShader官方案例讲解——SurfaceShader(2)
- UnityShader官方案例讲解——SurfaceShader(3)
- UnityShader官方案例讲解——SurfaceShader(4)
- 【UnityShader】设置Image组件图片透明四个方向透明渐变(Sprite原理相同)
- UnityShader入门精要学习笔记(十):透明效果-上部分
- hdoj 1846
- 编写自己的javascript框架
- 面试题28:字符串的排列
- ajax 设置Access-Control-Allow-Origin实现跨域访问
- 获取UIAlertController中textField的值
- UnityShader案例(八)——透明效果(1)
- IntelliJ IDEA上创建Maven Spring MVC项目
- 二、stormkafka之ZkBrokerReader
- VS2015+VisualGDB真机调试NativieAndroid工程
- 江windows盘挂载到ubuntu下
- hdoj 2000
- 如何生成KeyStore
- 单KEY业务,数据库水平切分架构实践 | 架构师之路
- okHttp工具类,实现get和post