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

news2025/1/22 9:20:02

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


返回目录

大家好,我是阿赵,这里是钢铁侠材质制作第二部分,线条轮廓部分的制作
在这里插入图片描述

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

1、轮廓光

在这里插入图片描述

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、添加横纹

在这里插入图片描述

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贴图
在这里插入图片描述

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

如果不调整参数的情况下,添加Noise到材质球,会看到下面的效果。
在这里插入图片描述

虽然这个效果看起来也很cool,但并不是我想要的效果,所以再调整一下Tiling值
在这里插入图片描述

把平铺y值调大,这个时候,就可以看到,Noise图就变成了横纹了。
在这里插入图片描述

3、横纹动画

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

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
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/414170.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

时间序列 | MATLAB实现CNN-BiLSTM-Attention时间序列预测

时间序列 | MATLAB实现CNN-BiLSTM-Attention时间序列预测 目录时间序列 | MATLAB实现CNN-BiLSTM-Attention时间序列预测预测效果基本介绍模型描述程序设计参考资料预测效果 基本介绍 MATLAB实现CNN-BiLSTM-Attention时间序列预测,CNN-BiLSTM结合注意力机制时间序列预…

语言模型ChatGPT,为什么能引领各行各业的AI技术革命

为什么ChatGPT这样一个语言模型的发展能引发所有行业的AI技术革命呢? 答案就在于它能理解我们的自然语言, 并能将我们的语言转换成计算机能够完全理解的特征。 自然语言与计算机理解 ChatGPT之所以能引领技术革命,关键在于它能理解我们的…

GPT、科技、人类的生产、知识与未来(上)

本文将继续结合GPT探讨人工智能技术升级可能对人类社会带来的影响。主要还是侧重历史、社会、文化、经济、政治等角度。 问题的提出:ChatGPT等工具会提高人的工作效率和产出。但它会让人类使用者自身变得更“聪明”,还是“更笨”?更“强”&am…

CVE-2017-16995 Ubuntu 16.04 漏洞复现

目录 1.背景介绍 2.目的: 3.环境 4.操作: 工具下载地址: 1.背景介绍 Ubuntu 16.04版本存在本地提权漏洞,该漏洞存在于Linux内核带有的eBPF bpf(2)系统调用中,当用户提供恶意BPF程序使eBPF验证器模块产生计算错误&…

JDBC03-批处理、连接池、DBUtils、事物、DAO通用方法

