Unity制作二次元卡通渲染角色材质——2、色阶化光影的多种做法对比

Unity制作二次元材质角色


回到目录

大家好,我是阿赵。
这里继续讲二次元角色渲染。之前说过,最基本的卡通渲染,包含了色阶化光影和描边二个元素。所以这里先来说一下色阶化光影的多种做法对比。

一、光照模型和色阶化的说明

从上一篇文章里面可以知道,这个模型提供了2套贴图,分别是baseMap和sssMap
在这里插入图片描述

baseMap
在这里插入图片描述

sssMap

这两张贴图的作用,很明显作为亮部和暗部显示用的。
那么需要怎样使用这两张贴图呢?
其实很简单,还是自定义光照模型。我之前写过文章介绍怎样自己写光照模型。然后我之后做了很多例子,如果各位如果有留意看,估计也发现,自定义光照模型是很多效果的基础。
这里我也同样的先做一个HalfLambert漫反射光照:

//获取HalfLambert漫反射值
float GetHalfLambertDiffuse(float3 worldPos, float3 worldNormal)
{
float3 lightDir = UnityWorldSpaceLightDir(worldPos);
float NDotL = dot(worldNormal, lightDir);
float halfVal = NDotL * 0.5 + 0.5;
return halfVal;
}
half4 frag (v2f i) : SV_Target
{                
half4 col = tex2D(_BaseMap, i.uv);
half4 sssCol = tex2D(_SSSMap, i.uv);
half halfLambert = GetHalfLambertDiffuse(i.worldPos, i.worldNormal);
half3 finalRGB = col.rgb*halfLambert + sssCol * (1 - halfLambert);
half alpha = col.a;
return half4(finalRGB,alpha);
}

在这里插入图片描述
这个时候,通过获取漫反射的光照值来混合baseMap和sssMap,会得到这种效果。
不过这只是正常普通的HalfLambert光照效果,在卡通渲染里面,因为是模拟漫画的涂色方式,光影之间一般来说会有一个硬边的过渡,比如:
在这里插入图片描述

这种情况,我们会称为色阶化。意思就是,把一个渐变过渡的光影效果,变成了一段一段色阶的跳跃性过渡。

二、实现色阶化的多种手段介绍

做色阶化的方法比较多,比如:

1、通过一个色阶图去采样

这个方法需要准备一张色阶图:
在这里插入图片描述

然后通过光照模型的值作为x坐标去采样这张贴图

half4 frag (v2f i) : SV_Target
{
//色阶化
half halfLambert = GetHalfLambertDiffuse(i.worldPos, i.worldNormal);
half4 GradationCol = tex2D(_GradationMap, float2(halfLambert, 0.5));
return GradationCol;
}

会得到这个效果:
在这里插入图片描述

可以看出,刚才的色阶图的三个颜色都出现在模型身上了,而且三段颜色的占比,可以通过调节色阶图的颜色范围来控制。
接下来可以把这个色阶图的采样结果,和baseMap做一个混合,就得到了:

half4 frag (v2f i) : SV_Target
{
half4 col = tex2D(_BaseMap, i.uv);
half4 sssCol = tex2D(_SSSMap, i.uv);//色阶化
half halfLambert = GetHalfLambertDiffuse(i.worldPos, i.worldNormal);
half4 GradationCol = tex2D(_GradationMap, float2(halfLambert, 0.5));half3 finalRGB = col.rgb*GradationCol+ sssCol*(1- GradationCol);
half alpha = col.a;
return half4(finalRGB,alpha);
}

在这里插入图片描述

先忽略脸部,之后我会有专门的一篇文章讲脸部的问题。看一下身体的部分,可以看出现在的影子已经变成了色阶化了。
色阶图的做法的好处是,喜欢多少段色阶影子都可以,可以通过调整色阶图来控制影子的深浅和范围。

2、使用渐变图做色阶

色阶图其实也有缺点,如果想做到某些部位的色阶化强烈一点,某些部位的色阶化弱一点,其实是很难做到的。
所以出现了另外一种色阶图的做法,是渐变的
在这里插入图片描述

可以看出,这张渐变图下面是硬过渡,上面是软过渡,如果我们采样的时候,可以不同部位控制采样uv的y轴不一样,那么得到的软硬过渡程度也可以不一样。代码的写法和上面的色阶图是一样的,只是采样uv的y坐标不一样,所以就不重复写一遍了,只说一下原理。
那么怎样去控制UV坐标的y轴呢?方法很多,给一张专门的贴图去控制,或者直接用顶点颜色的某个通道去控制,都可以。
一般会使用顶点颜色去控制,配合着实时编辑顶点颜色的工具,可以比较快速的看到效果的改变。

3、使用step函数

不使用其他贴图,而是用step函数,也能实现色阶化:

