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

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

Unity制作二次元材质角色


回到目录

大家好,我是阿赵。
这里继续讲二次元角色材质的制作。这次是讲头部的做法。

1、脸部

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

之前在分析资源的时候,其实已经发现了这个模型的脸部法线有问题,导致在做光照模型的时候,脸部很奇怪。
把fbx文件导入到3DsMax里面,可以发现
Unity制作二次元卡通渲染角色材质——5、脸部的特殊处理

这个模型为了做口里面的牙齿和舌头的动画,把脸部的布线做得很极限。
然后尝试把整个脸打同一个光滑组,发现脸部的法线还是不能正常过渡,于是检查一下模型脸部的顶点,发现很多部位并没有焊接在一起。
Unity制作二次元卡通渲染角色材质——5、脸部的特殊处理Unity制作二次元卡通渲染角色材质——5、脸部的特殊处理

所以要解决脸部的问题,首先要先处理一下原始的模型,把该焊接的点给焊接一下。
Unity制作二次元卡通渲染角色材质——5、脸部的特殊处理

进入点层级,全选所有点,然后焊接一下。
接下来给整个脸打一个光滑组
Unity制作二次元卡通渲染角色材质——5、脸部的特殊处理

到这里,这个模型的脸部结构暂时来说比较正常。但由于脸部的结构特殊性,所以如果我们真的按照光照模型的NDotL去计算光影,脸部的光影在某些角度会非常的恐怖,比如这样:
Unity制作二次元卡通渲染角色材质——5、脸部的特殊处理

之前我写过2篇文章去解决这个问题,各位有兴趣可以去看看:
1.使用阈值图修改角色脸部阴影
Unity制作二次元卡通渲染角色材质——5、脸部的特殊处理

2.用MaxScript修改模型法线映射
Unity制作二次元卡通渲染角色材质——5、脸部的特殊处理

这里我选择了第2种方法去处理。
可以看到,集中在脸部的地方,法线非常的密集,而且方向比较的杂乱。这其实是正常而且合理的,因为脸部的转折很多。但用这些法线来计算光影,效果会很奇怪。
Unity制作二次元卡通渲染角色材质——5、脸部的特殊处理

使用我之前用MaxScript写的映射法线的工具,进行一下球形法线映射
Unity制作二次元卡通渲染角色材质——5、脸部的特殊处理
Unity制作二次元卡通渲染角色材质——5、脸部的特殊处理

现在脸部的法线就会变成很平滑的过渡,方向非常的统一。这样的法线对于脸部来说其实是不对的,但是在做光影的时候,会比较的正常。然后配合一下之前ILM贴图的G通道,把脸部的阴影减淡一些,就可以。
Unity制作二次元卡通渲染角色材质——5、脸部的特殊处理
Unity制作二次元卡通渲染角色材质——5、脸部的特殊处理Unity制作二次元卡通渲染角色材质——5、脸部的特殊处理
Unity制作二次元卡通渲染角色材质——5、脸部的特殊处理
这样看起来,脸部的影子就正常很多了。
这样看起来,脸部的

2、眼镜

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

如果只是赋予正常的身体材质,眼镜是这样的。
我们希望眼镜的效果大概有这些:
1.有基本颜色
2.有透明度,起码可以看到眼睛
3.有高光
4.有反射
所以我在身体材质的基础上做了一些修改:
Unity制作二次元卡通渲染角色材质——5、脸部的特殊处理

1.使用正常的透明混合Blend SrcAlpha OneMinusSrcAlpha
2.使用了BlinnPhong高光
3.还是用Matcap做假反射,不过找了一个和眼镜本身颜色比较接近的Matcap反射球
完整Shader:

