钢铁侠材质制作——5、多种效果过渡的制作

news/2024/11/23 20:51:03/

钢铁侠Unlit光照Shader,三种效果变化

返回目录

在这里插入图片描述

大家好,我是阿赵。这里是钢铁侠材质制作的第五部分,多种效果过渡的制作。
通过了之前的步骤,我已经基本实现完了整个shader的效果,它包括了3部分的效果:
1、光线轮廓模型
在这里插入图片描述

2、固有色模型
在这里插入图片描述

3、添加完整光照模型的效果
在这里插入图片描述

接下来要做最后一步,通过一个值的控制,实现这三种效果的切换。
在这里插入图片描述

在这里插入图片描述

先整理一下之前的代码:

float3 worldViewDir = normalize(UnityWorldSpaceViewDir(i.worldPos));float NdotV = dot(i.worldNormal, worldViewDir);float fresnelVal = pow((1 - NdotV)*_RimBias, _RimPow);float2 noiseUV = i.worldPos.xy *_NoiseTiling.xy + _NoiseTiling.zw;noiseUV.y += frac(_Time.y)*_NoiseSpeed;float4 noiseCol = tex2D(_NoiseMap, noiseUV);//第一种效果,光线轮廓half4 RimLineRGBA = _RimlCol * (fresnelVal+noiseCol.r);half4 RimRGBA = _RimlCol * fresnelVal*_RimAddStength;//第二种效果,固有色half4 baseCol = tex2D(_MainTex,i.uv);half4 normalCol = tex2D(_NormalMap, i.uv);//得到切线空间的法线方向half3 normalVal = UnpackScaleNormal(normalCol, _NormalScale).rgb;//构建TBN矩阵float3 tanToWorld0 = float3(i.worldTangent.x, i.worldBitangent.x, i.worldNormal.x);float3 tanToWorld1 = float3(i.worldTangent.y, i.worldBitangent.y, i.worldNormal.y);float3 tanToWorld2 = float3(i.worldTangent.z, i.worldBitangent.z, i.worldNormal.z);//通过切线空间的法线方向和TBN矩阵,得出法线贴图代表的物体世界空间的法线方向float3 worldNormal = float3(dot(tanToWorld0, normalVal), dot(tanToWorld1, normalVal), dot(tanToWorld2, normalVal));float diffuseVal = GetHalfLambertDiffuse(i.worldPos, worldNormal);float4 specMaskVal = tex2D(_SpecMask, i.uv);float specVal = GetBlinnPhongSpec(i.worldPos, worldNormal, _Shininess)*specMaskVal.r*_SpecStength;float2 MatCapUV = GetMatCapUV(worldNormal);float4 MatCapCol = pow(tex2D(_MatCapTex, MatCapUV)*_MatCapStength*specMaskVal.g, _MatCapPow);//第三种效果,完整光照模型half3 modelRGB = UNITY_LIGHTMODEL_AMBIENT * _AmbientStength + baseCol.rgb*diffuseVal+ _SpecCol.rgb*specVal + MatCapCol+ RimRGBA.rgb;

可以看出,实际上三种效果都已经计算出来了,分别是:
1.RimLineRGBA
2.baseCol
3.modelRGB
所以直接插值就行。这里我使用了2个技巧:
1.要混合1和2需要一个插值,然后把1和2的结果混合3又要一个插值,本来应该是需要2个值的,但我不想这么做,我希望用一个0到1的值,在0到0.5的阶段,显示1和2的混合,然后在0.5到1的阶段,显示1和2 的结果与3的混合。
2.如果直接插值,过渡位置的效果要么会很硬,要么会很软,所以我加了一个smoothstep来控制过渡位置的范围。

这个混合的值我们决定是使用模型的高度来控制,所以我们需要先指定模型的高度,然后通过顶点坐标的y坐标减去模型脚底的坐标,求出实际的高度。根据这个要求,所以我们做模型的时候就有一个要求了,必须把模型的中心点定在模型的脚底下。
在这里插入图片描述

如果不这么做,就不能直接计算模型顶点坐标和原点在世界空间的差值作为高度,必须再定义多一个模型脚下的坐标,那样就有点麻烦了。
有了以上需要的数据之后,就可以计算插值了:

float3 centerPos = mul(unity_ObjectToWorld, float3(0,0,0));float offsetH = i.worldPos.y - centerPos.y;float h1 = saturate(_ShowHeigh * 2)*_ModelHeigh;h1 = h1 - offsetH;h1 = smoothstep(_ShowHeighMin, _ShowHeighMax, h1);h1 = clamp(h1, 0, 1);float h2 = saturate(_ShowHeigh * 2-1)*_ModelHeigh;h2 = h2 - offsetH;h2 = smoothstep(_ShowHeighMin, _ShowHeighMax, h2);h2 = clamp(h2, 0, 1);				float3 finalRGB = (RimLineRGBA * (1 - h1) + baseCol.rgb*h1)*(1-h2)+ modelRGB*h2;

最后得到的finalRGB,就是插值计算之后最终需要显示的颜色了。

完整Shader:

