博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【Shader】利用mask图片中的不同颜色通道改变模型显示
阅读量:4088 次
发布时间:2019-05-25

本文共 2707 字,大约阅读时间需要 9 分钟。

Shader "Unlit/MaskNormalTex"{    Properties    {        _MainTex ("Texture", 2D) = "white" {}        _MainNormalTex("NormalTex",2D) = "bump"{}        _Mask("Mask",2D) = "white"{}    }    SubShader    {        Tags { "RenderType"="Opaque" }        LOD 100        Pass        {            Tags{                "LightMode"="ForwardBase"            }            CGPROGRAM            #pragma vertex vert            #pragma fragment frag            #include "UnityCG.cginc"            #include "Lighting.cginc"            struct a2v            {                float4 vertex : POSITION;                float2 uv : TEXCOORD0;                float3 normal:NORMAL;                float4 tangent:TANGENT;            };            struct v2f            {                float4 uv : TEXCOORD0;                float4 vertex : SV_POSITION;                float3 lightDir : TEXCOORD1;                float3 viewDir : TEXCOORD2;            };            sampler2D _MainTex;            float4 _MainTex_ST;            sampler2D _MainNormalTex;            float4 _MainNormalTex_ST;            // 添加遮罩图片            sampler2D _Mask;            v2f vert (a2v v)            {                v2f o;                o.vertex = UnityObjectToClipPos(v.vertex);                // 缩放+偏移                o.uv.xy = TRANSFORM_TEX(v.uv,_MainTex);                o.uv.zw = TRANSFORM_TEX(v.uv,_MainNormalTex);                // 构造切线空间,此处需要计算副切线才能使用float2x3矩阵构造                // 新的切线空间名字是:rotation                TANGENT_SPACE_ROTATION;                o.lightDir = mul(rotation,ObjSpaceLightDir(v.vertex ));                o.viewDir = mul(rotation,ObjSpaceViewDir(v.vertex));                return o;            }            fixed4 frag (v2f i) : SV_Target            {                fixed3 tangentLightDir = normalize(i.lightDir);                fixed3 tangentViewDir = normalize(i.viewDir);                fixed4 packedNormal = tex2D(_MainNormalTex,i.uv.zw);                fixed3 tangentNormal = UnpackNormal(packedNormal);                // tangentNormal.z = sqrt(1-saturate(dot(tangentNormal.xy,tangentNormal.xy)));                float3 albedo = tex2D(_MainTex,i.uv.xy).rgb;                fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT;                fixed3 diffuse = _LightColor0.rgb  * albedo* max(0,dot(tangentNormal,tangentLightDir));                // 可利用mask图片不同通道中的不同属性来改版模型的显示,此处只使用了r通道                fixed maskValue = tex2D(_Mask,i.uv.xy).r;                fixed3 halfDir = normalize(tangentLightDir+tangentViewDir);                fixed3 specular = _LightColor0.rgb *  pow(max(0,dot(tangentNormal,halfDir)),20) * maskValue;                return fixed4( diffuse+ambient+specular,1.0);            }            ENDCG        }    }}

转载地址:http://idkii.baihongyu.com/

你可能感兴趣的文章
React Native for Android 发布独立的安装包
查看>>
React Native应用部署/热更新-CodePush最新集成总结(新)
查看>>
react-native-wechat
查看>>
基于云信的react-native聊天系统
查看>>
网易云音乐移动客户端Vue.js
查看>>
ES7 await/async
查看>>
ES7的Async/Await
查看>>
React Native WebView组件实现的BarCode(条形码)、(QRCode)二维码
查看>>
每个人都能做的网易云音乐[vue全家桶]
查看>>
JavaScript专题之数组去重
查看>>
Immutable.js 以及在 react+redux 项目中的实践
查看>>
Vue2.0全家桶仿腾讯课堂(移动端)
查看>>
React+Redux系列教程
查看>>
react-native 自定义倒计时按钮
查看>>
19 个 JavaScript 常用的简写技术
查看>>
ES6这些就够了
查看>>
微信小程序:支付系列专辑(开发指南+精品Demo)
查看>>
iOS应用间相互跳转
查看>>
iOS开发之支付宝集成
查看>>
iOS开发 支付之银联支付集成
查看>>