9.01_置换原理及应用案例
置换它本质上,也跟顶点偏移有些类似,它其实就是把顶点,基于这个高度图产生一个偏移,只不过,它还是有一些区别的,因为置换需要一个高面数,才能有比较好的效果,所以说,我们可以开启它的一个实时细分的功能
高度图也就是置换贴图,白色的地方代表的凸起,黑色的地方代表的凹陷,或者说它不会产生变化,它就是一个平等,然后它越白它越向上凸起
开启曲面细分 选择"PN_Trangles"模式
切换到线框模式,当我们距离比较远的时候,它这个面数会下降,而靠近可以看到线框会产生一个细分
一旦开启这个选项,它就会自动对个模型进行细分
那么可以看到它开启了PN_Trangles选项,就激活了以下两个节点
World Displacement 输入置换贴图
Tessellation Multiplier 控制细分次数
World Position Offset 只能对自身的顶点进行位移
world Displacement 可以对细分出来的顶点产生偏移
Crack Free Displacement 补面/使用曲面细分时防止网格体表面出现皲裂
Max Displacement 防止产生破裂效果
一个材质最多可以采样16张贴图
选中所有图片,切换"Shared Wrap"模式,就不会单独的消耗采样的数量
这里你可以看到这个纹理采样,它已经用了12个,那么这边如果你还有一套贴图,就比如说我还需要连接环境光遮蔽,那么你又需要连接三张,那么这边它就是15个采样,如果你还需要控制它的金属度,这个16个采样它就不够了,这边我们就只需要把这个纹理采样全部都给它选上,我们可以切换,把所有的纹理采样全部给它框上,这边我们可以切换它的这样的一个采样模式,我们给它切换成"Shared Wrap",就不会单独的消耗采样的这个数量。可以看到它的这个总数就只有四个,这是因为PBR它本身已经用了几个,所以说它现在只有一个采样,这是一个采样槽的共享模式,我们如果给它修改成这个模式,那么我们就可以使用非常多的纹理采样,而不再局限于16个,当然它这里的上限还是16个,只不过它们这些纹理采样它只是共享的一个,也就是说你把它们的模式都调成"Shared Wrap",它就只算一个采样
9.02_视差原理及应用案例
法线贴图就是通过改变光影来实现一个凹凸的效果,但是,一旦你在一个边缘看,没看到它上面还是一个纯平面,所以说法线它能实现的效果,它是非常有限的。那么这个高度图我们可以用它来制作一个视差的效果。
关于视差,它实际上本质的原理就是基于我们相机的角度,对这一张贴图的采样进行一个变化。
Camera Vector 相机向量
我们使用相机向量可以采用贴图,那么这个贴图就会随着我们的相机的角度产生变化,那么这边它是一个普通的贴图,那么它就需要XY轴单独的拿出来,通过Mask连上去,这就是一个基于咱们的相机视角对这个纹理进行一个采样的扭曲。其实这个就是视差的原理,就是基于相机的视角把这个纹理进行一个扭曲,那么它扭曲的规则就是 高度图,这里它是一个整体扭曲的效果,这个当然就不对了,我们希望的是它凸起的地方会随着我们的相机产生一个采样的变化,而它不凸起的地方它就不会产生变化,这样的话就可以模拟一个高度的凸起
注意事项
那么这边我们就是不是可以给它乘起来。注意,这里我们选的是单通道,如果你把三通道连上去,它就会出错。因为Mask是一个二维的,那么你如果连接一个三维,它就会出错,OK,这个一定要注意,你在做材质的时候一定会遇到这个问题。
旋转视角可以看到它会产生一个变化,它这个变化就是基于CameraVector相机向量。来产生的这样一个变化,它就可以模拟一个凹凸的感觉,因为它是随着 相机变化的,当我们相机产生变化,它就会跟着变化,那么这个解释很抽象,但是它实际上就是这样一个原理,就是基于我们的相机向量和这个高度图作为一个权重,来决定我们的这一个贴图它要如何进行一个采样。那么当我们相机产生变化的时候,这个高度它比较白的地方就会产生一个随着相机变化的一个效果儿,比较浅的地方,也就是比较黑的地方,它不会产生变化,那么这个就是视差的根本原理。但是这边你可以看到它还有它还是有非常显著的一个问题的,就比如说可以看到它这个地方的扭曲,是,这个效果是非常难看的,当然如果我们在这个视角来看,它可能会比较好看,
但是一旦是一个比较极端的视角,就会产生这样的扭曲效果,它甚至还不如法线贴图
我们要如何解决它?实际上我们只需要把这个高度图减去Sub一个0.5,那么现在的这个效果就会比之前好看很多,而且,它这样的一个深度就会更深
它实际上是一个什么样的原理?它就是把这个高度图,它整体的向下偏移了一个0.5,这边画图来演示一下,这个是我们的这个高度图,黄色横线是高度的一个平面,黄色横线高度为0,黄区曲线高度为1,整体给它减个0.5,就是相当于把这个高度图它整体向下偏移了一点。红色曲线来代表向下偏移的负0.5,那么零还是在这个地方,然后最高就变成0.5,这个高度图它就像下陷了,也就是说它就能得到一个更加大的一个范围,所以可以感觉到它变得更深了
实际上在引擎里面它有一个节点,就是我们和这个是完全一样的效果,就是的BumpOffset凹凸偏移,这是我们自己做的,也可以看到效果是没有任何区别的,这个凹凸偏移,它内部实际上就是这样的几个节点,它的公式就是这样的,把高度图减去0.5,再和我们这个相机向量的XY通道进行一个相乘,再把这个值乘以一下,让它变小,用它来控制强度,再和这个纹理坐标进行一个相加,把它作为我们贴图的纹理采样的一个纹理坐标的输入。这就是凹凸偏移它的一个根本的原理公式。
它的这个视差效果,在我们绝大多数正常的视角下,它能都能表现出一个非常棒的细节,但是,它会有一个很严重的问题,首先,你可以看到在这个视角它就很难看,而且, 它没有办法产生一个自遮蔽的效果,就是说它明明这个地方,它是凸起的,就是它会比这一个地方它要更高一些,更凸起一些,但是我们在这个视角,我们依然没有办法看到它的一个自遮蔽的效果,也就是说它没有办法产生自遮蔽的效果,而且在一些极端的视角,它也会产生一些很不好看的效果。但是,它在绝大多数情况下,就是我们游戏的正常视角,它都能表现出一种非常棒的视觉效果,当然它还是可以改进的,这个是视差的根本原理
陡峭视差映射 Steep Parallax Mapping
这个实际上,它就是把高度图进行的一个分层,可以看到它把高度图切成了很多层,然后,对每一层进行一个采样,那么这样的话,如果你的层数越高,它产生的那个效果就会越好,如果你这个层数比较低, 那么它的性能也是一个可控的,就比如说它把这它在这边切一层,然后,对这一份高度图进行采样,把我们的纹理进行偏移,然后再到这个地方再切一层,那么对它采样在进行一个偏移,层数越高,那么它对这一个高度的采样也就会越精准。
视差遮蔽映射 Parallax Occlusion Mapping
那么我们要讲的其实是这一个就是我们的视差遮蔽映射,它是我们的一个陡峭视差映射的一个改进版本, 那么实际上它和这一个陡峭视差映射,它中间有一个 插值 的计算,它会把这个地方进行一个 插值 ,那样的话,在一个相对比较少的采样次数面 产生一个更好的视觉效果,但是,它的细节就会下降,因为它这边插值它会把中间的细节给它跳过,而且它会在我们的这一个高度数据,就是我们高度图,它产生一个巨大的变化,就比如说它刚好在这两层之间,我们这边我们就简单的画一下,它刚好会在两层之间,它产生一个非常。巨大的变化,那么这个变化就会跳过,因为它是插值上去的,那么这一段它的细节就全部跳过了,它就没有了。
HLSL代码
那么它需要输入一个高度贴图,这个输出的是浮点,和它不兼容,这是因为它要输出一个纹理对象,它不能把纹理采样直接输入给它,那么我们右键将它转化为纹理对象就可以了
Heightmap Channel(V4)
DitherTemporalAA(DTAA模糊)
9.03_像素深度偏移原理及应用案例
置换,它是把这个顶点向上或者是向下进行的一个偏移,那么我们的视差能不能也让它的像素产生一个偏移,这样的话,我们是不是就可以使用这种方式来做出一个看起来它可以穿透这个平面它的一个虚假的深度效果,这个就是像素深度偏移,它就可以实现这样的效果。