Shader "azhao/IronManBodyCode"
{Properties{_RimBias("RimBias", Float) = 1_RimPow("RimlPow", Float) = 2_RimlCol("RimCol", Color) = (0,0,0,0)_NoiseMap("NoiseMap",2D) = "black"{}_NoiseTiling("NoiseTiling",Vector) = (1,1,0,0)_NoiseSpeed("NoiseSpeed",float) = 0_AmbientStength("AmbientStength",float) = 1_MainTex("BaseCol",2D) = "white"{}_NormalMap("NormalMap",2D) = "black"{}_NormalScale("NormalScale",float) = 1_SpecCol("SpecCol",Color) = (1,1,1,1)_Shininess("_Shininess",float) = 1_SpecStength("SpecStength",float) = 1_SpecMask("SpecMask",2D) = "white"{}_MatCapTex("_MatCapTex",2D) = "black"{}_MatCapStength("MatCapStength",float) = 1_MatCapPow("MatCapPow",float) = 2_RimAddStength("RimAddStength",float) = 1_ModelHeigh("ModelHeigh",float) = 2_ShowHeigh("ShowHeigh",Range(0,1)) = 0_ShowHeighMin("ShowHeighMin",Range(0,1)) = 0_ShowHeighMax("ShowHeighMax",Range(0,1)) = 1}SubShader{Tags { "RenderType"="Opaque" }LOD 100Pass{CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"//简化版的转换法线并缩放的方法half3 UnpackScaleNormal(half4 packednormal, half bumpScale){half3 normal;//由于法线贴图代表的颜色是0到1,而法线向量的范围是-1到1//所以通过*2-1,把色值范围转换到-1到1normal = packednormal * 2 - 1;//对法线进行缩放normal.xy *= bumpScale;//向量标准化normal = normalize(normal);return normal;}//获取HalfLambert漫反射值float GetHalfLambertDiffuse(float3 worldPos, float3 worldNormal){float3 lightDir = UnityWorldSpaceLightDir(worldPos);float NDotL = saturate(dot(worldNormal, lightDir));float halfVal = NDotL * 0.5 + 0.5;return halfVal;}//获取BlinnPhong高光float GetBlinnPhongSpec(float3 worldPos, float3 worldNormal,float shininess){float3 viewDir = normalize(UnityWorldSpaceViewDir(worldPos));float3 halfDir = normalize((viewDir + _WorldSpaceLightPos0.xyz));float specDir = max(dot(normalize(worldNormal), halfDir),0);float specVal = pow(specDir, shininess);return specVal;}float2 GetMatCapUV(float3 normalWorld){float3 normalView = mul(UNITY_MATRIX_IT_MV, normalWorld);return normalView.xy*0.5 + 0.5;}struct appdata{float4 vertex : POSITION;float2 uv : TEXCOORD0;float3 normal : NORMAL;float4 tangent : TANGENT;};struct v2f{float4 pos : SV_POSITION;float2 uv : TEXCOORD0;float3 worldPos :TEXCOORD1;float3 worldNormal : TEXCOORD2;float3 worldTangent :TEXCOORD3;float3 worldBitangent : TEXCOORD4;};float _RimBias;float _RimPow;float4 _RimlCol;sampler2D _NoiseMap;float4 _NoiseTiling;float _NoiseSpeed;sampler2D _MainTex;sampler2D _NormalMap;float _NormalScale;float _AmbientStength;float4 _SpecCol;float _Shininess;float _SpecStength;sampler2D _SpecMask;sampler2D _MatCapTex;float _MatCapStength;float _MatCapPow;float _RimAddStength;float _ModelHeigh;float _ShowHeigh;float _ShowHeighMin;float _ShowHeighMax;v2f vert (appdata v){v2f o;o.pos = UnityObjectToClipPos(v.vertex);o.uv = v.uv;o.worldPos = mul(unity_ObjectToWorld, v.vertex);o.worldNormal = UnityObjectToWorldNormal(v.normal);o.worldTangent = UnityObjectToWorldDir(v.tangent);o.worldBitangent = cross(o.worldNormal, o.worldTangent);return o;}half4 frag (v2f i) : SV_Target{float3 worldViewDir = normalize(UnityWorldSpaceViewDir(i.worldPos));float NdotV = dot(i.worldNormal, worldViewDir);float fresnelVal = pow((1 - NdotV)*_RimBias, _RimPow);float2 noiseUV = i.worldPos.xy *_NoiseTiling.xy + _NoiseTiling.zw;noiseUV.y += frac(_Time.y)*_NoiseSpeed;float4 noiseCol = tex2D(_NoiseMap, noiseUV);//第一种效果,光线轮廓half4 RimLineRGBA = _RimlCol * (fresnelVal+noiseCol.r);half4 RimRGBA = _RimlCol * fresnelVal*_RimAddStength;//第二种效果,固有色half4 baseCol = tex2D(_MainTex,i.uv);half4 normalCol = tex2D(_NormalMap, i.uv);//得到切线空间的法线方向half3 normalVal = UnpackScaleNormal(normalCol, _NormalScale).rgb;//构建TBN矩阵float3 tanToWorld0 = float3(i.worldTangent.x, i.worldBitangent.x, i.worldNormal.x);float3 tanToWorld1 = float3(i.worldTangent.y, i.worldBitangent.y, i.worldNormal.y);float3 tanToWorld2 = float3(i.worldTangent.z, i.worldBitangent.z, i.worldNormal.z);//通过切线空间的法线方向和TBN矩阵,得出法线贴图代表的物体世界空间的法线方向float3 worldNormal = float3(dot(tanToWorld0, normalVal), dot(tanToWorld1, normalVal), dot(tanToWorld2, normalVal));float diffuseVal = GetHalfLambertDiffuse(i.worldPos, worldNormal);float4 specMaskVal = tex2D(_SpecMask, i.uv);float specVal = GetBlinnPhongSpec(i.worldPos, worldNormal, _Shininess)*specMaskVal.r*_SpecStength;float2 MatCapUV = GetMatCapUV(worldNormal);float4 MatCapCol = pow(tex2D(_MatCapTex, MatCapUV)*_MatCapStength*specMaskVal.g, _MatCapPow);//第三种效果,完整光照模型half3 modelRGB = UNITY_LIGHTMODEL_AMBIENT * _AmbientStength + baseCol.rgb*diffuseVal+ _SpecCol.rgb*specVal + MatCapCol+ RimRGBA.rgb;float3 centerPos = mul(unity_ObjectToWorld, float3(0,0,0));float offsetH = i.worldPos.y - centerPos.y;float h1 = saturate(_ShowHeigh * 2)*_ModelHeigh;h1 = h1 - offsetH;h1 = smoothstep(_ShowHeighMin, _ShowHeighMax, h1);h1 = clamp(h1, 0, 1);float h2 = saturate(_ShowHeigh * 2-1)*_ModelHeigh;h2 = h2 - offsetH;h2 = smoothstep(_ShowHeighMin, _ShowHeighMax, h2);h2 = clamp(h2, 0, 1);				float3 finalRGB = (RimLineRGBA * (1 - h1) + baseCol.rgb*h1)*(1-h2)+ modelRGB*h2;return half4(finalRGB,1);}ENDCG}}
}

http://www.ppmy.cn/news/332398.html

相关文章

钢铁侠材质制作——1、模型发光部分的材质制作

钢铁侠Unlit光照Shader,三种效果变化 返回目录 大家好,我是阿赵。这里是制作钢铁侠材质的第一部分,模型发光部分的材质制作。 1、效果分析 这一个部分只是处理眼睛、胸口、手掌的发光部位,为了能单独控制这些部分,…

《硅谷钢铁侠:埃隆·马斯克的冒险人生》文摘

It’s a right thing to do, and I’m tired of waiting someone else to do it for me. 我只是觉得这是应该要去做的事情,而且我不想苦等别人来实现。 马斯克在采访中提及,他认为有5个领域将深刻影响人类的未来:互联网、新能源、太空探索、人…

电影中的“钢铁侠”走了,现实中的“钢铁侠”来了

文|佘凯文 来源|智能相对论(aixdlun) 在《复联4》中,陪伴我们多年的钢铁侠,托尼.史塔克还是在不舍中离我们而去(不.是.剧.透),钢铁侠这一形象,曾拯救漫威于将倾,他同样…

钢铁侠或漫威中有哪些黑科技?

以钢铁侠为例吧,简单列举几个,不然的话根本数不过来,太多了。 一.钢铁侠的核心:方舟反应堆 这个属于幻想科技了,未来人类能否实现真不好说 ,但是它的出现绝对是改变世界格局改变人类未来的。类比现在科技就…

​windows系统——更改系统音效为钢铁侠贾维斯​

听烦了windows系统自带音效,是不是想要换掉它的冲动呢? 如果是的,请跟我一起把windows系统音效换成科技感十足的钢铁侠贾维斯音效。 点击此处获取贾维斯音效 //1.打开运行界面 win R //2.打开控制面板,在运行界面输入control…

《硅谷钢铁侠》读后感

“不,我从不放弃。除非我死了或完全丧失了能力。”——埃隆。马斯克 看完硅谷的钢铁侠:埃隆马斯克。马斯克的冒险人生最大的感受就是有些人天生就是为了改变世界,而这种天赋不仅来自于家庭,也来自于自己。写下这些话的时候&#x…

电影:钢铁侠3

简 介:漫威的“钢铁侠 3”让傲慢但才华横溢的实业家托尼斯塔克/钢铁侠与一个无止境的敌人对抗。当斯塔克发现他的个人世界被敌人摧毁时,他开始了寻找责任人的艰巨任务。这段旅程,在每一个转折点,都将考验他的勇气。斯塔克背靠墙&a…

GIT远程仓库(随笔)

目录 前言 一、GIt常见命令 二、概念原理 三、常见的代码托管平台 四、配置SSH公钥 五、操作 1、注册账号 2、在gitee中,创建远程仓库 3、Git命令创建本地仓库 4、Git命令创建第一个版本提交 5、Git命令添加远程仓库 6、推送 7、修改开源项目 ​编辑 8、…