1. 封装 JDBCUtils 【关闭、得到连接】 1.1 说明 1.2 代码实现 工具类 JDBCUtils package com.hspedu.jdbc.utils;import java.io.FileInputStream; import java.io.IOException; import java.sql.*; import java.util.Properties; /** * 这是一个工具类,完成 my…

【Microsoft Edge】安装详解

文章目录一、下载 Edge1.1 下载网址1.2 版本分类二、安装 Edge2.1 可能的异常情况2.2 安装目录详解2.2.1 Edge 非 Canary 版2.2.2 Edge Canary 版一、下载 Edge Edge 的安装包其实是一个简易安装包,里面封装了一个安装的配置文件,提供真正的安装包下载链…

FreeRTOS 任务基础知识

文章目录一、什么是多任务系统?二、FreeRTOS 任务与协程三、任务状态四、任务优先级五、任务实现六、任务控制块七、任务堆栈RTOS 系统的核心就是任务管理,FreeRTOS 也不例外,而且大多数学习 RTOS 系统的工程师或者学生主要就是为了使用 RTOS…

Revit中怎么绘制多面坡度的屋顶及生成墙

​一、Revit中怎么绘制多面坡度的屋顶 像这种坡屋顶我们可以观察到,它的屋顶轮廓都是带有坡度的,那我可以通过添加定义坡度的方式来绘制出该屋顶。 点击建筑选项卡中的屋顶按钮,选择迹线屋顶。 选择使用拾取线工具,在选项栏中将偏…

从零学习SDK(4)使用SDK创建一个简单的应用程序

SDK(Software Development Kit)即软件开发工具包,是一组帮助我们开发出软件的工具,包括代码、文档、示例等。一般情况下,我们需要将SDK引入到我们的项目中才能使用它。比如,学Java的朋友最早接触的JDK&…

JMeter使用JDBC Request取样器 获取查询结果

JDBC获取查询结果Java脚本创建文件JSON字符串解析 数据库连接配置定义全局变量JDBC Request 创建文件路径以及文件的脚本 import java.io.FileOutputStream; import java.text.SimpleDateFormat; import java.util.Date; boolean result false; try {//String message new Si…

JAVA初学下(仅做笔记)

一. Map集合(双列集合) 1.特点 键不能重复,值可以重复 Map接口位于最高层 2.常见API 2.1基本功能 ①注意V put(K key,V value)这个方法, 当加入 的键值对元素的键(key) 不存在时,就会将 键值…

django项目名称重命名

学会这个小白也能轻松修改项目名称;日常板砖中难免遇到项目多次利用的情况,修改项目名称也成了一门手艺😀;实际操作起来也非常简单,没有那些花花绿绿的东西. 一.项目奔跑 1.拿到项目后,我们先在pycharm运行下,看项目是否能正常奔跑起来; 注意收集正常奔跑后项目的执行环境等…

某程序员哀叹:月薪四五万,却每天极度焦虑痛苦,已有生理性不适,又不敢裸辞,怎么办?...

高薪能买来快乐吗?来看看这位程序员的哀叹:实在是扛不住了,每天都在极度焦虑和痛苦中度过,早上起来要挣扎着做心理建设去上班,已经产生生理性的头晕恶心食欲不振。有工作本身的原因,更多是自己心态的问题&a…

12纳米做出了7纳米的性能,为国产芯片打破美国限制指明道路

美国联合日本、荷兰等限制对中国供应先进芯片设备,试图借此阻止中国发展14纳米以下的先进工艺,然而日前中国一家芯片企业发布了一款全新的芯片,却给中国芯片行业指明了新道路,发展先进性能芯片又了可能性。龙芯近期发布了一款全新…

Flink 优化 (四) --------- 数据倾斜

目录一、判断是否存在数据倾斜二、数据倾斜的解决1. keyBy 后的聚合操作存在数据倾斜2. keyBy 之前发生数据倾斜3. keyBy 后的窗口聚合操作存在数据倾斜一、判断是否存在数据倾斜 相同 Task 的多个 Subtask 中,个别 Subtask 接收到的数据量明显大于其他Subtask 接收…

【DevOps】GitOps之痛 -不完美的GitOps

前言 在前两篇文章中,我们对GitOps进行了大致的介绍: 【DevOps】GitOps初识(上) - 让DevOps变得更好 【DevOps】GitOps初识(下) - 让DevOps变得更好 GitOps 作为软件发布实践方式,有着许多的优点,然而,世上并没有完美…

【Linux】Centos安装mvn命令(maven)

🍁博主简介 🏅云计算领域优质创作者   🏅华为云开发者社区专家博主   🏅阿里云开发者社区专家博主 💊交流社区:运维交流社区 欢迎大家的加入! 文章目录一、下载maven包方法一:官…

CTF流量分析

在CTF里,一些pcapng或pcap文件后缀的数据 不同的数据包有不同的协议,常见的有HTTP,TCP协议 Wireshark 简介 是一个网络封包分析软件。网络封包分析软件的功能是获取网络封包,并尽可能显示出最为详细的网络封包资料 使用WinPC…

舔狗日记:学姐生日快到了,使用Python把她的照片做成视频当礼物

舔狗日记1前言一、需要调入的模块二、实现合并多张图片转成 mp4 视频三、优化改进一下总结前言 这不是学姐生日快到了,于是我学了一手使用Python来把学姐的照片生成为视频,到时候给她一个惊喜! 好了先不舔了,下面分享一下用pytho…

基于朴素贝叶斯分类器的钞票真伪识别模型

基于朴素贝叶斯分类器的钞票真伪识别模型 内容 本实验通过实现钞票真伪判别案例来展开学习朴素贝叶斯分类器的原理及应用。 本实验的主要技能点: 1、 朴素贝叶斯分类器模型的构建 2、 模型的评估与预测 3、 分类概率的输出 源码下载 环境 操作系统&#xf…