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

这篇具有很好参考价值的文章主要介绍了Unity制作二次元卡通渲染角色材质——2、色阶化光影的多种做法对比。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Unity制作二次元材质角色


回到目录

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

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

从上一篇文章里面可以知道,这个模型提供了2套贴图,分别是baseMap和sssMap
unity3d卡通渲染,Unity引擎Shader效果,unity,材质,游戏引擎,色阶化光影,二次元角色

baseMap
unity3d卡通渲染,Unity引擎Shader效果,unity,材质,游戏引擎,色阶化光影,二次元角色

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

unity3d卡通渲染,Unity引擎Shader效果,unity,材质,游戏引擎,色阶化光影,二次元角色
这个时候,通过获取漫反射的光照值来混合baseMap和sssMap,会得到这种效果。
不过这只是正常普通的HalfLambert光照效果,在卡通渲染里面,因为是模拟漫画的涂色方式,光影之间一般来说会有一个硬边的过渡,比如:
unity3d卡通渲染,Unity引擎Shader效果,unity,材质,游戏引擎,色阶化光影,二次元角色

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

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

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

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

这个方法需要准备一张色阶图:
unity3d卡通渲染,Unity引擎Shader效果,unity,材质,游戏引擎,色阶化光影,二次元角色

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

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

会得到这个效果:
unity3d卡通渲染,Unity引擎Shader效果,unity,材质,游戏引擎,色阶化光影,二次元角色

可以看出,刚才的色阶图的三个颜色都出现在模型身上了,而且三段颜色的占比,可以通过调节色阶图的颜色范围来控制。
接下来可以把这个色阶图的采样结果,和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);
}

unity3d卡通渲染,Unity引擎Shader效果,unity,材质,游戏引擎,色阶化光影,二次元角色

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

2、使用渐变图做色阶

色阶图其实也有缺点,如果想做到某些部位的色阶化强烈一点,某些部位的色阶化弱一点,其实是很难做到的。
所以出现了另外一种色阶图的做法,是渐变的
unity3d卡通渲染,Unity引擎Shader效果,unity,材质,游戏引擎,色阶化光影,二次元角色

可以看出,这张渐变图下面是硬过渡,上面是软过渡,如果我们采样的时候,可以不同部位控制采样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);
}

unity3d卡通渲染,Unity引擎Shader效果,unity,材质,游戏引擎,色阶化光影,二次元角色

加上了baseMap和sssMap的混合,效果就是:
unity3d卡通渲染,Unity引擎Shader效果,unity,材质,游戏引擎,色阶化光影,二次元角色

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

unity3d卡通渲染,Unity引擎Shader效果,unity,材质,游戏引擎,色阶化光影,二次元角色

可以看到,在使用smoothstep函数之后,通过控制smoothstep的最大值和最小值的参数,我们实现了不同部位的影子过渡程度不一样的效果了,甚至可以在某些部位减弱影子的效果。
混合了baseMap和sssMap,就是这种效果:
unity3d卡通渲染,Unity引擎Shader效果,unity,材质,游戏引擎,色阶化光影,二次元角色

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

三、完整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 100

        Pass
        {
            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 texture
                half4 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
        }

    }
}

