RenderTarget
UE4 的 RenderTarget 感觉和 Unity 的差不多,都是获得一个摄像机的渲染结果,然后存在 RenderTarget 里面进行读取使用。
在 UE4 中要使用 RenderTarget ,首先要添加 SceneCapture2D 组件或者 SceneCaptureCube 组件,前者获取 2D 贴图,后者获取 Cube 立方体贴图。
RenderTarget 的使用
渲染材质
在 UE4 中过程化生成噪点纹理是比较昂贵的,所以通常的做法是将材质绘制到 RenderTarget 中。
可以看出以上这个需要 529 条指令
将材质绘制到 RenderTarget
得到左边的 RenderTarget 噪点图了,然后 右键创建静态纹理 则可以得到可以用的 Texture 纹理了。
指令就变为了 34,效率得到了提升。
高级应用
高度图
效果如下,随着鼠标左键的按下,在平面生成不同的高度。
- 首先我们要创建 MAT_HeightfieldPainter 材质,设置如下,注意要把 Shading Model 改为 Unlit 无光照模式。这个材质主要用于 控制物体在 Z 轴的世界偏移(高度变化) 。
- 创建 MAT_ForceSplat 材质,设置如下,主要 用于处理鼠标点击平面所产生的 uv 坐标 ,通过下面的计算 获得一个关于这个 uv 坐标为圆心的渐变圆形贴图
- 新建一个 HeightFieldPainter 的 Actor 蓝图,设置如下
然后在 构造函数 里面进行 动态材质的设置,这里主要针对我们上面的材质创建动态材质(分别保存在 ForceSplatMID 和 PaintMaterialInstance 实例中)。
新建 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 坐标。