我们前几篇已经完成了渲染部分,现在终于开始做动态绘制功能了
之前使用的是这样一个体积雾的切片图,那么现在要做的就是动态编辑它
首先,让我们简单了解一下它是如何运作的:
开始绘制画布以渲染目标,并将材质绘制到画布上。
我们先不考虑其他参数,首先关注所需的资源。
左侧:纹理目标,即画板。
右侧:需要一个材质,它充当笔刷。
显而易见,这个过程就是将笔刷的内容绘制到画板上。而这个“纹理目标”最终会被用作体积纹理的切片。
关键问题在于,如何在2D纹理目标上绘制出3D切片呢?之间如何转换?
我们开始一步步制作吧。
新建纹理目标
首先,我们创建一个渲染目标
新建一个渲染目标RT_VolTexture
调整细节
设置尺寸和目标格式
因为是三维的信息量,所以可以比二维图相对大一些
渲染目标选了单通道16位,其实我觉得8位也够
顺便把材质中的图替换为它
制作画笔
UVtoVol
新建材质函数 UVtoVol
,用来将UV转为体积
新建两个变量
将结果相乘,可以看到框内为0-1
使用Frac
取小数部分,就得到了12个0-1循环的小UV
还需要给每个小UV一个编号,放在Z通道
使用Floor
取整
将他除12,可以看到是这样的
要用它组成ID
将结果除以总数,可以看到从左上角的0开始,每一格都是一个ID
RG就相当于体积的XY平面,而ID则相当于Z轴。因此,你只需将结果放入Z通道即可。
别忘了,我们需要这个体积的轴心位于中心位置。
对结果-0.5
*2
。完整如下:
M_VolPaint
新建材质M_VolPaint
它负责把内容绘制到RT贴图,因此改为无关照
他作为一个画笔,当然也得是三维的。那么我们做一个最简单的球形画笔
放入刚制作好的函数
因为已经把轴居中了,因此直接使用Length(同计算distance0),就得到了一个点距离场切片
有些跳跃不理解?
以它为例,其意思就是每个像素的XY
,距离0,0
有多远
因为我们已经居中了,实际就是这样
Distance
就是AB两点的距离公式,如果其中一点为0,就可以用Length
长度代替
增加变量Radius
,控制其半径
除以Radius
半径,规格化到0-1,并使用Saturate
(等同于Clamp0-1),丢弃小于0大于1的值
在增加一个Density
控制笔刷浓度/密度,一个简单的球形画笔就做好了。
制作绘制蓝图
新建蓝图
新建蓝图 BP_VolPainter
新建函数Paint Sphere
新建变量 VolTexture
,类型是 纹理渲染目标2D
,并把我们的RT_VolTexture
设置为变量默认值
绘制功能
就像之前演示的一样,但现在我们已经准备好了这两样东西
渲染目标的Size
就是画板的Size,将其连接到ScreenSize
别忘了还需要结束:
测试
开启编辑器中调用
把BP_VolPainter
放在场景里,点击PaintSphere
执行函数
就绘制出来了(我把笔刷的Density
调到1
,这样明显点)
检查渲染目标,已经绘制上了
基本的原理就是这样,但现在我们只在最中心规规整整画了一个球。
下一篇继续,如何通过调整笔刷的空间位置和大小,自由的在体积里绘制体积图案