half4 frag (v2f i) : SV_Target
{
//色阶化
half halfLambert = GetHalfLambertDiffuse(i.worldPos, i.worldNormal);
half toonVal = step(0, halfLambert- _stepVal);
return half4(toonVal.xxx,1);
}

在这里插入图片描述

加上了baseMap和sssMap的混合,效果就是:
在这里插入图片描述

step的做法,好处是简单,不需要额外的贴图资源,直接用一个变量就能控制阴影的范围。

4、使用smoothstep函数

step函数的做法是很简单的,但有一个缺点,不能控制阴影边缘的软硬程度
所以可以使用smoothstep函数来替代step函数,这样就可以控制阴影的软硬程度

half4 frag (v2f i) : SV_Target
{
//色阶化
half halfLambert = GetHalfLambertDiffuse(i.worldPos, i.worldNormal);
half toonVal = smoothstep(_GradationMin, _GradationMax, halfLambert);
return half4(toonVal.xxx,1);
}

在这里插入图片描述

可以看到,在使用smoothstep函数之后,通过控制smoothstep的最大值和最小值的参数,我们实现了不同部位的影子过渡程度不一样的效果了,甚至可以在某些部位减弱影子的效果。
混合了baseMap和sssMap,就是这种效果:
在这里插入图片描述

做色阶化的方法很多,可以自己再发散一下思维。已经列举出的几种方式,综合评价了一下,我觉得用smoothstep函数的方法会比较容易实现,容易控制,然后效果也还不错。所以我在这个例子里面最终是使用了smoothstep函数的方法来做色阶化光影的。

三、完整Shader

