Unity之Shader过滤掉不带Alpha通道贴图的背景颜色 - 四
来源:互联网 发布:windows 文件搜索工具 编辑:程序博客网 时间:2024/05/21 19:35
过滤掉不带Alpha通道贴图的黑色背景颜色,屏蔽掉光照影响(改变光源的颜色模型贴图颜色不受影响)
代码如下
方法一
Shader "Custom/NewShader2" { Properties { _MainTex ("Base (RGB)", 2D) = "white" {} _TransVal ("Transparency Value", Range(0,10)) = 1.0 } SubShader { Tags { "RenderType"="Opaque" "Queue"="Transparent"} LOD 200 Lighting Off Blend One OneMinusSrcAlpha CGPROGRAM #pragma surface surf Lambert sampler2D _MainTex; float _TransVal; struct Input { float2 uv_MainTex; }; void surf (Input IN, inout SurfaceOutput o) { half4 c = tex2D (_MainTex, IN.uv_MainTex); o.Albedo = c.rgb; o.Emission = tex2D (_MainTex, IN.uv_MainTex); o.Alpha = (c.r + c.g + c.b) *_TransVal; } ENDCG } }
下面对代码的注释比较详细
Shader "Custom/NewShader2" { Properties { // 一个图片贴图 _MainTex ("Base (RGB)", 2D) = "white" {} //定义一个范围为 0 - 10 的滑动条 _TransVal ("Transparency Value", Range(0,10)) = 1.0 } SubShader { // 渲染类型为 Opaque 渲染队列为 Transparent 透明 Tags { "RenderType"="Opaque" "Queue"="Transparent"} LOD 200 //关闭掉光照,模型贴图不再受光照影响, //如果需要光照影响可以不写或者 Liginting On Lighting Off // 混合方式 Blend One OneMinusSrcAlpha //下面说下 Blend 包含的混合方式 //One 值为1,使用此因子来让帧缓冲区源颜色或是目标颜色完全的通过。 //Zero 值为0,使用此因子来删除帧缓冲区源颜色或目标颜色的值。 //SrcColor 使用此因子为将当前值乘以帧缓冲区源颜色的值 //SrcAlpha 使用此因子为将当前值乘以帧缓冲区源颜色Alpha的值。 //DstColor 使用此因子为将当前值乘以帧缓冲区目标颜色的值。 //DstAlpha 使用此因子为将当前值乘以帧缓冲区目标颜色Alpha分量的值。 //OneMinusSrcColor 使用此因子为将当前值乘以(1 -帧缓冲区源颜色值) //OneMinusSrcAlpha 使用此因子为将当前值乘以(1 -帧缓冲区源颜色Alpha分量的值) //OneMinusDstColor 使用此因子为将当前值乘以(1 –目标颜色值) //OneMinusDstAlpha 使用此因子为将当前值乘以(1 –目标Alpha分量的值) CGPROGRAM //下面自定义了一个 函数 surf 系统会自动调用, //我们只需在下面写出 surf的实现即可 // Lambert 是系统自带的一个光照函数 Lambert, //不用我们写他的实现 #pragma surface surf Lambert // 在 Unity安装目录下 Editor/Data/CGIncludes/Lighting.cginc //文件中,是这样实现 Lambert函数的 /* inline fixed4 LightingLambert (SurfaceOutput s, fixed3 lightDir, fixed atten) { //对漫反射进行计算 fixed diff = max (0, dot(s.Normal, lightDir)); fixed4 col; //下面计算了物体表面的纹理颜色、光源颜色以及光源强度的影响 col.rgb = s.Albedo * _LithgColor0.rgb * (diff * atten * 2); col.a = s.Alpha; return col; } */ sampler2D _MainTex; float _TransVal; struct Input { float2 uv_MainTex; }; void surf (Input IN, inout SurfaceOutput o) { // 计算贴图颜色 half4 c = tex2D (_MainTex, IN.uv_MainTex); o.Albedo = c.rgb; // 将贴图颜色赋值给自发光 o.Emission = tex2D (_MainTex, IN.uv_MainTex); //设置Alpha的值 // 由于我的目的是过滤掉黑色背景,黑色的 rgb值分别为(0, 0, 0) //所以 三者相加为 0 的位置 Alpha设置为 0 o.Alpha = (c.r + c.g + c.b) *_TransVal; } ENDCG } }
方法二、代码和方法一基本相同不做过多解释
Shader "Custom/NewShader1" { Properties { _MainTex ("Base (RGB)", 2D) = "white" {} _TransVal ("Transparency Value", Range(0,10)) = 1.0 } SubShader { Tags { "RenderType"="Opaque" "Queue"="Transparent"} LOD 200 Lighting Off CGPROGRAM //在此我自定义了 Lambe 不使用系统自带的光照方法 //另外 在最后加了 alpha #pragma surface surf Lambe alpha sampler2D _MainTex; float _TransVal; struct Input { float2 uv_MainTex; }; void surf (Input IN, inout SurfaceOutput o) { half4 c = tex2D (_MainTex, IN.uv_MainTex); o.Albedo = c.rgb; o.Emission = tex2D (_MainTex, IN.uv_MainTex); o.Alpha = (c.r + c.g + c.b) *_TransVal; } inline float4 LightingLambe(SurfaceOutput s, fixed3 lightDir, fixed atten) { return (0, 0, 0, 0); } ENDCG } FallBack "Diffuse"}
效果如下
在材质中选择该shader
然后选择贴图
贴图选择如下
在世界中的显示如下
0 0
- Unity之Shader过滤掉不带Alpha通道贴图的背景颜色 - 四
- Unity之Shader Pass 通道显示贴图的几种方法- 六
- Unity工程里图片的RGB和Alpha通道的分离,以及显示所有带有Alpha通道贴图的Material
- Unity工程里图片的RGB和Alpha通道的分离,以及显示所有带有Alpha通道贴图的Material
- Directx 2D的alpha 通道贴图
- 创建带alpha通道的贴图
- Unity Shader (四)Alpha测试(alpha test)
- 拆分贴图的Alpha通道 --对抗ETC1的原罪
- 拆分贴图的Alpha通道 --对抗ETC1的原罪
- unity shader 贴图流动
- 【猫猫的Unity Shader之旅】之法线贴图的运用
- backgroundColor的背景颜色alpha透明度设置
- unity游戏优化之ETC压缩和 Alpha通道处理
- unity游戏优化之ETC压缩和 Alpha通道处理
- unity游戏优化之ETC压缩和 Alpha通道处理
- 在shader中加透明贴图(拆分a通道贴图)的问题
- unity中基于alpha通道的shadow volume实现
- 移除Unity工程里所有图片的Alpha通道
- 解决IE下select标签内文字不居中的文字(垂直),input元素不居中
- 海盗比酒量--蓝桥杯
- 第六周 项目一(1):深复制体验
- 抓取网页
- ns3 (ns-3)在CentOS的安装
- Unity之Shader过滤掉不带Alpha通道贴图的背景颜色 - 四
- django中模型的简单操作
- ubuntu 12.10的开机模式设置
- 微生物增值--蓝桥杯
- win764位Oracle11g64位下使用PLSQLDeveloper的解决办法
- java实现在线预览doc,txt,ppt,xls等文档,用到了libreOffice,openOffice,SWFTools,JODConverter,flexPaper
- PHP中使用hidef扩展代替define提高性能
- 设置页面滚动条
- 实现全选的功能