**使用折射** 2019年4月28日 1:42 当光线从一种媒介传播到另一种媒介时,例如从空气传播到水时,光线传播方向会在这两种媒介的交界处发生改变。 这种照明现象称为“折射”,是因为光线所接触的不同类型材质会改变光线传播速度而发生。 在虚幻引擎 4 中,您可以使用“折射”在材质中模拟这种照明现象。 **折射** 术语 **折射** 用于描述因传输媒介改变而使光波方向改变的现象。 换而言之,当光线投射到某些表面(例如水面或玻璃)时,光线会发生轻微弯折,因为这些表面会影响光线穿透它们的速度。 将铅笔的一部分放入水中,您即可看到折射效果的最佳示例。 由于折射原因,放入水中的铅笔部分看起来 像是在铅笔与水接触的位置发生弯折。 下面这个非常简单的示例说明折射如何发生。 ![R_Refraction_Example.png](file:///C:/Users/WUMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image002.jpg) 从摄像机查看时,由于折射原因,位于水下的铅笔部分像是发生弯折。 这是因为,来自原始铅笔位置 X 的光波受水折射影响,当通过摄像机查看时,好像是实际来自 Y。 出现这种现象的原因是,光线传播速度在光线投射到水面时发生改变,而遇到空气时会再次改变。 **折射率或** **IOR** 光学测量值 **折射率**(简称 IOR)可用于准确说明光线从一种媒介传播到另一种媒介时的弯折程度。 由于这种光学现象可测量,我们可以在 UE4 中使用这些测量值来影响折射,从而使我们的 3D 世界的现实感更加强烈。 以下是您每天都可能接触到的对象的一些 IOR 值。 | **材质** | **IOR** **值** | | -------- | -------------- | | **空气** | 1.00 | | **水** | 1.33 | | **冰** | 1.31 | | **玻璃** | 1.52 | | **钻石** | 2.42 | **在材质中使用折射** 通过遵循以下指示,可以设置使用折射的材质。 本教程假设您已将起步内容包括在项目中。如果未包括该内容,请了解如何将起步内容从另一项目 [迁移](http://api.unrealengine.com/CHN/Engine/Content/Browser/UserGuide/Migrate/index.html) 到此项目。 \1. 首先,在 **内容浏览器** 中使用鼠标 **右键单击**,从 **基本资产列表(****Basic Assets List****)**中选择 **材质(****Material****)**以创建新材质,然后将该材质命名为 **Refraction_Material**。完成后,您的 **内容浏览器** 应该如下所示。 ![R_Create_Refraction_Material.png](file:///C:/Users/WUMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image003.jpg) \2. 在 **内容浏览器** 中使用 **鼠标左键双击** 刚刚创建的材质,以将其打开。材质打开之后,请将 **混合模式(****Blend Mode****)**从 **不透明(****Opaque****)**更改为 **半透明(****Translucent****)**,并将 **照明模型(****Lighting Model****)**从 **体积无方向(****Volumetric Non Directional****)**更改为 **表面半透明体积(****Surface Translucency Volume****)**。完成之后,材质 **细节(****Details****)**面板应该类似于下图。 ![DetailsPanel.jpg](file:///C:/Users/WUMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image005.jpg) \3. 材质现已具有正确的属性,我们可以开始添加必需的材质表达式节点。对于此材质,我们需要下列类型及数量的材质表达式节点。 · 常量(Constant)x 5 · 插值(Lerp) x 1 · 菲涅耳效果(Fresnel) x 1 ![R_Required_Nodes.png](file:///C:/Users/WUMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image006.jpg) · 需要的所有材质表达式节点现已添加到材质图中,我们可以开始将它们连接到一起。 完成之后,您的材质图应该类似于下图。 ![R_Finshed_Material.png](file:///C:/Users/WUMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image008.jpg) \5. 为了以后测试方便,请选中与“插值”(Lerp)节点的 **B** 输入相连接的“常量”(Constant)材质表达式节点,并 **右键单击** 该节点。从显示的菜单中,选择 **转换为参数(****Convert to Parameter****)**选项。完成此操作后,务必命名该输入。在本示例中,我们将使用 **IOR** 作为其名称。完成之后,您的材质图应该类似于下图。 ![R_Finshed_Material_IOR_Tweak.png](file:///C:/Users/WUMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image010.jpg) \6. 材质现已设置完毕,请确保按 **应用(****Apply****)**和 **保存(****Save****)**按钮并关闭材质。 ![R_Apply_&_Save.png](file:///C:/Users/WUMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image012.jpg) \7. 关闭材质后,请在 **内容浏览器** 中找到该材质。找到之后,请使用鼠标 **右键单击** 该材质,然后从菜单中选择 **创建材质实例(****Create Material Instance****)**选项。完成后,您的 **内容浏览器** 应该如下所示。 ![R_Create_New_MI.png](file:///C:/Users/WUMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image013.jpg) \8. 材质实例现已创建完毕,我们可在环境中添加一些对象,以便更好地预览材质。如果您已将起步内容包括在项目中,那么可以在 **形状(****Shapes****)**文件夹中找到许多不同形状网格。在本示例中,已在环境中添加“立方体” (Cube)、“圆锥体”(Cone)和“球体”(Sphere)。 ![R_Adding_Test_Meshes.png](file:///C:/Users/WUMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image015.jpg) 如果您找不到“立方体”(Cube)、“圆锥体”(Cone)和“球体”(Sphere),那么可能表示您未将起步内容包括在项目中。如果未包括起步内容,您可以创建一个新项目并确保包括起步内容,也可以将起步内容从另一个项目 [迁移](http://api.unrealengine.com/CHN/Engine/Content/Browser/UserGuide/Migrate/index.html) 到此项目。 \9. 现已添加一些测试形状,请将折射材质实例应用于这些形状,方法如下:在 **内容浏览器** 中使用 **鼠标左键** 选择材质实例,然后将该材质实例拖到某个形状上并释放 **鼠标左键**。完成后,关卡应该会显示类似下图的内容。 ![R_Applied_Material.png](file:///C:/Users/WUMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image017.jpg) \10. 在 **内容浏览器** 中,通过 **鼠标左键双击** 打开折射材质实例。打开后,通过使用 **鼠标左键** 单击复选框来启用 IOR 参数。激活后,您可将 IOR 设置为不同的值,以模拟不同的表面相互作用。在以下示例中,IOR 从默认值 1.33(水的 IOR)更改为 1.52(玻璃的 IOR),最后更改为 2.42(钻石的 IOR)。 **折射提示与技巧** 在下一节中,我们会说明将折射与材质编辑器的其他方面结合使用的一些其他方法,这些方法可产生一些非常有趣的结果。 **折射与法线贴图** 添加折射材质的选项以使用法线贴图,可产生一些非常有趣的结果,这在法线贴图中有大量有趣细节的区域尤其明显。 按以下方式修改刚才创建的材质,以允许它与法线贴图配合使用。 \1. 首先,找到要使用的法线贴图。在本示例中,使用的是 **T_Brick_Clay_Old_N**,但可以使用任何法线贴图。找到法线贴图之后,请打开 **Refraction_Material**,然后将该法线贴图从 **内容浏览器** 拖到材质图中。 ![R_Adding_Normal_Map.png](file:///C:/Users/WUMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image019.jpg) \2. 将法线贴图放入材质图之后,请将其连接到“法线”(Normal)输入。连接之后,请选中“法线贴图纹理样本”(Normal map Texture Sampler)节点,并使用鼠标 **右键单击** 此节点。从显示的菜单中,选择 **转换为参数(****Convert to Parameter****)**选项,并将其命名为 **Normal_Map**。 \3. 务必单击 **应用(****Apply****)**和 **保存(****Save****)**按钮,然后关闭材质。 ![R_Apply_&_Save.png](file:///C:/Users/WUMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image020.jpg) \4. 材质现已经过编译并保存,请打开材质实例,并查看 **纹理参数值(****Texture Parameters Values****)**部分中的 **参数组(****Parameter Groups****)**。在这里,您应该会看到,法线贴图已变为可编辑的参数。要更改法线贴图,您首先应双击灰色的复选框以启用该贴图。启用之后,您可以更改法线贴图,方法如下:在 **内容浏览器** 中查找新的法线贴图,将其选中,然后使用 **使用内容浏览器中选中的资产(****Use Selected Assets from the Content Browser****)**按钮将选择的法线贴图指定给材质实例。 \5. 通过更改法线贴图,您可以通过非常有趣的方式影响折射效果。以下示例仅使用起步内容的“纹理”(Textures)文件夹中的法线贴图。 ![R_Reflection_&_Normal_Maps.png](file:///C:/Users/WUMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image022.jpg) **折射和移动** 如果将 **平移(****Panner****)材质表达式** 节点添加到材质图,并将其连接到 UV 的法线贴图纹理的,那么将产生一些非常有趣的结果。 这种方法适合于玻璃窗,对于剧烈爆炸产生的热霾或扭曲等视觉效果也非常有用。 ![R_Panning_Normal_Map.png](file:///C:/Users/WUMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image024.jpg) **折射深度偏移** **折射深度偏移** 方法用于防止距离较近的对象以锐视角渲染到扭曲的表面。 但是,这可能会增加表面与折射开始位置之间的距离。 在 UE4 中,可以在两个位置调整 **折射深度偏离(****Refraction Depth Bias****)**。 · **材质编辑器** - 您可以在**细节(Details)**面板的****“****材质****”****部分中找到** 折射深度偏离(Refraction Depth Bias)**。您需要按白色三角形(突出显示时显示为绿色)才能显示此属性。 ![R_RDB_Materail_Editor.png](file:///C:/Users/WUMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image026.jpg) · **材质实例** - 您可以在 **细节(****Details****)**面板的 **常规(****General****)**部分中找到 **折射深度偏离(****Refraction Depth Bias****)**。 ![R_RDB_Materail_Instance.png](file:///C:/Users/WUMING~1/AppData/Local/Temp/msohtmlclip1/01/clip_image028.jpg) **总结** 向材质(特别是玻璃和水)添加折射可产生非常逼真的效果。 请记住使用您尝试模拟的表面类型的正确 IOR 值。 您也可能很希望将 IOR 值增大到超过表面类型的正确 IOR 值,但务必克制这种冲动。 IOR 值源自现实世界中的测量值,所以,将 IOR 值增大或减小到合理水平以外并不会产生更好的效果。 来自 <>