当前位置:网站首页>遮罩纹理-MaskTexture
遮罩纹理-MaskTexture
2022-08-09 00:08:00 【ThomasQxx】
遮罩纹理
//所谓的遮罩纹理和渐变纹理是类似的
//渐变纹理就是希望光照部分不要对所有的部分都一模一样 而是变换的
//遮罩纹理就是希望高光部分不要都一模一样 而是高光部分各有不同
Shader "QStudyShader/MaskTexture"
{
Properties
{
_MainTex("Main Texture",2D) = "white"{
}
_BaseColor("Base Color",Color) = (1.0,1.0,1.0,1.0)
_MaskTex("Mask Texture",2D) = "mask"{
}
_Gloss("Gloss",Range(8.0,200.0)) = 20.0
_BumpMap("BumpMap",2D) = "Bump"{
}
}
SubShader{
Pass{
Tags{
"LightModel" = "ForwardBase"}
CGPROGRAM
#include "Lighting.cginc"
#pragma vertex Vertex
#pragma fragment Fragment
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;
};
sampler2D _MainTex;
sampler2D _BumpMap;
fixed4 _BaseColor;
float _Gloss;
sampler2D _SpecularMask;
v2f Vertex(a2v v) {
v2f o;
o.pos = UnityObjectToClipPos(v.vertex);
TANGENT_SPACE_ROTATION;
o.lightDir = mul(rotation, ObjSpaceLightDir(v.vertex)).xyz;
o.viewDir = mul(rotation, ObjSpaceViewDir(v.vertex)).xyz;
return o;
}
//所谓的遮罩纹理和渐变纹理是类似的
//渐变纹理就是希望光照部分不要对所有的部分都一模一样 而是变换的
//遮罩纹理就是希望高光部分不要都一模一样 而是高光部分各有不同
fixed4 Fragment(v2f i) : SV_TARGET{
fixed3 tangentLightDir = normalize(i.lightDir);
fixed3 tangentViewDir = normalize(i.viewDir);
fixed3 tangentNormal = UnpackNormal(tex2D(_BumpMap, i.uv));
tangentNormal.z = sqrt(1.0 - saturate(dot(tangentNormal.xy, tangentNormal.xy)));
//对主纹理进行混合
fixed3 albedo = tex2D(_MainTex, i.uv).xyz * _BaseColor.xyz;
//环境光混合
fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz * albedo;
//漫反射
fixed3 diffuse = _LightColor0.xyz * albedo * max(0, dot(tangentNormal, tangentLightDir));
//半程向量 用于计算高光
fixed3 halfDir = normalize(tangentLightDir + tangentViewDir);
//遮罩纹理进行采样
fixed3 specularMask = tex2D(_SpecularMask,i.uv).r;
//和高光混合
fixed3 specular = _LightColor0.xyz * specularMask * pow(max(dot(tangentNormal, halfDir), 0), _Gloss);
return fixed4(diffuse + ambient + specular, 1.0);
}
ENDCG
}
}
}
边栏推荐
- 蓝桥杯历届试题-高僧斗法(博弈论)
- ES6入门基础知识
- After the sessionStorage value is changed, the value obtained by the page using window.sessionStorage.getItem() will not be updated
- 2021.10.7 2020 CCPC重现赛
- 判断输入的信息是否为空,如果为空,提示信息
- MVC与MVP的区别
- Idea碰到的问题总结
- Ubuntu下Docker安装Redis (快速简便)
- AutoX安途杯中山大学程序设计校赛(同步赛)
- 将板子芯片从ST32F101改为STM32F103要改的地方
猜你喜欢
随机推荐
【StoneDB Class】入门第三课:StoneDB 的安装编译
如何升级穿越派V3.14版本?
Ubuntu下Docker安装Mysql (快速简便)
牛客多校8 补题
将板子芯片从ST32F101改为STM32F103要改的地方
随笔-2018.4.3
Mysql Workbench导出sql文件出错:Error executing task: ‘ascii‘ codec can‘t decode byte 0xd0 in position 26:
Anaconda 使用 Navigator 安装 Tensorflow(包括 Anaconda 安装)
自学FPGA:Verilog基本语法规则(一)
矩阵乘法总结
Flutter -自定义日历组件
穿越派(v3.14)版本可以试用啦!
牛客小白月赛 37 补题
C#中构造函数的作用
《MySQL入门很轻松》第3章:数据库的创建与操作
C--《C和指针》第8章读书笔记之多维数组
第四章 SQL与关系数据库基本操作(下)
Canvas绘图基础知识
C# 如何关联键盘按钮 (KeyChar/KeyCode值 KeyPress/KeyDown事件 区别)
基于单片机测量空气粘滞系数方案