【Blender 水墨材质】实现过程简单剖析

这篇具有很好参考价值的文章主要介绍了【Blender 水墨材质】实现过程简单剖析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

写在前面

想把Blender一位大佬演示的Blender水墨材质过程,在Unity用Shader重现,过程中会拿能拿到的节点代码举例(ShaderGraph或者UE的都会有)。第一步当然是要跟着人家做一遍!我会尽可能地分析一下每一步的原理~

教程:blender水墨材质制作演示

【2023.7.20补】直到今天我才知道blender能看源码。。。所以当时为什么要自己一个一个试呢???放个链接:blender/blender: The official Blender project repository. - blender - Blender Projects 


1 描边效果+内部颜色

节点一览:

【Blender 水墨材质】实现过程简单剖析

Fresnel节点

【Blender 水墨材质】实现过程简单剖析

这个节点其实实现的是菲涅尔效果,严格遵守“入射角越大,反射光越多”,直接拿n和v来判断(跟BRDF里的F项关系不大,F项是微观的vh),几乎都是用来计算视角边缘区域——以实现边缘光或者描边的效果。

UE里蓝图也有相似节点——Fresnel节点,节点代码:

half Fresnel(half Exponent, half BaseReflectionFraction) 
{
    half NoV 	= max(dot(N, V), 0.0f);
    half Fres 	= pow(abs(1 - NoV), Exponent);
    Fres        = Fres * (1 - BaseReflectionFracetion) + BaseReflectionFraction;
    return Fres;
}

其中F0是基础反射率,相当于(Exponent为5的情况):

【Blender 水墨材质】实现过程简单剖析

ShaderGraph也有对应的Fresnel Effect节点,节点代码:

void Unity_FresnelEffect_float(float3 Normal, float3 ViewDir, float Power, out float Out)
{
    Out = pow((1.0 - saturate(dot(normalize(Normal), normalize(ViewDir)))), Power);
}

输入的Power相当于UE里的Exponent,用以控制边缘强度。

但是Blender只有IOR项。

IOR影响的是什么

我们先看看这张图,是把Fresnel放在自发光层为了让反射率可视化,Fresnel节点输入的IOR值越大,意味着每个像素的反射率越高(像素点越白),那么颜色过渡的范围就会缩小,IOR大到一定程度,菲涅尔效应就几乎没有了。

【Blender 水墨材质】实现过程简单剖析

ColorRamp节点

你会发现虽然是ColorRamp,但输出的值仅仅是一个数Factor,去参与混合Shader,所以!这里的ColorRamp实际上只是在用黑白两个色去规范取值,原始的Fresnel值输出是这样的:

【Blender 水墨材质】实现过程简单剖析

所以需要Ramp一下让边缘别这么太过渡,边缘硬一点、交界明显一点。

然后拿这个硬一点的结果,MixShader一下,两个Emission材质仅仅是用来给定内颜色和边缘颜色的。

那么第一部分,边缘,如果在Unity里实现,直接以nv判断边缘再ifelse条件去硬化边缘就行!

当然,实际上ColorRamp远不止这样,有时候还会有多个Factor+多个Color同时组成一个Ramp图,TA意识觉醒——要是能用代码方式实现一个ColorRamp

有大佬在Unity Shader实现了Color Ramp:[技术美术Demo]-小工具制作Ramp图

知乎上也发现了一篇:实现Unity 后处理特效 (3) _渐变 Ramp

以及:【Unity工具】使用Shader快速实时生成复合Ramp图

完美!后期复刻一个出来吧,作为实现水墨风小Demo的一个小分支,丰富自己作品的工作量。

2 滤波纹理添加勾线细节

节点一览:

【Blender 水墨材质】实现过程简单剖析

这部分简单,就是用噪声纹理当作一张Bump Texture,然后连给Fresnel节点的Normal通道,相当于改变dot(n,v)计算的n,单独输出影响之后的Fresnel:

【Blender 水墨材质】实现过程简单剖析

因为我们看到的东西中间都是纯色的、再加上水墨风格需要的颜色比较淡、所以说这里仅仅算是给描边做了一个细节遮罩,让他有一种笔触感,当然在实现的时候可以直接传入笔刷Texture,采样这张Texture后,改变worldNormal就行。

3 丰富内颜色

节点一览

【Blender 水墨材质】实现过程简单剖析

单独预览Mix后的效果:

【Blender 水墨材质】实现过程简单剖析

Layber Weight 层权重

这就是个神奇的节点!很多效果都有它的身影,我们一点一点看。

骨骼的权重

在骨骼动画里,权重值越高,该节骨骼对相应网格的影响便越大,由于存在多节骨骼对相同网格存在影响,此时便要通过权重值来决定优先级。所以骨骼绑定也叫做刷权重。( 解释参考自Unity骨骼动画的总结)