Shader "azhao/ToonGlass"
{
    Properties
    {
        _BaseMap ("BaseMap", 2D) = "white" {}

		_specColor("specColor",Color) = (1,1,1,1)
		_shininess("shininess", Range(1 , 100)) = 1
		_SpecAdd("SpecAdd",float) = 1.0


		_MatCapTex("MatCapTex", 2D) = "white" {}
		_MatCapIntensity("MatCapIntensity",Range(0,2)) = 1
		_MatCapPow("MatCapPow",Range(0,5)) = 1
		_MatCapUVScale("MatCapUVScale",Range(0,1)) = 1

    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 100
			Blend SrcAlpha OneMinusSrcAlpha
        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;

			float4 _specColor;
			float _shininess;

			float _SpecAdd;

			sampler2D _MatCapTex;
			float _MatCapIntensity;
			float _MatCapPow;
			float _MatCapUVScale;

			//获取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)
			{
				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;
			}

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


				half specVal = GetBlinnPhongSpec(i.worldPos, i.worldNormal);
				float2 MatCapUV = GetMatCapUV(i.worldNormal)*_MatCapUVScale;
				float4 MatCapCol = tex2D(_MatCapTex, MatCapUV)*_MatCapIntensity;
				MatCapCol = pow(MatCapCol, _MatCapPow);



				half3 finalRGB = col.rgb + _specColor * specVal*_SpecAdd;
				finalRGB = finalRGB * (0.5) +MatCapCol.rgb*0.5;
				half alpha = col.a;
                return half4(finalRGB,alpha);
            }
            ENDCG
        }


    }
}

到这里,这个二次元卡通角色的材质基本上就做完了。下面说一下在这个例子里面,由于资源的原因没有做到的一些细节。虽然很遗憾不能做出效果,但也从理论上说一下应该怎样做吧。

1、头发

一般来说,头发如果有单独的问题贴图和法线贴图,比较容易做出一束一束的感觉。
可惜我这个模型素材里面,头发的贴图并没有单独的,只有一个和皮肤一样的baseMap,所以只能做到一片一片的效果。
Unity制作二次元卡通渲染角色材质——5、脸部的特殊处理

然后也可以稍微从高光的角度去调整一下。
之前用于身体部分的高光的光照模型是BlinnPhong,所以光照会是一片的,我们可以试试改成Anisortropic各向异性高光。

//获取Anisortropic各向异性高光
float GetAnisortropicSpec(float3 worldPos, float3 worldNormal, float3 worldTangent)
{
	float3 binormal = cross(worldNormal, worldTangent);
	float3 lerpVal = normalize(lerp((worldNormal + binormal), binormal, _tangentVal));

	float3 viewDir = normalize(UnityWorldSpaceViewDir(worldPos));
	float3 halfDir = normalize((viewDir + _WorldSpaceLightPos0.xyz));
	float anistropicVal = dot(lerpVal, halfDir);
	float specDir = max(anistropicVal*anistropicVal, 0);
	float specVal = pow(specDir, _shininess);
	return specVal;
}

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

各向异性的高光一般是用于做一条一条形状的高光,不过由于我这个模型实在有点过于光滑,也没有法线贴图,所以这种感觉不是很明显。

2、眼睛

为了方便观察,先把眼镜隐藏了
之前我们做内描线的时候,其实发现了一个特别的东西,就是这个眼睛的贴图,居然不是在baseMap,而是在ILM贴图的A通道
Unity制作二次元卡通渲染角色材质——5、脸部的特殊处理
Unity制作二次元卡通渲染角色材质——5、脸部的特殊处理

在这个眼球或者瞳孔的地方,我虽然加上了高光和Matcap,但发现眼睛他其实并没有什么效果。这是因为,这里的瞳孔其实只是2个平面,在平面上面,不论是高光还是Matcap都不可能出现眼球的球形高光变化。
这个时候,要么把眼球改成真的球形,要么,使用法线贴图。
如果有法线贴图。法线贴图的做法是先采样一个凹进去的部分,然后给他赋予颜色,再把法系翻转,采样一个凸出来的部分,在凸出来的部分上面做高光和Matcap。
由于我手上这个模型并没有提供法线贴图,所以这部分我暂时就演示不了。文章来源地址https://www.toymoban.com/news/detail-486383.html

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

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

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

相关文章

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

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

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

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

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

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

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

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

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

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

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

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

    2024年02月05日
    浏览(37)
  • 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日
    浏览(56)
  • 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日
    浏览(50)
  • 【Unity天空盒】卡通渲染中如何实现云的消散效果

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

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

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

    2024年02月06日
    浏览(49)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包