Shader "azhao/ToonBodyBase"
{Properties{_BaseMap ("BaseMap", 2D) = "white" {}_SSSMap("SSSMap", 2D) = "white" {}_GradationMin("GradationMin",Range(0.0,1.0)) = 0.0_GradationMax("GradationMax",Range(0.0,1.0)) = 1.0}SubShader{Tags { "RenderType"="Opaque" }LOD 100Pass{CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"#pragma multi_compile_fwdbase#include "AutoLight.cginc"struct appdata{float4 vertex : POSITION;float2 uv : TEXCOORD0;float2 uv2 : TEXCOORD1;float3 normal:NORMAL;};struct v2f{                float4 pos : SV_POSITION;float2 uv : TEXCOORD0;float2 uv2 : TEXCOORD1;float3 worldPos :TEXCOORD2;float3 worldNormal :TEXCOORD3;};sampler2D _BaseMap;float4 _BaseMap_ST;sampler2D _SSSMap;float _GradationMin;float _GradationMax;//获取HalfLambert漫反射值float GetHalfLambertDiffuse(float3 worldPos, float3 worldNormal){float3 lightDir = UnityWorldSpaceLightDir(worldPos);float NDotL = dot(worldNormal, lightDir);float halfVal = NDotL * 0.5 + 0.5;return halfVal;}v2f vert (appdata v){v2f o;o.pos = UnityObjectToClipPos(v.vertex);o.uv = TRANSFORM_TEX(v.uv, _BaseMap);o.uv2 = TRANSFORM_TEX(v.uv2, _BaseMap);o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;o.worldNormal = UnityObjectToWorldNormal(v.normal);return o;}half4 frag (v2f i) : SV_Target{// sample the texturehalf4 col = tex2D(_BaseMap, i.uv);half4 sssCol = tex2D(_SSSMap, i.uv);//色阶化half halfLambert = GetHalfLambertDiffuse(i.worldPos, i.worldNormal);half toonVal = smoothstep(_GradationMin, _GradationMax, halfLambert);half3 finalRGB = col.rgb*toonVal + sssCol * (1 - toonVal);half alpha = col.a;return half4(finalRGB,alpha);}ENDCG}}
}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

二次元单页导航 HTML模板源码

介绍: 我从玖梦博客搬砖下载的,源码有个小问题 缺一个" 我已经修复了,链接什么的我懒得改了,直接原图上来 随机背景图,感觉还可以,如果不喜欢可以在自己修改 网盘下载地址: http://kekew…

二次元的登录界面

今天还是继续坚持写博客,然后今天给大家带来比较具有二次元风格的登录界面,也只是用html和css来写的,大家可以来看看! 个人名片: 😊作者简介:一名大一在校生,web前端开发专业 &…

Unity制作二次元卡通渲染角色材质——5、脸部的特殊处理

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

二次元HTML导航页网站源码

简介: 二次元HTML导航页网站源码,非常好看的一款单页源码,感兴趣的同学可以看看! 网盘下载地址: http://kekewl.org/p6BqAjZzdqL0 图片:

【有手就会系列】四步通过文字生成二次元小姐姐图片

首先fork项目,启动环境选择16G的A100显卡,直接点击运行加载模型,接着就到了生成小姐姐的时候啦 你需要设置想生成的小姐姐的描述,由于模型是通过英文训练的,所以建议中文翻译成英文输入,填入你想要的描述 不…

wordpress二次元主题

几款开源的wordpress二次元主题,演示地址可到Github查看。 boxmoe Github:https://github.com/baomihuahua/boxmoe-dove- Kratos Github:https://github.com/seatonjiang/kratos Sakura Github:https://github.com/mashiroz…

记一次添加桌面二次元人物的经历

VScode的一个自定义背景插件 事情是这样的: 前两天上课的时候,看到老师VScode背景有个二次元人物: 作为一名二刺猿爱好者,当然要想搞一个,于是找到插件: 肯定不能满足于这默认背景的吧,于是找…

二次元动漫人物脚部的画法

“脚”画不好的原因是,长度和粗细的比例平衡。相反,如何知道了平衡的方法的话,那么人的身体一定可以画好。这次就对于脚的画法进行详细的讲解吧~ 为了画好漫画,人物的脚部往往都是不能避免的部位。虽然脸和上半身可以画得很好&am…

用Paddle自动生成二次元人物头像

用Paddle自动生成二次元人物头像 想画出独一无二的动漫头像吗?不会画也没关系!只需要输入一些随机数让卷积神经网络为你画出精致并且独一无二的动漫头像! 同时本项目也是绝佳的学习DCGAN的例子,通过趣味解读深入浅出地了解GAN的魔…

【TA】Unity角色二次元风格渲染

NRMToonLitSample Author : 文若 我的Demo地址 : NRMToonLitSample 学习视频地址 : Kerry大佬的 技术美术实战培训课程——卡通人物渲染方案 文章目录 NRMToonLitSample1. 模型贴图基本信息2. 基础渲染效果2.1 基础shader Toon2.2 光照模型效果第一步&am…

Fiora一款二次元的Web多人在线网络聊天系统

源码介绍 Fiora是一款偏二次元的Web多人在线聊天应用,使用Node.js、Mongodb、Socket.io和React编写,使用起来还行,挺简洁的,这里水个搭建教程,有兴趣的可以玩玩。 源码功能 好友,群组,私聊&a…

Unity制作二次元卡通渲染角色材质——1、资源分析

Unity制作二次元材质角色 回到目录 大家好,我是阿赵。 开始制作二次元角色材质之前,我觉得应该是先分析一下,我手上拿到的这个角色模型资源,总共有哪些信息是我们能用的。 所以这篇文章我不会分享具体的Shader,但我感觉…

WPF 3D 贴图: 为你的二次元老婆们做个3D画廊

文章目录 WPF3D系列为你的二次元老婆们做个3D画廊 WPF3D系列 💎WPF 3D初步|源码 新建一个立方体并调整视角相机控制:位置和视角的调节 💎键盘控制|源码💎鼠标控制|源码 💎为你的二次元老婆们做个3D画廊|源码&#x1f…

关于人工智能写作的发展以及看法

人工智能技术的快速发展使其应用领域得以扩展。从金融服务到小说创作,人工智能技术都占有了一席之地。 人工智能可以取代编辑吗?近日某公司开发了一个神码AI人工智能写作软件,据说现在人工智能可以理解超过85%的内容。现在也可以…

换一种姿势阅读《人工智能简史》

2017 年 12 月,一本名为《人工智能简史》的图书发布。这个时间节点对于多数普通人的生活来说不算特别,但正是从前一年开始,人工智能在世界范围内开始进入了一段新的飞速发展期。2017 年和 2018 年也是中国 AI 企业的创业热潮期。 你说这个时代…

【转载】人工智能发展简史

网络查阅资料时候,看到的对人工智能发展简史,较为完整的讲述,故转载,仅供学习使用,原文链接:https://www.aminer.cn/ai-history。侵删。 人工智能到底是什么?通常来说,人工智能&…

人工智能再次超越人类,这次是阅读理解

在斯坦福大学举办的阅读理解比赛中,由微软和阿里巴巴分别独立开发的人工智能的得分都超过了人类。 在斯坦福大学举办的阅读理解比赛中,由微软和阿里巴巴分别独立开发的人工智能(AI)模型的得分均超过了人类。 这一人工智能里程碑是…

与AI合作穿越剧 编剧徐婷:AI脑洞大,但无法替代人类的情感表达

热门喜剧秀《周六夜现场》本季提前结束,美剧《亿万》最新第七季的更新搁浅,漫威新电影《新刀锋战士》暂停拍摄……美国影视娱乐行业的编剧们以抵制AI为由的大罢工,开始影响诸多作品的产出,据说造成了100亿美元的损失。 这场罢工已…