Shader Forge 应用教程


Shader Forge 应用教程

Created by miccall (转载请注明出处 miccall.tech)

文章所用的模型 密码: rry8

  • 基本的.使用方法.不讲

  • 基本的界面.布局.不讲

  • 基本的创建.连接.不讲

一.shader 基础材质

创建diffuse(漫反射)

  • 新建一个Texture节点 (按住键盘的T键 选择Texture) 然后吧我们需要的材质选择进去

  • 顺便给这个节点七个名字 方便在Inspector面板中方便找到对应的贴图

图片名称

  • 然后我们选择我们创建好的shader 他的材质就变成了这样

  • 如果没有图的话 还得自己去选择图片贴过来

图片名称

  • 然后给模型附上这个material 模型就有了我们的贴图了

  • 但是这样 他是不受任何光照的影响 他只有一个影子 没有反光 没有高光 甚至有些时候看不出他的材质

图片名称

添加diffuse-color(漫反射颜色)

  • 如果你觉得材质贴图的颜色不好看的话 想要动态的改变颜色 也是可以的

  • 新建一个Color节点 (按住c键 选择Color节点)

  • 新建一个乘法节点 (按住M键 选择Multiply节点)

  • 然后如图的方式连接好

图片名称

  • 然后在Inspector中 你就发现 他多了一个颜色选择框

  • 我把它设置浅绿色

图片名称

  • 然后看看模型 他的颜色就变了

  • 你也可以自己试着更改逻辑 让他的混合强度变化更明显或者不明显

图片名称

创建specular (镜面反射)

  • 这是着色器镜面高光的颜色。值越高就越明亮,黑色完全不受着色器影响

  • 那我们这里先直接创建一个Slider(你还没学会 ?按键盘首字母)

  • 然后这样连接

图片名称

  • 他是个滑动条 你可以设置他的取值范围

  • 亲手试试 ,不要只看教程不动手

图片名称

  • 然后自己拖动看看 他的反射效果已经很明显了

  • 看图片没发现吗? 你可以仔细观察对比两个图


图片名称

- 创建gloss (光泽)

  • 这是镜面高光的指数。值越高光泽度越高,值趋近于 0 时将变得没有光泽。请注意,如果您取消选中光泽重映射,则应避免使用低于 1 的光泽值。

  • 结合镜面反射 我们同样给他一个Slider

图片名称

  • 当slider值很小时

图片名称

  • 当slider值很大时

图片名称

  • 当slider值适中时

图片名称

- 创建法线贴图

  • 法线贴图 能让一个低端模型 看起来有高端模型的效果

  • 创建一个Texture节点 把他的类型改成Normal_map

图片名称

  • 法线贴图都是蓝紫色的

  • 如果这里没图片 重新选择一下

图片名称

  • 然后看看模型 是不是有了更好的纹理质感

图片名称

- 创建高光贴图

  • 高光不能满足我们对不地方的反射光强度 我们就用一张高光贴图来解决

  • 原理是什么 我们用一张黑白灰的图 乘以一个slider 他会让黑色更黑 白色更白

  • 我们说高光的地方 就是白色反光 黑色不反光

图片名称

  • 同样 选择图片

  • 更改值 看看效果

图片名称

  • 也许你对效果不是很敏感 没事以后用到的时候 你会有一个思路就行了

图片名称

- 加和乘的区别

  • 为了加深一下刚刚的理解 我对加法和乘法做了一个对比

  • 当一张图与黑色做运算

图片名称

  • 当一张图与白色做运算

图片名称

二.shader 基础光源

默认的光照系统

图片名称

  • 然后我们要自己来建立自己的光照系统 首先可以先把默认的全部删除

  • 得到一片黑

图片名称

  • 然后我们一点一点的重建光照系统

漫反射光照模型

  • 以下讲一点小理论 不想看可以略过直接看图片

  • 它不包括任何镜面属性,对粗糙物体来说,这项属性是非常有用的,它不会反射出周围的环境。

  • 它多用于不光滑的表面,是一种自然材质,常用来表现自然界的物体材质,如:木头、岩石等。

  • 漫反射光的强度近似地服从于Lambert定律,即漫反射光的光强仅与入射光的方向和反射点处表面法向夹角的余弦成正比。

  • 我们也使用的就是这个Lambert光照模型

  • 原理公式:


        diffuse = I * cos(N,L)

