shader入门9 遮罩纹理

本文介绍如何使用遮罩纹理精确控制光照强度,通过Shader代码实现高光反射的增强或减弱效果,展示了一种精细调整光照的技术方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简介

遮罩纹理为了更准确的控制某些区域的光照强弱
对遮罩纹理采样,得到每个点的值,用这个值与高光反射的补偿相乘
如果为0则没有效果,不为0时有增强或者减弱的效果

代码


Shader "Custom/NewSurfaceShader"
{
	Properties{
		_Color("Color",Color) = (1,1,1,1)//贴图颜色
		_MainTex("Main Tex",2D) = "white"{}//贴图纹理
		_Sepcular("Sepcular",Color)=(1,1,1,1)//高光反射颜色
		_SepcularMask("SepcularMask",2D) = "white"{}//高光遮罩纹理
		_SepcularScale("SepcularScale",Float) = 1.0//遮罩系数
		_BumpTex("BumpTex", 2D) = "white"{}//法线纹理
		_BumpScale("BumpScale", Range(1, 20)) = 1//凹凸系数
		_Gloss("Gloss", Range(8.0, 256)) = 20//光泽度
	}
	SubShader
	{
		pass {
			Tags{ "LightMode" = "ForwardBase" }
			CGPROGRAM
			#include "Lighting.cginc"
			#pragma vertex vert
			#pragma fragment frag
			fixed4 _Color;//贴图颜色
			sampler2D _MainTex;//贴图纹理
			fixed4 _MainTex_ST;//渐变纹理的缩放与偏移
			fixed4 _Sepcular;//高光反射颜色
			sampler2D _SepcularMask;//遮罩纹理
			sampler2D _BumpTex;//法线纹理
			float _BumpScale;//凹凸系数
			float _SepcularScale;//遮罩系数
			float _Gloss;//光泽度
			struct a2v {
				float4 vertex:POSITION;//赋值模型空间顶点位置
				float3 normal:NORMAL;//赋值模型空间法线
				float4 tangent: TANGENT;//切线
				float4 texcoord:TEXCOORD0;//第一张贴图
			};
			struct v2f {
				float4 position:SV_POSITION;//输出的屏幕位置
				float3 lightDir: TEXCOORD0;//环境光方向
				float3 viewDir : TEXCOORD1;//观察方向
				float2 uv:TEXCOORD2;//贴图纹理的uv
			};
			v2f vert(a2v v) {
				v2f f;
				f.position = UnityObjectToClipPos(v.vertex);//剪裁空间的位置
				f.uv = TRANSFORM_TEX(v.texcoord, _MainTex);//贴图纹理的uv + 缩放平移
				TANGENT_SPACE_ROTATION;//利用unity自带的宏 来计算模型空间变换到切线空间的矩阵rotation
				f.lightDir = mul(rotation,ObjSpaceLightDir(v.vertex)).xyz ;//光方向
				f.viewDir = mul(rotation,ObjSpaceViewDir(v.vertex)).xyz;//观察方向
				return f;
			}
			fixed4 frag(v2f f) :SV_Target{
				fixed3 tangentLightDir = normalize(f.lightDir);//切线空间下的光方向
				fixed3 tangentViewDir = normalize(f.viewDir);//切线空间下的观察方向
				fixed3 tangentNormal = UnpackNormal(tex2D(_BumpTex,f.uv));//默认法线贴图就是切线空间下的 映射回法线
				tangentNormal.xy *= _BumpScale;
				tangentNormal.z = sqrt(1-saturate( dot(tangentNormal.xy,tangentNormal.xy) ) );//计算z轴分量
				fixed3 albedo = tex2D(_MainTex, f.uv).rgb*_Color.rgb;//贴图颜色
				fixed3 ambient = albedo * UNITY_LIGHTMODEL_AMBIENT.xyz;//环境光
				fixed3 diffuse = _LightColor0.rgb*albedo * max(0,dot(tangentLightDir,tangentNormal));//漫反射 兰伯特模型
				fixed3 halfDir = normalize(tangentViewDir + tangentLightDir);//h方向
				fixed specularMask = tex2D(_SepcularMask, f.uv).r * _SepcularScale;//遮罩程度
				fixed3 specular = _LightColor0.rgb * _Sepcular.rgb * pow(max(dot(halfDir, tangentNormal), 0), _Gloss)* specularMask;//h方向与法线的夹角决定高光补偿
				return fixed4(diffuse + specular + ambient, 1);//最终效果
			}
			ENDCG
		}
	}
	FallBack "Diffuse"
}

效果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值