网资酷

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 110|回复: 1

(材质编辑器篇)【第六节:反射,通道,位置,遮罩及三 ...

[复制链接]

4

主题

5

帖子

13

积分

新手上路

Rank: 1

积分
13
发表于 2022-12-5 14:47:38 | 显示全部楼层 |阅读模式
反射与折射向量

许多游戏引擎都内置了反射,比如在虚幻引擎中将粗糙度设置为0,这一节是介绍背后的原理并让你可以自定义效果


原理:

  • 我们拥有一个表面,在表面上建立一个Normal,当我们看到surface时会放出Camera Vector,当我们想要知道我们能看到什么时,我们就需要新建一个反射向量,然后我们使用反射向量来查看那个方向有什么,类比于反射向量,我们还可以计算折射向量,这个折射率可以表示光线穿过表面时的弯曲程度
我们来到引擎中,我们就按照原理的思路来,我们需要法线和反射角度来求出反射应该来自哪个方向,然后该方向被用作对立方贴图的查找,最后得到的结果


于是我们就得到这样的图像,下一步加上贴图,这里我们用cubemap,就有反射的感觉了


我们再对比一下引擎自带的反射效果


两者之间好就好在,自定义的可以任意改变所反射的场景
再让我们看看折射,左四行分别是



  • 光线方向->视角方向,引入相机向量
  • 表面法线,同反射使用的表面反射节点
  • 折射率原点(一般来说时默认的,可自定义传入常量)
  • 折射率目标


这种感觉有点像放大镜
最后我们将反射折射合并,我们就得到既有反射还有折射的玻璃球,这里加上fresnel是为了还原边缘反射效果和中间折射效果,我们可以调整fresnel节点的exp值,就可以控制其反射折射的程度


Swizzle和通道操作

通道操作的意思是着色器和组件的通道操作就是通过连线从一个节点流向另一个节点存储在通道中,这个过程。

  • 这一节展示的操作是完全不消耗性能的,并且不会增减时间,但是当你执行数学运算时,对具有更多通道的数据进行操作的成本会更高
  • Ue/unity节点逻辑不同
  • xyzw=rgba(在某些条件下等式成立)
  • 如果想要过滤通道可以加上mask



  • 而如果我们想要加上通道,那么我们可以用append


这张图的结果是0.3,0.7,0.1,0.2

  • Swizzle节点就是用来交换通道的,比如交换uv通道,可以将你的图标旋转90°


位置信息节点

一般来说位置信息包括xyz值,回到引擎中

  • Absolute World Position引入世界坐标
  • LocalPosition本地坐标
  • Object Position引入对象空间
我们来看一个例子,通过本地坐标给物体从上到下进行渐变染色


第二种,我们利用对象空间进行一个垂直渐变,先将该位置乘以3,然后将xyz拆分,xy加在一起,z单独分开,然后我们取该对象的正弦波,然后再调整正弦波使其介于0~1之间


我们可以发现在场景中,当我们四处移动它时,它会根据它的位置进行变化(拥有不同的值)


第三种,就是我们用世界位置以米为单位,遮蔽X和Y


方向遮罩

在上一节的末尾,我们简单的展示了mask的作用,这一节将展示如何在虚幻中制作定向蒙版


这里我们首先取顶点法线的绝对值,这样我们就可以摆脱法线的负值,然后我们进行一个幂运算,用于控制遮罩的清晰度,再和(1,1,1)点积,得到一个实心为白色的遮罩,再用原值和遮罩值相除得到更好的边缘。然后我们可以使用拆分组件将蒙版分解成各自的方向(控制遮罩的定向位置),再和上一节的投影相乘,就能得到定向的节点




三平面投影

在有了定向遮罩的基础上,我们就可以利用三个方向的定向遮罩组成三平面投影。
我们这一节做的是在xyz方向的纹理投影到模型,我们有两种方法,一种便宜但有瑕疵,一种贵但好康


首先我们准备三组纹理坐标,然后用lerp进行混合,就得到一种扭曲效果


我们再修改一下幂运算的参数,增加遮罩的边界感,然后再添加Round节点来消除边界的伪影,我们就能得到三等分的遮罩


这就是便宜且有瑕疵(接缝)的方法,下面是贵的方法,分别采样纹理的xyz通道然后lerp,将幂运算节点改成8,再去掉round,就能得到无接缝的材质了,当以后我们要将三种贴图混合时就可以用这个方法


三平面投影改进

首先我们换张贴图,我们就可以发现实际的问题:1.叠加重合 ,2.贴图倒置。注:该方法只需要用于有顺序的贴图上,像鹅卵石这类无顺序要求的可以不进行这一步


那我们想想是怎么回事
我们首先解决贴图倒置的问题

  • 我们根据图像分析出现反转的轴是垂直轴

    • 解决方法:用世界坐标乘以(1,1,-1)去反转垂直轴,负负就得正

  • 但是,再次基础上,我们又发现水平轴出现的反转的情况,这时候就需要引入一个新的节点Sign,作用是返回一个1或者-1,取决于输入的数字与0的比较,给负数返回-1,给正数返回

    • 于是,我们开始修复水平轴(x,y轴),我们设置Sign后,取出xyz的遮罩,然后为每一个遮罩追加一个附加向量1,再用这个结果乘到投影上




  • 综上我们得到一个完整三平面投影效果
  • 然后我们新建一个材质函数,给他复制过去,并给一个材质的输入接口



  • 这个时候一个函数就完成了,我们就可以将这个函数变成一个节点用于其他材质上了,就做到了精简连连看的作用,还能开放接口给美术和策划去调整效果


三平面投影的法线

为什么要做三平面投影的法线,和上一节同理,我们需要一个自定义的效果,而不是用引擎自带的效果




咱们就是在上一节的基础上把颜色贴图换成法线贴图,当我们把颜色切换成法线颜色时,我们能发现,材质出问题了,我们投影的法线贴图,本来是在切线空间中的,这意味着和uv坐标相关联,所以我们要利用这一点来修复这个问题


因为这些法线投影到世界空间中,所以我们需要在采样后调整法线数据,从世界空间转换到切线空间下,然后把这些法线贴图与顶点法线结合起来,还要重新排列他们的通道,于是我们先从z轴出发进行调整,整个过程我们需要观察其三个通道的正反。
于是有一个整体的思路:

  • 在采样后调整法线数据,从世界空间转换到切线空间下,然后把这些法线贴图与顶点法线结合起来
  • 观察颜色的正反,有需要分别进行倒置


同理我们进行x和y轴的投影变化后在lerp在一起就完成了

回复

使用道具 举报

1

主题

7

帖子

13

积分

新手上路

Rank: 1

积分
13
发表于 2025-5-16 12:19:17 | 显示全部楼层
我只是路过,不发表意见
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|网资酷

GMT+8, 2025-7-6 03:30 , Processed in 0.283192 second(s), 22 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表