钢铁侠材质制作——2、线条轮廓部分的制作

这篇具有很好参考价值的文章主要介绍了钢铁侠材质制作——2、线条轮廓部分的制作。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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


返回目录

大家好,我是阿赵,这里是钢铁侠材质制作第二部分,线条轮廓部分的制作
钢铁侠材质制作——2、线条轮廓部分的制作

为了实现这个效果,可以把细节拆分成以下几个部分:

1、轮廓光

钢铁侠材质制作——2、线条轮廓部分的制作

1.效果分析

这是一个很基础的轮廓光实现,用到的就是法线和观察方向的点乘(NdotV)。

2.shader实现

Shader "azhao/IronManBodyCode"
{
    Properties
    {
		_RimBias("RimBias", Float) = 1
		_RimPow("RimlPow", Float) = 2
		_RimlCol("RimCol", Color) = (0,0,0,0)

    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 100

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag


            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
				float3 normal : NORMAL;

            };

            struct v2f
            {
                float4 pos : SV_POSITION;
				float3 worldPos :TEXCOORD0;
				float3 worldNormal : TEXCOORD1;
				
            };

			float _RimBias;
			float _RimPow;
			float4 _RimlCol;

            v2f vert (appdata v)
            {
                v2f o;
                o.pos = UnityObjectToClipPos(v.vertex);
				o.worldPos = mul(unity_ObjectToWorld, v.vertex);
				o.worldNormal = UnityObjectToWorldNormal(v.normal);
                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);
				half4 col = _RimlCol* fresnelVal;

				return col;
            }
            ENDCG
        }
    }
}

3.说明

这个其实就是菲涅尔的标准算法,在1-NdotV后,乘以一个bias值控制边缘光的强度,再计算一个Pow运算,控制边缘光的边缘厚度。

2、添加横纹

钢铁侠材质制作——2、线条轮廓部分的制作

1.效果分析

看到这个效果,可能很多人都在考虑怎样画这个横纹的贴图。其实这个实现方式很巧妙,只需要一张Noise噪声图就可以了。

2.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)

    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 100

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag


            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
				float2 uv : TEXCOORD0;
				float3 normal : NORMAL;

            };

            struct v2f
            {
                float4 pos : SV_POSITION;
				float3 worldPos :TEXCOORD0;
				float3 worldNormal : TEXCOORD1;
				
            };

			float _RimBias;
			float _RimPow;
			float4 _RimlCol;
			sampler2D _NoiseMap;
			float4 _NoiseTiling;

            v2f vert (appdata v)
            {
                v2f o;
                o.pos = UnityObjectToClipPos(v.vertex);
				o.worldPos = mul(unity_ObjectToWorld, v.vertex);
				o.worldNormal = UnityObjectToWorldNormal(v.normal);
                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;
				float4 noiseCol = tex2D(_NoiseMap, noiseUV);

				half4 col = _RimlCol * (fresnelVal+noiseCol.r);

				return col;
            }
            ENDCG
        }
    }
}

3.说明

这里多添加了一张Noise贴图
钢铁侠材质制作——2、线条轮廓部分的制作

由于我们想要的横纹是永远水平于世界空间,并不是希望会随着角色的动作而变形的,所以我这里并没有使用模型本身的UV坐标来采样,而是使用了模型的顶点世界坐标的xy坐标来模拟了UV坐标,并且添加了一个Tiling值来控制Noise贴图的平铺次数。

如果不调整参数的情况下,添加Noise到材质球,会看到下面的效果。
钢铁侠材质制作——2、线条轮廓部分的制作

虽然这个效果看起来也很cool,但并不是我想要的效果,所以再调整一下Tiling值
钢铁侠材质制作——2、线条轮廓部分的制作

把平铺y值调大,这个时候,就可以看到,Noise图就变成了横纹了。
钢铁侠材质制作——2、线条轮廓部分的制作

3、横纹动画

我希望在显示这个光线轮廓的过程中,身上的横纹是有一个慢慢上升的动画效果的
这个实现起来很简单,只需要给Noise图的uv做一个偏移就可以了,这里用到了_Time,根据时间来让UV偏移。
float2 noiseUV = i.worldPos.xy _NoiseTiling.xy + _NoiseTiling.zw;
noiseUV.y += frac(_Time.y)
_NoiseSpeed;
这里还加了一个frac函数,frac函数的作用是去掉数值的整数部分只保留小数部分。由于某些设备的数值精度支持范围有问题,如果_Time不停的累加,达到很大的值时,可能会出问题。所以加一个frac函数让它的值只使用小数部分。文章来源地址https://www.toymoban.com/news/detail-411062.html

4、完整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

    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 100

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag


            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
				float3 normal : NORMAL;

            };

            struct v2f
            {
                float4 pos : SV_POSITION;
				float3 worldPos :TEXCOORD0;
				float3 worldNormal : TEXCOORD1;
				
            };

			float _RimBias;
			float _RimPow;
			float4 _RimlCol;
			sampler2D _NoiseMap;
			float4 _NoiseTiling;
			float _NoiseSpeed;

            v2f vert (appdata v)
            {
                v2f o;
                o.pos = UnityObjectToClipPos(v.vertex);
				o.worldPos = mul(unity_ObjectToWorld, v.vertex);
				o.worldNormal = UnityObjectToWorldNormal(v.normal);
                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 col = _RimlCol * (fresnelVal+noiseCol.r);

				return col;
            }
            ENDCG
        }
    }
}