Shader中的权重

权重在Shader里指——两个系数A和B谁占比更多,比如Mix Shader:

【Blender 水墨材质】实现过程简单剖析

权重就是Factor参数——Factor越小,代表Color1在输出中的占比越小。代码表示的话可以是:

float4 MixShader(float Fac, float4 Color1, float4 Color2){
    return Fac * Color1 + (1 - Fac) * Color2;
}

层的权重-Fresnel

Layer Weight本身节点如下:

【Blender 水墨材质】实现过程简单剖析

Fresnel输出效果有点类似Fresnel?如果把上面实现描边的Fresnel换成Layer Weight看看有什么不同,

【Blender 水墨材质】实现过程简单剖析
连Fresnel节点
【Blender 水墨材质】实现过程简单剖析
连Layer Weight节点

惊,只要参数正确,效果是一样的,且Blender参数在(0,1),调整起来比IOR更容易一些。

层的权重-Facing

面朝向输出,我们如果单独输出Facing值:

【Blender 水墨材质】实现过程简单剖析

对于球来说,越到边缘越白(亮),中间越黑(暗),事实上由于球的表面是平滑过渡的,法线也是平滑的,中间相当于视线垂直于面(n和v夹角为0),边缘相当于掠射(夹角为90°)。

啊,这时候就有疑问了——感觉和菲涅尔输出差不多意思,掠射为白,垂直为黑?

球简直是个个例,我们给球法线扰动一下,然后加上ColorRamp去对比一下输出Fresnel和输出Facing的区别:

【Blender 水墨材质】实现过程简单剖析

左为Fresnel,右为Facing,为了对比更明显Blend参数都设置为0.5,给了噪声贴图传入Bump作为Normal输入,测试节点大概长这样:

【Blender 水墨材质】实现过程简单剖析

对比下来你会发现,Facing更贴近于通过n去影响最终的占比,v越是掠射,越是贴近ColorRamp的最后一个色值,v越是垂直,越贴近第一个色值,而角度处于中间部分,就开始在色值上面均匀取色。

而Fresnel很大程度就是在扮演菲涅尔效应的角色,变化永远围绕着那个菲涅尔效应的光环去实现影响:

【Blender 水墨材质】实现过程简单剖析

想看更加清晰的对比,我们把ColorRamp提升到三个色值变化(啊啊颜色随便取的,意在做测试,有点丑orz):

【Blender 水墨材质】实现过程简单剖析

仍旧是左边Fresnel右边Facing,这样差别就超级明显了!!Fresnel边缘一点,Facing是全局的变化。

可以参考这篇文章,相信你会对面权重节点有更加清晰的认识:Blender着色器节点教程 —— Layer Weight

层权重-Facing节点其实在Blender是很常用的,怎么在代码里用函数表示呢?实际上就是一个将n*v值原原本本作为一个影响因子输出了,比较下来Fresnel输出公式需要有额外的乘法去拟合菲涅尔效应。感兴趣的话可以关注我后面的uniyt shader实现篇!

接着回到我们的水墨节点部分。

擅用Noise和ColorRamp

首先,层权重输出面朝向+ColorRamp:

【Blender 水墨材质】实现过程简单剖析

和NoiseTexture,

【Blender 水墨材质】实现过程简单剖析

二者Add一下:

【Blender 水墨材质】实现过程简单剖析

这很好理解吧,白的通道都是1,黑的0,0+0=0,0+1=1,所以中间白起来了!

接着ColorRamp一下,给他边缘颜色加深,当作遮罩:

【Blender 水墨材质】实现过程简单剖析

接着又老操作,NoiseTexture+ColorRamp搞了两个颜色:

【Blender 水墨材质】实现过程简单剖析

【Blender 水墨材质】实现过程简单剖析

用上面的遮罩Mix这两个效果Color,暗一点的作为第一个Color,亮一点的第二个,效果的话就会是遮罩黑色部分(0)完全取第一个Color,白色部分完全取第二个Color,中间的取二者mix的过渡,最后的效果就会是:

【Blender 水墨材质】实现过程简单剖析

和描边效果混合

还记得最开始的两个Emission,一个是内色、一个是秒变色:

【Blender 水墨材质】实现过程简单剖析

把上面实现的颜色作为内色,最后的效果就是:

【Blender 水墨材质】实现过程简单剖析

有那味儿了有那味儿了!

4 加内描边

再次复用菲涅尔节点,拉个ColorRamp一下,内描边就有啦:

【Blender 水墨材质】实现过程简单剖析


这其实才是整个视频的前3min半,后面还涉及到了着色,打算先在Unity里做一遍看看!再继续。

2023.4.1更新:【Unity Shader】尝试复刻Blender实现的水墨效果

Unity里Shader复刻了一下,

【Blender 水墨材质】实现过程简单剖析

