Unity毛发材质shader笔记

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity毛发材质shader笔记相关的知识,希望对你有一定的参考价值。

参考技术A 本文主要参考了:
Fur Effects - Teddies, Cats, Hair ....
Unity Fur Shader 皮毛着色器

原文主要介绍了如何使用多个layer(pass)来模拟毛发的体积感,其中每个pass之间采用alpha混合,沿着法线越往外的layer的alpha为0的区域越大,以模拟毛发从根部到顶部越来越尖的效果。

具体计算的每层的alpha的方式是使用一张噪声图,然后对取到的噪声使用一个clamp操作,低于阈值的噪声值其alpha为0。这个阈值越往外越高,使得毛发从根部到顶端越来越窄。

因为毛发越靠近根部越密集,可以认为越靠近根部会吸收更多的环境光。于是我们给靠近根部的毛发颜色一个衰减,可以看到图中添加AO后相比没有时更富有层次感和体积感。

然而仅有AO在某些情况下仍然不能得到较好的效果。例如当观察者视角和光照视角比较接近时,对于单色纹理往往看到的会是大片混合在一起的缺少对比度的相似毛发颜色,从而削弱了材质的效果。

我们认为光线在单根毛发表面同样会发生漫反射,因此可以近似的认为毛发背光的一面较暗(阴影部分)。加入了单根阴影的渲染可以让每一根毛发不再产生相同(或者相似)的颜色,从而增加了材质的层次感。我们可以看到上图的放大效果中,第二张图我们能够更容易的分辨出每一根毛发的形状。

这里具体的实现方式是:将光线方向通过TBN矩阵转换到表面UV空间取xz分量得到一个UVOffset方向,然后在fragment shader中采样并计算原始UV的alpha和偏移后的UV的alpha,如果alpha的差是大于0的话那么显然这个部位就是背光部分。

这里我的想法是采用一种类似头发高光的各向异性高光(Kajiya-Kay),原理这里就不讲了,具体就是拿毛发的切向量和半角向量取sin值。

实践中取切向量的方式是在vertex shader中拿当前顶点的位置减去上一层顶点的位置。

不过最后出来效果还不是特别好,高光表现的不太连续给人很大的噪点感,另外明显能看到面与面之间的差别。

对于面与面之间的这个问题应该增加面数就能解决,这里采用的是自带的sphere所以可以理解。我个人想法是之后还需要对tangent做一下处理,目前感觉来看高光主要集中在毛发尖端。

部分光线会穿过毛发内部进入观察者的眼镜,因此我们可以加入透射效果增强毛发的质感。这里我们可以添加一个和光源方向无关的来自环境光的rim light,以及来自光源的透射光。

直射光的透射方程仍然使用dot(-V,L)取一个指数幂控制扩散大小,最后也要乘以1 - dot(N,L),以避免背面不会被光线照射到的部分也出现透射光。

第二个博客中实现了原文中的基础效果和力场效果,使得毛发收到类似重力的影响。本次实践我将毛发的力场与物体的运动相结合,制造出了一种动态效果,不仅能看到形态上的变化,也能看到反射的高光根据运动的变化而变化。

类似的效果不仅能做皮毛,也能做成草地之类的效果,同时还能再引入一个纹理去变化顶点的位置来模拟草地被风吹拂的动态效果。

Unity学习笔记2:材质与着色器

Material:材质,本质上是shader的实例

选中物体,在Inspector中,可以看到材质的内容。下图的Element 0可以填上具体的材质。一个对象可以放多个材质。

Unity默认材质是无法修改的,(应该只有初学者才会用默认材质吧)。

Inspector:检测器?选中对象或者资源,都会展现出里面的属性

经常听到策划可客户端在谈论材质球,是不是因为创建的时候选了个球形,其实球字是多余的?

如果删掉或者默认是None的时候,就能看到一团紫色。就是平时游戏里面看到的材质丢失了。

不知道是不是做视频的老师是不是专门做视频没怎么做过项目,还是不同公司对某些名次有出入。百度的时候有些名词是不同的。

很多新名词,大多数主要是先确保自己知道一下就好了,碰到困难去问人,去讨论,至少知道问什么。解决这个问题,对有经验的人来说已经入门一半了。

Project下的Create按钮,可以创建各种各样的资源。可以创建材质

Rendering Mode:渲染模式,据说这个比较重要,要记住。

Opaque:不透明,用于渲染所有不透明的物体

Cutout:镂空,去除α通道(透明通道),用于渲染镂空的物体

Fade:隐现,渐变,用来实现渐隐渐现的特效

Transparent:透明,用来渲染有透明效果的物品

Albedo:基础贴图,决定物体表面纹理于颜色

直译反射率,不过网上都说英文的样子。

右边选择颜色,左边那个选择贴图。(Texture:纹理,就是贴图)

纹理:纹理必须挂在材质之下。

把图片直接拖放到场景中指定物体的时候,会自动在纹理的目录下创建Materials目录,生成一个默认的材质

下面这些知道一下就行了,基本上是美术的工作。

Metalic:金属,使外观具有金属特性

Smoothness:光滑度,设置物体表面光滑程度

Normal Map:法线贴图,描述物体表面凹凸程度

Hight Map:高度贴图(也称为时差映射)

Occlusion:遮挡

Detail Mask:

Emission:自发光,控制物体表面自发光颜色和贴图

Tiling:平铺

Offset:偏移

shader:着色器,专门用来渲染3D图形的技术,可以使纹理以某种方式展现。实际就是一段嵌入渲染管线的程序,可以控制GPU运算图像效果的算法。

着色器可以选择不同的方式,不同方式下有不同的特性。

纹理、着色器与材质的关系:

虽然很多东西看起来是美术的,不过在深度优化的时候,可能需要用程序来实现一些美术的效果。可能是要写着色器的代码的。另外有些特殊的效果也是需要自己写着色器的,unity自带的着色器可能不满足某些需求。

以上是关于Unity毛发材质shader笔记的主要内容,如果未能解决你的问题,请参考以下文章

Unity Shader入门精要学习笔记 - 第3章 Unity Shader 基础

Unity Shader 学习笔记Shader变体Shader属性定义技巧自定义材质面板

Arnold for C4D 10 【材质(四)】Hair Shader 毛发着色器

Unity Shader入门精要学习笔记 - 第17章 Unity的表面着色器探秘

unity3d 材质概述 ---- shader

unityshader怎样赋予材质球