Unity使用Shader控制物体材质的透明度(Lambert版和非光照版)
2015-06-23 15:21
567 查看
<pre name="code" class="cpp">Shader "Custom/MyShader_Two" { Properties { _MainTex ("Base (RGB)", 2D) = "white" {} //接收的纹理 _TransVal ("Transparency Value", Range(0,1)) = 1 //透明度的值 _ColorTint("Shine(RGB)",color) = (1,1,1,1)//增强颜色 } SubShader { Tags { "RenderType"="Opaque" "Queue"="Transparent"} CGPROGRAM //声明使用兰伯特光照模型,并且最后会使用setcolor设置颜色 #pragma surface surf Lambert alpha finalcolor:setcolor //声明三种对应参数 sampler2D _MainTex; float _TransVal; float4 _ColorTint; //输入参数 struct Input { float2 uv_MainTex; }; //声明颜色处理函数 void setcolor (Input IN, SurfaceOutput o, inout fixed4 color) { //将自选的颜色值乘给color color *= _ColorTint; } //surf函数,处理部分 void surf (Input IN, inout SurfaceOutput o) { half4 c = tex2D (_MainTex, IN.uv_MainTex); o.Albedo = c.rgb; //处理颜色 o.Alpha = c.a * _TransVal;//处理透明度 } ENDCG } FallBack "Diffuse" }
以上是使用光照模型情况下的shader,这种shader可以调整透明度,但是会接收光照,这次的需求是需要不接受光照的,于是我采用如下办法
<pre name="code" class="cpp">Shader "Custom/MyShader_Two" { Properties { _MainTex ("Base (RGB)", 2D) = "white" {} _Color("Color",Color) = (1,1,1,1) } SubShader { Tags { "RenderType"="Queue" "Queue"="Transparent"} // "Queue"="Transparent"将其设置为透明,不然无法看见后面的东西(即使透明) Blend SrcAlpha OneMinusSrcAlpha //实现Alpha的核心,使用语句进行Alpha混合 Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" sampler _MainTex; //float4 _MainTex_ST; 使用TRANSFORM_TEX必备 float4 _Color; struct v2f { float4 pos : POSITION; float2 uv : TEXCOORD0; float3 color : TEXCOORD1; }; v2f vert(appdata_base v) { v2f o; o.pos = mul(UNITY_MATRIX_MVP, v.vertex); //TRANSFORM_TEX是在_MainTex_ST中的宏 //原始方法o.uv = TRANSFORM_TEX(v.texcoord, _MainTex); //将uv贴图的坐标取出来 o.uv = v.texcoord; //o.color = ShadeVertexLights(v.vertex, v.normal);取得法线贴图的光照 return o; } float4 frag(v2f i) : COLOR { half4 c = tex2D(_MainTex, i.uv); //在这个位置接收i.color的话可以接收光照 c.rgb = c.rgb * _Color; return c*_Color; } ENDCG } } FallBack "Diffuse" }
这段代码有详细注释,如有错误,欢迎讨论。
相关文章推荐
- unity实现多点触控代码
- 在Unity中实现动画的正反播放代码
- unity实现摄像头跟随
- Unity3D上路_01-2D太空射击游戏
- Unity3D上路_02-第一视角射击游戏
- Unity3D上路_03-塔防游戏
- Unity3D上路_04-基础资源介绍
- Unity3D上路_05-网络相关
- [软件资讯]Unity已支持将3D游戏导出成Flash
- Unity 武器拖尾效果
- unity常见问题之20题
- 反编译ARB program to GLSL shader日记
- Unity3D动画存储插件
- unity 赛车相机跟随物体移动
- 虚幻3引擎
- Unity 预编译宏
- 基于顶点纹理的无限大海水仿真
- VS2013中 命名空间“UnityEngine”中不存在类型或命名空间名称“UI”。是否缺少程序集引用?
- 图形加速卡技术 [专业的基础技术文章]
- 关于VR(主要是虚拟城市场景)的一些想法及实现(可能会连载)