到了这里,关于Unity制作二次元卡通渲染角色材质——2、色阶化光影的多种做法对比的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 原神3D卡通动漫二次元角色模型Blender已绑骨骼

    原神3D卡通动漫二次元角色模型Blender已绑骨骼

    3Dmax/C4D这类软件应该做三维的都知道。Blender知道的应该不多。一款跨平台开源的 3D 创作软件,可以在 Linux、macOS 以及 Windows 系统下运行。与其他 3D 建模工具相比,Blender 对内存和驱动的需求更低。 今天给大家分享一组Blender格式的资源,56个原神角色模型,2K高清贴图,带骨

    2024年02月11日
    浏览(14)
  • Unity 卡通渲染之角色篇

    Unity 卡通渲染之角色篇

    作为新博客的第一篇,就用卡渲作为开篇叭!毕竟是个二次元乐。本篇同步发表于http://chenglixue.top/index.php/unity/73/ 之前使用UE的后处理做过简单的卡渲,但因其灵活性很差,很多操作都需涉及到更改管线,且奈何本人在校用的笔记本,一次build就得好久,因此放弃对卡渲的深入

    2024年02月05日
    浏览(8)
  • 【Unity实战系列】如何把你的二次元老婆/老公导入Unity进行二创并且进行二次元渲染?(附模型网站分享)

    【Unity实战系列】如何把你的二次元老婆/老公导入Unity进行二创并且进行二次元渲染?(附模型网站分享)

    君兮_的个人主页 即使走的再远,也勿忘启程时的初心 C/C++ 游戏开发 Hello,米娜桑们,这里是君兮_,在正式开始讲主线知识之前,我们先来讲点有趣且有用的东西。 我知道,除了很多想从事游戏开发行业的人以外,还有更多的人学习Unity是因为兴趣爱好,想要让自己喜欢的角

    2024年02月12日
    浏览(14)
  • 【unity游戏开发教程】Unity+Umotion Pro+VRoid+Blender制作人物模型和动画,在unity中简单制作二次元人物动画

    【unity游戏开发教程】Unity+Umotion Pro+VRoid+Blender制作人物模型和动画,在unity中简单制作二次元人物动画

    大家好!本期教程教大家在unity中制作二次元人物模型和动画 1.下载VRoid Studio 1.搜索VRoid Studio下载即可,或者前往官网VRoid官网 VRoid Studio是由pixiv开发的一款3D人物建模软件,VRoid的主要特征就是通过类似绘画的方式进行人物的建模,使人们更为轻松地创造自己的虚拟人物。

    2024年02月10日
    浏览(10)
  • ai绘画二次元美女图片怎么制作,试试这三个方法

    ai绘画二次元美女图片怎么制作,试试这三个方法

    只要通过输入简单的文字描述,就可以得到多张高质量的艺术作品,怎么会有人错过这样的神仙工具! 我建议没用过的小伙伴都可以尝试一下,生图效果是真的很棒! 下面先给大家欣赏几张ai绘画风格不同的图片~ 看完我相信大家也心动了,下面马上分享三个简单易操作的

    2024年02月08日
    浏览(12)
  • unity NPR 卡通渲染

    unity NPR 卡通渲染

    NPR是计算机图形学中的一类,即非真实感绘制(Non-photorealistic rendering),主要用于模拟艺术式的绘制风格,也用于发展新绘制风格,形式一般是卡通造影。 NPR是Unity中的一种非真实渲染技术,它使用一种称为\\\"NPR\\\"的算法来模拟非真实渲染效果。这种技术可以用于制作各种类型的

    2024年02月05日
    浏览(7)
  • unity+webgl+websocket实时口型+二次元语音老婆

    unity+webgl+websocket实时口型+二次元语音老婆

    文章开始首先感谢 B站UP: 阴沉的怪咖 提供的最初资源包 2.gif 体验地址 体验地址 www.aixmao.com 不能放视频,看效果去B站链接:B站链接_bilibili UP主提供初始代码地址: Github地址:https://github.com/zhangliwei7758/unity-AI-Chat-Toolkit Gitee地址:https://gitee.com/DammonSpace/unity-ai-chat-toolkit 2、LipSy

    2024年02月02日
    浏览(13)
  • Unity-Chan Toon Shader卡通渲染学习

    Unity-Chan Toon Shader卡通渲染学习

    (本文记录一下从0-1复刻UTS2,持续更新中) Unity-Chan Toon Shader  2.0 (UTS2)  是一款用于图像和视频的卡通着色器,旨在满足从事卡通着色 3DCG 动画的创作者的需求。 UTS2开源项目地址: GitHub - unity3d-jp/UnityChanToonShaderVer2_Project: UnityChanToonShaderVer2 Project / v.2.0.9 Release (1)3 Bas

    2024年02月04日
    浏览(10)
  • 【Unity天空盒】卡通渲染中如何实现云的消散效果

    【Unity天空盒】卡通渲染中如何实现云的消散效果

    写在前面 完成大气渲染之后,接下来就是考虑云渲染了。因为我想做的天空盒本身是想跟着这位大佬Unity 卡通渲染 程序化天空盒 - 知乎里叙述的进程来的,里面云实现的是原神里的云,原神又是在崩3的基础上加上了消散效果。但现在能找到的一些教程or展示的视频里,很多

    2023年04月08日
    浏览(20)
  • 【Unity ShaderGraph】| 快速制作一个 卡通阴影色块效果

    【Unity ShaderGraph】| 快速制作一个 卡通阴影色块效果

    前言 本文将使用ShaderGraph制作一个卡通阴影色块的效果,可以直接拿到项目中使用。 对ShaderGraph还不了解的小伙伴可以参考这篇文章:【Unity ShaderGraph】| Shader Graph入门介绍 | 简介 | 配置环境 | 窗口介绍 | 简单案例 下面就开始看一下具体的制作流程,然后自己动手制作一个吧

    2024年02月06日
    浏览(11)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包