【转载】UE4 材质大师课程笔记(二) —— RenderTarget

939 阅读2分钟

原文链接:UE4材质大师课程笔记(二)---RenderTarget

RenderTarget

UE4 的 RenderTarget 感觉和 Unity 的差不多,都是获得一个摄像机的渲染结果,然后存在 RenderTarget 里面进行读取使用。

在 UE4 中要使用 RenderTarget ,首先要添加 SceneCapture2D 组件或者 SceneCaptureCube 组件,前者获取 2D 贴图,后者获取 Cube 立方体贴图

RenderTarget 的使用

渲染材质

在 UE4 中过程化生成噪点纹理是比较昂贵的,所以通常的做法是将材质绘制到 RenderTarget 中。

可以看出以上这个需要 529 条指令

将材质绘制到 RenderTarget

得到左边的 RenderTarget 噪点图了,然后 右键创建静态纹理 则可以得到可以用的 Texture 纹理了。

指令就变为了 34,效率得到了提升。

高级应用

高度图

效果如下,随着鼠标左键的按下,在平面生成不同的高度。

  1. 首先我们要创建 MAT_HeightfieldPainter 材质,设置如下,注意要把 Shading Model 改为 Unlit 无光照模式。这个材质主要用于 控制物体在 Z 轴的世界偏移(高度变化)

  1. 创建 MAT_ForceSplat 材质,设置如下,主要 用于处理鼠标点击平面所产生的 uv 坐标 ,通过下面的计算 获得一个关于这个 uv 坐标为圆心的渐变圆形贴图

  1. 新建一个 HeightFieldPainter 的 Actor 蓝图,设置如下

然后在 构造函数 里面进行 动态材质的设置,这里主要针对我们上面的材质创建动态材质(分别保存在 ForceSplatMIDPaintMaterialInstance 实例中)。

新建 TraceFromCamera 函数,函数用于 从摄像头方向射出射线,进行射线检测 ,如果检测到碰撞物体,就进行伤害传递。

BeginPlay 函数,首先我们要为新建一个 RenderTexture 并保存,同时将 RT 传递给用于 Z 轴偏移的 MAT_HeightfieldPainter 材质。

最后处理 伤害函数,传递参数给 MAT_ForceSplat 材质,例如点击的 uv 坐标、力度、大小,最后要用 Draw Material to Render Target 函数将 MAT_ForceSplat 材质绘制到 RT 里面,这样 MAT_HeightfieldPainter 材质才会根据 RT 图进行 Z 轴的偏移。

这里注意,这种方法只适用于平面,计算点击位置的 uv 坐标也比较简单,首先获取点击位置的世界坐标,然后获取静态网格的 worldTransform ,然后通过 Invert Transform 获得 从世界坐标到静态网格本地坐标 的变换矩阵,将点击位置从世界空间转换为静态网格的本地空间,当然我们也要将得到的本地坐标转为 uv 坐标,就要除于网格的长宽,映射到 [0,1],这样就得到了正确的 uv 坐标。