1. 使用渲染目标绘画
绘制方法
为了确定在哪里绘制渲染目标,需要从摄像机向前画一条线。如果线条击中画布,可以在UV空间中得到击中位置。例如,如果画布是完美的UV映射,在中心的点击将返回值(0.5,0.5)。如果它击中右下角,将得到一个值(1,1)。然后可以使用一些简单的数学计算绘制位置。
需要设置一个纹理作为参数,这样就可以传递渲染目标。为此,创建一个TextureSampleParameter2D
并命名为RenderTarget
。然后,将它连接到BaseColor。
创建RT
更好的方法是使用蓝图创建渲染目标。这样做的好处只需根据需要创建渲染目标,它们不会使项目文件膨胀。
首先,需要创建渲染目标并将其存储为变量以供以后使用。转到Blueprints文件夹并打开BP_Canvas。找到Event BeginPlay并添加
显示RT
目前,画布网格正在使用其默认材质。要显示渲染目标,需要创建M_Canvas的动态实例,并提供渲染目标。然后,需要将动态材质实例应用于画布网格:
创建笔刷材质
创建一个名为M_Brush的材质,然后打开它。首先,将***混合模式***设置为***半透明***。这将允许使用具有透明度的纹理。
就像画布材质一样,还将在蓝图中设置画笔的纹理。创建一个TextureSampleParameter2D并将其命名为BrushTexture。
接下来要做的是创建画笔材质的动态实例,以可以更改画笔纹理。打开BP_Canvas:
将画笔绘制到渲染目标
创建一个新函数并将其命名为==DrawBrush==。首先,需要使用纹理、画笔大小和绘制位置的参数。创建以下输入:
- BrushTexture:将类型设置为Texture 2D
- *BrushSize:*将类型设置为float
- DrawLocation:将类型设置为Vector 2D
计算绘制位置是一个两步过程。首先,需要缩放DrawLocation以适应渲染目标的分辨率。为此,请将 DrawLocation与Size相乘。
默认情况下,引擎将使用左上角作为原点绘制材质。这将导致画笔纹理不会以要绘制的位置为中心。要解决此问题,需要将BrushSize除以2,然后减去上一步的结果。
最后,需要告诉引擎要停止绘制渲染目标。添加一个End Draw Canvas 到 Render Target节点
来自相机的线路追踪
在画布上绘画之前,需要指定画笔纹理和大小。转到Blueprints文件夹并打开BP_Player。然后,将BrushTexture变量设置为T_Brush_01并将BrushSize 设置为500。这会将画笔设置为大小为500×500像素的猴子图像。接下来,需要进行线路跟踪。找到InputAxis Paint并创建以下设置:
现在需要检查射线是否碰到画布。
在Find Collision UV节点工作之前,需要更改两个设置。首先,转到LineTraceByChannel节点并启用Trace Complex。
其次,转到Edit\Project Settings,然后转到Engine\Physics。启用Support UV From Hit Results,然后重新启动项目。
更改画笔大小
打开BP_Player并找到InputAxis ChangeBrushSize节点。此轴映射设置为使用鼠标滚轮。要更改画笔大小,需要做的就是根据Axis Value更改BrushSize的值。为此,请创建以下设置:
更改画笔纹理
首先,需要一个数组来保存玩家可以使用的纹理。打开BP_Player,然后创建一个数组变量。将类型设置为Texture 2D并将其命名为Textures。
接下来,需要一个变量来保存数组中的当前索引。创建一个整数变量并将其命名为CurrentTextureIndex。
接下来,需要一种循环浏览纹理的方法。在本教程中,我设置了一个名为NextTexture的动作映射设置为right-click。每当玩家按下此按钮时,它应该更改为下一个纹理。为此,请找到InputAction NextTexture节点并创建以下设置: