前言

游戏开发中有些时候需要使用到刮彩效果(彩票刮奖),效果如图

简单来讲,动态调整目标贴图的材质混合模式,将一张新的材质与原有材质进行融合,实现刮彩效果。其中新的材质就是刮奖轨迹!

分析

01.如何进行采样图混合?

在材质中,如果我们想要把两张贴图混合并且根据需要的阀值进行调整,则需要使用材质运算中的Lerp节点(材质编辑窗口中按住L点击左键),此节点有3个输入针脚

  • A.主混合内容
  • B.目标混合内容
  • C.混合阀值

此节点特点,当阀值为0则取A,当阀值为1则取B,0-1之间,则进行比例混合,公式A+(B-A)*阀值百分比

根据此节点特点,我们考虑,当A输入贴图时,B输入贴图时,阀值为1则输出B贴图,0则输出A体贴。

我们是否可以考虑将输出阀值提供一张贴图,贴图为纯黑(黑色RGB均为0),则输出A贴图。

如果贴图换成纯白色(白色RGB均为1),则输出B贴图。

那么我们在纯黑色的贴图上,绘制一些白色,然后当作阀值贴图进行连接,会有什么效果呢?

效果就是白色的地方,显式B贴图,黑色的地方显式A贴图,和刮彩的效果是不是很像了?

02.如何生成黑白混合贴图呢?

当然,这可以让美术同学去绘制,一般采样图是需要绘制的。但是我们在程序中是否可以动态生成呢?

是可以的,我们需要借助RenderTarget,那么什么是RenderTarget呢?

本意就是可以将你想要绘制的内容,先绘制到RenderTarget上,然后将RenderTarget当作一张采样图用作材质输出,例如这里就是使用了RenderTarget,他将摄相机拍到的内容,投射到RenderTarget上,然后再将RenderTarget应用到材质上,最后提供给UI进行输出。

我们的本意就是,我们要绘制一些东西(白色的)到RenderTarget上,然后将RenderTarget当作是阀值贴图,输入给第一步中使用。

以上就是处理这个问题的所有关键思路,那么下面阐述下步骤。

实现

01.准备贴图

准备一张底图纹理,用来展示内容

02.构建渲染材质

说明:

  • 材质中A节点输入纯色,或是一张纯色纹理(用于遮盖B节点贴图)
  • B节点输入图案纹理
  • Alpha节点输入2D参数纹理(参数纹理用于设置动态绘制的RenderTarget2D使用

如果Alpha2D纹理是纯黑色,则Lerp输出A节点纹理,如果纯白色,输出B节点纹理,如Alpha2D纹理是黑白混合(纯黑,纯白)则输出AB混合贴图

03.构建刮彩盖章的材质,用于绘制到RenderTarget上

说明:

  • 借助UV数据我们构建了一张从中心向边缘从0到1均匀过度的纹理,用于做绘制画笔(UV与Distance进行计算,输出内容为一张圆形渐变阶梯图)
  • 通过传入的Postion参数,用来调整UV偏移,Postion就是画笔在材质应用的Mesh上的位置信息,需要转换为UV位置
  • 设置材质混合模式为叠加,以便用来将材质绘制到RenderTarget2D上不刷新之前绘制的内容

前期工作完成后,后面就是处理逻辑,在下篇文章中介绍~

引擎版本

4.18.3