UNITY崩坏3角色渲染实践

Wesley13
• 阅读 1047

最近二次元手游,卡通渲染都挺火的。虽然公司没开这类型项目,但是渲染来玩一下也好,原理都是一样,比较简单。

在日式卡通中,《罪恶装备》、《崩坏3》的效果都很不错,都是几年前的产品,两者的渲染方式是类似的。

这里用的是《崩坏3》的手游模型,仅是学习,侵权必删。

shader贴图

崩坏3主要用到两张贴图:albedotex ilmtex,其中ilmtex,R通道表示高光的强弱,G通道表示阴影区域,B通道控制高光区域的大小(大概)

UNITY崩坏3角色渲染实践

基础模型

我们先看看崩坏3的基础模型。崩坏3模型设计,贴图配色,法线都做的很好,如果你们游戏模型效果不好,可能你们的基础模型做的比较差。

UNITY崩坏3角色渲染实践

基础模型

轮廓线

轮廓线的制作方式有很多,网上都很齐全,这里就不多说了,我这里采用把backfaces方式

o.pos = UnityObjectToClipPos(v.vertex.xyz);

拓展的话,可以用模型顶点色通道控制勾边粗细,控制z-offset去掉多余勾边,效果如下

UNITY崩坏3角色渲染实践

轮廓线

阴影

卡通渲染的漫反射,用的是halfLambert,然后smoothstep控制暗面与亮面的过渡平滑程度,加上ilm B通道中的阴影范围

float wrapLambert = (ndotl * 0.5 + 0.5) + ilmTex.g;

UNITY崩坏3角色渲染实践

阴影

但是脸部阴影比较脏,所以我们用wrap diffuse将脸部因为halfLambert产生的阴影去掉

float wrapLambert = (ndotl * _WrapDiffuse + 1 - _WrapDiffuse) + ilmTex.g;

再加上自身阴影

float wrapLambert = (ndotl * _WrapDiffuse + 1 - _WrapDiffuse) + ilmTex.g;

阴影部分+环境光+自身贴图效果

UNITY崩坏3角色渲染实践

阴影部分效果

高光

高光现在采用Blinn-Phong光照模型,再加上step 函数控制明暗

float3 halfVector = normalize(_WorldSpaceLightPos0 + viewDir);

UNITY崩坏3角色渲染实践

高光

边缘光

主要用smoothstep函数风格化,再乘以光照方向

float rimDot = pow(1 - dot(viewDir, normal), _RimThreshold);

UNITY崩坏3角色渲染实践

边缘光

然后整体效果加起来,如下

UNITY崩坏3角色渲染实践

整体效果

整体效果

不足

头发shader,可以改为各向异性shader

高光部分,如果我做的话,还是考虑用金属度,粗糙度贴图,再风格化高光

皮肤部分,加上sss效果,例如用PreIntergated贴图渲染

附上全部代码

Shader "Custom/ToonShader"

往期精选

Unity3D游戏开发中100+效果的实现和源码大全 - 收藏起来肯定用得着

Shader学习应该如何切入?

写出一手烂代码的19条准则


声明:发布此文是出于传递更多知识以供交流学习之目的。若有来源标注错误或侵犯了您的合法权益,请作者持权属证明与我们联系,我们将及时更正、删除,谢谢。

作者:LN0017

来源:https://zhuanlan.zhihu.com/p/140458348


More:【微信公众号】_ _u3dnotes


UNITY崩坏3角色渲染实践

本文分享自微信公众号 - Unity3D游戏开发精华教程干货(u3dnotes)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
3个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Karen110 Karen110
3年前
​一篇文章总结一下Python库中关于时间的常见操作
前言本次来总结一下关于Python时间的相关操作,有一个有趣的问题。如果你的业务用不到时间相关的操作,你的业务基本上会一直用不到。但是如果你的业务一旦用到了时间操作,你就会发现,淦,到处都是时间操作。。。所以思来想去,还是总结一下吧,本次会采用类型注解方式。time包importtime时间戳从1970年1月1日00:00:00标准时区诞生到现在
Stella981 Stella981
3年前
AndroidStudio封装SDK的那些事
<divclass"markdown\_views"<!flowchart箭头图标勿删<svgxmlns"http://www.w3.org/2000/svg"style"display:none;"<pathstrokelinecap"round"d"M5,00,2.55,5z"id"raphael
Wesley13 Wesley13
3年前
thinkphp3.2.3模板渲染支持三元表达式
thinkphp3.2.3模板渲染支持三元表达式{$status?'正常':'错误'}{$info'status'?$info'msg':$info'error'}注意:三元运算符中暂时不支持点语法。如下:           <divclass"modalhidefade"id'myModa
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
9个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这