【Blender 水墨材质】实现过程简单剖析文章来源地址https://www.toymoban.com/news/detail-419450.html

到了这里,关于【Blender 水墨材质】实现过程简单剖析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • Blender批量删除(清空)场景中的材质

    1.选中界面中右上角的  \\\"显示模式\\\" 2.修改为: \\\"blender文件” 模式,此时各选中材质一栏数据进行展开   3.全选所有要删除的材质,然后鼠标右键进行删除。  好了,是不是很简单~记得要不断进步呀!

    2024年02月14日
    浏览(28)
  • Blender——将模型及其所有纹理与材质导入unity

    前期准备 参考视频:7分钟教会你如何将Blender的模型材质导入unity_哔哩哔哩_bilibili 实验模型官网下载地址:Hoi An Ancient House Model free VR / AR / low-poly 3D model CSDN下载链接: 【免费】Blender三维模型-古代房屋模型(HoiAnAncientHouseModel)  对于常见的Blender文件,可以直接导入Unity,但

    2024年01月19日
    浏览(31)
  • 解决Bridge材质导入到Blender为白色的问题

    在Bridge上看到一块不错的草皮, 导入成功后是白色材质: 以前用这个方法导入过模型, 那时候还没启用汉化, 也没什么材质问题. 这次操作之前刚启用了汉化, 我猜是汉化导致: 取消勾选’新建数据’, 重启Blender重试导入即可. –

    2024年02月15日
    浏览(136)
  • 阿赵UE学习笔记——10、Blender材质和绘制网格体

    阿赵UE学习笔记目录   大家好,我是阿赵。   之前介绍了虚幻引擎的材质和材质实例。这次来介绍一个比较有趣的内置的Blender材质。   在用Unity的时候,我做过一个多通道混合地表贴图的效果,而要做过一个刷顶点颜色混合地表和水面的效果。   在虚幻引擎里面,

    2024年01月19日
    浏览(29)
  • pandas读取Excel核心源码剖析,面向过程仿openpyxl源码实现Excel数据加载

    📢作者: 小小明-代码实体 📢博客主页:https://blog.csdn.net/as604049322 📢欢迎点赞 👍 收藏 ⭐留言 📝 欢迎讨论! 今天我们将研究pandas如何使用openpyxl引擎读取xlsx格式的Excel的数据,并考虑以面向过程的形式简单的自己实现一下。 截止目前本人所使用的pandas和openpyxl版本为:

    2023年04月19日
    浏览(46)
  • 【Apache Pinot】简单聊聊前面没讲的 Deep Store 和 Cluster

    前面3篇文章讲解了 Pinot 用的最多的几个组件,现在就聊最后剩下的两个,一个是 Cluster,另外一个就是 Deep Store。 其实 Cluster 比较简单,就是一个概念的集合,他说有 Server,Broker 和 Controller 组成的。 我们已经在第一章篇文章里面大概讲述了每个节点的作用和每个节点相互工

    2024年02月08日
    浏览(32)
  • Blender:渲染一个简单动画

    接上 Blender:对模型着色_六月的翅膀的博客-CSDN博客 目标是做一个这种视频 先添加一个曲线,作为相机轨迹 然后添加一个相机   对相机添加物体约束,跟随路径,选择曲线,然后点击动画路径 假如对相机设置跟随路径后,相机的位置出现了闪现位移,只需要将相机的位置坐

    2024年02月07日
    浏览(32)
  • 如何用 Python 开发一个简单的 blender 插件

    Blender是一款开源的3D建模和动画制作软件,支持Python脚本编写插件。下面是一个简单的Blender插件开发示例: 首先,需要安装Blender软件,并确保安装了Python库。可以在Blender软件安装目录下的Python目录中找到相应的库文件。 创建插件的脚本文件。脚本文件可以使用Python编写,

    2024年02月11日
    浏览(47)
  • ES实现“小于XX时间”排前面(或后面)“大于XX时间”排后面(或前面)排序

    一位学生问我一个问题,实现es查询:对于查询的结果要分成两类【过期和没过期,按照过期时间判断】。没过期的排在前面,过期的排在后面。最后,不管是过期的还是没过期的,在组内都再按照标定时间字段进行倒排序。 是否过期通过 过期时间字段 进行判断。 对于此类

    2024年02月15日
    浏览(34)
  • Python selenium 简单的实现大麦网自动购票过程

    大麦网是中国综合类现场娱乐票务营销平台,业务覆盖演唱会、 话剧、音乐剧、体育赛事等领域 今天,我们要用代码来实现他的购票过程 先来看看完成后的效果是怎么样的 开发环境 版 本:anaconda(python3.8.8) 编辑器:pycharm 代码实现步骤 实现免登陆 选座并且下单 初始化加

    2023年04月14日
    浏览(29)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包