Unity 使用一张贴图来控制材质主贴图的透明度

最近有个需求:通过一张贴图的颜色值来控制材质主贴图的透明度。

先做一个注明:用来控制主贴图透明度的贴图,我们暂且称之为“Alpha贴图”;主贴图就叫“主贴图”。

首先,我们需要解决的是将Alpha贴图的颜色值转化成透明度;经过多方测试,最终采用了以下方法:1)比较像素点的r、g、b;2)假设r最大,则float val = r*权重+g+b;3)alpha = val/(权重+2)

直接上代码:

Shader "Custom/MainTexAlphaCtrl"
{
	Properties
	{
		_MainTex("Texture", 2D) = "white" {}//主贴图纹理
		_AlphaTex("AlphaTexture",2D) = "white"{}//Alpha纹理
		_BaseColor("Base Color",Color) = (1, 1, 1, 1)
		_Weight("Weight",float) = 0//Alpha计算时的权重
		[Toggle(_Reverse)] _Reverse("Reverse", float) = 0//是否取反,用于主贴图的透明度计算
	}
		SubShader
		{
		Tags { "RenderType" = "Transparent"}
			LOD 100
			Cull Off
			//如果使用Alpha混合,需要关闭深度缓冲写入
			ZWrite Off
			//添加混合命令
			Blend SrcAlpha OneMinusSrcAlpha

			Pass
			{
				CGPROGRAM
				#pragma vertex vert
				#pragma fragment frag
				// make fog work
				#pragma multi_compile_fog

				#include "UnityCG.cginc"

				struct appdata
				{
					float4 vertex : POSITION;
					float2 uv : TEXCOORD0;
				};

				struct v2f
				{
					float2 uv : TEXCOORD0;
					float4 vertex : SV_POSITION;
				};

				sampler2D _MainTex;
				sampler2D _AlphaTex;
				float4 _MainTex_ST;
				float4 _BaseColor;
				float _Weight;
				float _Reverse;

				
				v2f vert(appdata v)
				{
					v2f o;
					o.vertex = UnityObjectToClipPos(v.vertex);
					o.uv = TRANSFORM_TEX(v.uv, _MainTex);
					return o;
				}

				//将颜色值转化成透明度
				float color2Alpha(fixed3 col)
				{
					float a = 0;
					float val = 0;
					//比较r、g、b三个值,得到最大值,如果r最大,则val = 4*r+g+b;
					if (col.r > col.g)
					{
						if (col.r > col.b)
						{
							val = _Weight * col.r + col.g + col.b;
						}
						else
						{
							val = _Weight * col.b + col.g + col.r;
						}
					}
					else
					{
						if (col.g > col.b)
						{
							val = _Weight * col.g + col.r + col.b;
						}
						else
						{
							val = _Weight * col.b + col.g + col.r;
						}
					}
					//然后val除以(权重+2),得到最终alpha值
					return val / (_Weight+2);
					//return (col.r + col.g + col.b)/3;
				}

				fixed4 frag(v2f i) : SV_Target
				{
					// sample the texture
					fixed4 main_col = tex2D(_MainTex, i.uv) * _BaseColor;
					fixed3 alpha_col = tex2D(_AlphaTex, i.uv).rgb;
					if (_Reverse == 0)
					{
						return fixed4(main_col.rgb, main_col.a * color2Alpha(alpha_col));
					}
					else
					{
						return fixed4(main_col.rgb, main_col.a * (1 - color2Alpha(alpha_col)));
					}
				}
				ENDCG
			}
		}
}

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Unity中的材质球和贴图是用来控制物体的外观和质感的。材质球(Material)定义了物体看起来是什么做的,而贴图(Texture)则是材质球的一部分,用于给物体表面添加纹理和颜色。着色器(Shader)是一小段程序,负责将输入的网格以指定的方式和输入的贴图或者颜色等组合作用,输出最终的渲染结果。 Unity中的材质球文件后缀名为.mat,你可以在Assets中建立“Materials”文件夹来存放材质球。在创建材质球后,你可以编辑其属性,如调整颜色、透明度、光照反射等。然后,直接将材质球拖放到物体上,即可应用该材质球。 贴图材质球的一部分,用于给物体表面添加纹理和颜色。你可以在Assets中建立“Textures”文件夹来存放贴图贴图文件可以是常见的图片格式,如.jpg、.png等。在编辑材质球时,你可以将贴图文件拖放到相应的属性上,从而将纹理和颜色应用到物体表面。 在使用贴图时,你可以使用tiling缩放来调整贴图在物体表面的重复次数。通过改变tiling的值,你可以控制贴图在UV坐标上的缩放倍数,从而调整贴图的大小和密度。 总结来说,Unity中的材质球和贴图是用来控制物体外观和质感的重要组成部分。材质球定义了物体看起来是什么做的,而贴图则用于给物体表面添加纹理和颜色。你可以在Assets中创建“Materials”和“Textures”文件夹来方便地管理材质球和贴图。编辑材质球时,可以调整其属性和应用贴图文件。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Unity3D超700+材质球&贴图](https://download.csdn.net/download/jhcht/10386117)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [Unity3D基础3:贴图材质球](https://blog.csdn.net/Jaihk662/article/details/86746756)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [【瑞模网】Unity3D基础:贴图材质球](https://blog.csdn.net/rrmod/article/details/128883169)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值