图片名称

  • diffuse:反射光线的的光强

  • L : 入射光线的方向向量

  • I : 入射光线的光强,方向和L相同

  • N : 物体的顶点法线向量

  • cosθ:入射光线和该顶点法线的余弦,如上图所示;cosθ = L · N

  • 这里的cos是要用点乘(dot product) 才能计算的

  • 所以,最后的我们要的表达式为:diffuse = I · Dot( L , N ) ;

  • Dot运算:本质上,对于两个标准化向量,它输出它们相互远离的距离。 如果它们指向相同的方向,则它输出1,如果它们彼此垂直,则它输出0,如果它们指向相反方向,则输出-1。

  • 我们勾选 positive属性 使所有负值都等于0 ,这是要避免被后面射入的光照亮。


        diffuse = I *  max ( 0, cos(N,L) ) //把小于0的部分都置为0
  • 图片是之前截图的 属性还是标准的没改过来

  • 注意 Dot

  • 说了一大堆理论 还是实际的简单 来看看

图片名称

  • 当我么画写完这个图形 我们可以去看看shader的源码

        float node_2771 = dot(i.normalDir,lightDirection);
        float3 finalColor = float3(node_2771,node_2771,node_2771);
        fixed4 finalRGBA = fixed4(finalColor,1);
        UNITY_APPLY_FOG(i.fogCoord, finalRGBA);
        return finalRGBA;
  • 内部实现也跟预想的类似 如果你学过shader lab 的话 就非常面熟了

  • 这里简单讲解 深层的东西就不提了

  • 然后看看效果 简简单单 基础几何体

图片名称

光衰减和阴影

  • 基础的做完了 但是效果也就只能骗骗婴儿了吧 来我们一步步完善

  • 还有那些不足 光影效果 灯光衰减 影子叠加

  • 很简单 直接告诉你 这样达到了效果 至于原理 – 这里我就不讲了(其实我也不大懂了 以后慢慢研究)

图片名称

  • 这样,光线照射的影子就可以投射上去了 阴影的强弱也变化明显了

图片名称

颜色光

  • 来我们继续讲 要物体反射光的颜色

  • 我们得先创建一个点光源在他旁边 然后改一个颜色 看到物体并没有受到这个光的影响

图片名称

  • 创建color节点

  • 连接

图片名称

  • 我们就可以看到他反射的颜色了

  • 这里还可以再提一个理论 就是色光

  • 上一个地方我们提到的 入射光线的光强 I 具体的计算方式为

    I = Cl * Cm
  • Cl 表示的是 光源的颜色

  • Cm 则是 材质的漫反射颜色

图片名称

反射光

  • Phong和Blinn-Phong是计算镜面反射光的两种光照模型,两者仅仅有很小的不同之处。

  • 我们这里使用简单的Phong 而官方的是Blinn-Phong

  • 课外知识 两种模型的比较

  • 这两种都是经验模型 就是说 他不代表的真实情况 。

图片名称

  • 如图所示 ,计算高光反射 ,我们需要知道的信息也比较多

        specular = I · power( dot( V , R ) , gloss )
  • I 不多说了 ,上面已经提到过 但不同的是 这里的 I 表示的是高光反射光强

  • v 视角方向 , R 反射方向

  • gloss 我们要调整的光泽度

  • 同样我们避免负值 需要做一些调整


        specular = I · power( max (0,dot( V , R ) ), gloss )
  • 具体来看看这个的连接方法

  • 跟公式有所不同 我们需要在原有的基础上 添加高光反射

图片名称

  • 这个反射模型的效果就出来了 我们再来慢慢改进

图片名称

  • 先添加法线贴图

图片名称

图片名称

  • 防止颜色过曝

  • 接着上面的模型,我们把他完善 先在他的左前方添加一个蓝色的点光源

  • 按照公式 我们这样连接

图片名称

  • 感觉有点油腻 ?

  • 我们试着改一下参数 看看效果 一步步来改进他

图片名称

  • 高光反射结合镜面反射

图片名称

图片名称

添加材质贴图

图片名称

图片名称

更改材质颜色

图片名称

图片名称

添加菲涅尔边缘光

图片名称
图片名称

做完了 来个大合照

图片名称点击看大图