到了这里,关于钢铁侠材质制作——2、线条轮廓部分的制作的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • UE4 使用材质后期 制作玻璃有雨效果

    效果展示,其实这是一个动画效果 以上为所有逻辑 拿到TexCoord给到Panner,Time和Speed都是通过下面计算而来,后面讲,再拿到时间和速度值过后,加上扰动值,最后取G值,因为雨事从上而下的动,需要的是一个从上往下的渐变。 拿到一个TexCoord的R值,从左往右的渐变,做一个

    2024年02月08日
    浏览(49)
  • 在UE5中使用OverlayMaterial制作多材质效果

    UE5.1中新增了OverlayMaterial,可以让物体套用2个材质球效果,如A材质球为正常材质内容,B材质球为菲涅尔,或是B材质球是法线外拓描边等,该功能类似Unity的多pass效果,方便了日常使用。 下面就讲将怎么用OverlayMaterial制作带菲涅尔效果的叠加材质: 1.新建一个材质球,作为

    2024年02月22日
    浏览(38)
  • Unity制作二次元卡通渲染角色材质——5、脸部的特殊处理

    Unity制作二次元材质角色 回到目录 大家好,我是阿赵。 这里继续讲二次元角色材质的制作。这次是讲头部的做法。 之前在分析资源的时候,其实已经发现了这个模型的脸部法线有问题,导致在做光照模型的时候,脸部很奇怪。 把fbx文件导入到3DsMax里面,可以发现 这个模型

    2024年02月09日
    浏览(38)
  • Unity制作二次元卡通渲染角色材质——4 、内外描边和细节添加

    Unity制作二次元材质角色 回到目录 大家好,我是阿赵。 这里继续讲二次元角色材质。这次打算讲一下描边和细节的添加。 外描边的做法也不止一种,比如后处理方法的偏导数ddx/ddy之类的,也能整个屏幕的求出边缘。但一般来说单模型渲染常用的描边方式,是写多一个Pass,

    2024年02月08日
    浏览(35)
  • Unity制作二次元卡通渲染角色材质——3、高光反射与ILM贴图

    Unity制作二次元材质角色 回到目录 大家好,我是阿赵。 这里继续来讲二次元角色的材质。上次讲了光影的色阶化问题,这次继续讲光照模型效果的问题。 之前我们说过,光照模型的最后效果是: 环境色+漫反射+高光+反射。 这里我们可以先忽略环境光,然后之前做了漫反射

    2024年02月11日
    浏览(60)
  • SuperMap Hi-Fi 3D SDK for Unity制作游戏引擎材质

    kele     在交通,电力,规划等行业中,有的对象常常具有很强的质感,比如金属质感的 钢轨,电力塔;陶瓷材质的绝缘子;玻璃材质的建筑幕墙等,但常规方式的表现效果 往往差强人意。     游戏引擎(Unity3D)中已有丰富的材质资源库,比如玻璃,金属等材质,这

    2024年02月09日
    浏览(84)
  • Unity制作二次元卡通渲染角色材质——2、色阶化光影的多种做法对比

    Unity制作二次元材质角色 回到目录 大家好,我是阿赵。 这里继续讲二次元角色渲染。之前说过,最基本的卡通渲染,包含了色阶化光影和描边二个元素。所以这里先来说一下色阶化光影的多种做法对比。 从上一篇文章里面可以知道,这个模型提供了2套贴图,分别是baseMap和

    2024年02月14日
    浏览(35)
  • 关于 ue unreal 虚幻 在编辑器editor未运行情况下 部分材质出现模糊 看不清的问题 的另外一种解决方案猜想

    这里引用两个帖子 Quixel导入资产到UE5后,材质贴图一片模糊的问题该如何解决? - 知乎 干货分享 || UE4场景内模型模糊的解决办法 - 知乎 以上两种是纹理流 texture streaming 导致的问题 结果借个图  眼看这糊的这种问题 下面说一下另外一种情况猜想 情况是这样 因为最近有看看

    2024年02月07日
    浏览(52)
  • 关于微信小程序制作消息部分时方法

    这个界面主要以两个界面组成: 1、展示用户接收到的消息 2、用户与用户的聊天界面 1.上传云端的数据 如果去做这个,首先第一就是如何将信息部分放入数据库,以及从数据库中调用 在上传的时候可以上传形似data这样的形式: 2.界面一的主要数据部分 也就是说在这个代码

    2024年02月20日
    浏览(33)
  • 深入URP之Shader篇3: Unlit Shader分析[下]

    上篇中我们分析了Unlit shader的Properties在ShaderGUI中的处理,接下来看Sub Shader。 unlit shader以及其他URP shader包含两个SubShader,分别是针对ShaderModel4.5和2.0。由于unlit shader本身很简单,这两个SubShader几乎一样,唯一的差别是ShaderModel 4.5的SubShader会定义 #pragma multi_compile _ DOTS_INSTANCIN

    2024年02月10日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包