Unity Shader实现纹理遮罩效果实现纹理遮罩效果
主要为大家详细介绍了Unity Shader实现纹理遮罩效果,文中示例代码介绍的非常详细,具有一定的参考价值,
感兴趣的小伙伴们可以参考一下
纹理遮罩用处很多,简单来讲就是允许我们可以保护模型中的某些区域不受某些因素的影响。纹理遮罩用处很多,简单来讲就是允许我们可以保护模型中的某些区域不受某些因素的影响。例如我们有时希望模型表面某些
区域的反光强烈一些,而某些区域弱一些。为了得到更加细腻的结果,我们需要用一张遮罩纹理来控制该光照。还有一些情况
就是某些模型需要多张纹理混合时,此时使用遮罩纹理可以控制如何混合这些纹理。
具体流程为:具体流程为:通过采样得到遮罩纹理的纹素值,然后使用其中某个或者几个通道的值来与某种表面属性进行相乘。当该通道的
值为0时,此时该表面属性不受遮罩纹理的影响。
shader代码如下:
Shader "Custom/MaskTexture"
{
Properties
{
_Color ("Color", Color) = (1,1,1,1)
_MainTex ("Main Tex", 2D) = "white" {}
_BumpMap("Normal Map", 2D) = "white" {}
_BumpScale("Bump Scale", Float) = 1.0
_SpecularMask("Specular Mask", 2D) = "white" {}
_SpecularScale("Specular Scale", Float) = 1.0
_Specular("Specular", Color) = (1,1,1,1)
_Gloss("Gloss", Range(8.0, 256)) = 20
}
SubShader
{
Pass
{
Tags{"LightMode" = "ForwardBase"}
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
#include "Lighting.cginc"
fixed4 _Color;
sampler2D _MainTex;
float4 _MainTex_ST; //纹理变量名+_ST为unity内置宏,存储了该纹理的缩放大小和偏移量,分别对应.xy和.zw属性
sampler2D _BumpMap;
float _BumpScale; //控制凹凸程度的变量
sampler2D _SpecularMask; //遮罩纹理
float _SpecularScale; //控制遮罩纹理的可见度
fixed4 _Specular;
float _Gloss;
struct a2v {
float4 vertex : POSITION;
float3 normal : NORMAL;
float4 tangent : TANGENT;
float4 texcoord : TEXCOORD0;
};
struct v2f {
float4 pos : SV_POSITION;
float2 uv : TEXCOORD0;
float3 lightDir : TEXCOORD1;
float3 viewDir : TEXCOORD2;
};
v2f vert(a2v v)
{
v2f o;
o.pos = UnityObjectToClipPos(v.vertex);
//将_MainTex纹理信息(缩放大小和偏移量以及坐标信息)存储到o.uv.xy中
o.uv.xy = v.texcoord.xy * _MainTex_ST.xy + _MainTex_ST.zw;
//unity内置宏,计算并得到从模型空间到切线空间的变换矩阵rotation
TANGENT_SPACE_ROTATION;
//获取切线空间下的光照方向
o.lightDir = mul(rotation, ObjSpaceLightDir(v.vertex)).xyz;
//获取切线空间下的视角方向
评论0