![ae94367c822460d824b5b50ff7b2d568.png](https://img-blog.csdnimg.cn/img_convert/ae94367c822460d824b5b50ff7b2d568.png)
上一篇:
[UE4蓝图][Materials]虚幻4中可互动的雪地材质完整实现(一)zhuanlan.zhihu.com![a2be662eef5d8c245a8812005980c334.png](https://img-blog.csdnimg.cn/img_convert/a2be662eef5d8c245a8812005980c334.png)
10.新建一个MaterialParameterCollection(材质参数集)并添加一个Scalar参数OrthoWidth。
并在SceneCapture蓝图类的BeginPlay事件中将CaptureComponent的OrthoWidth赋给它。
![569c6466c39679b1c275746852d9edfe.png](https://img-blog.csdnimg.cn/img_convert/569c6466c39679b1c275746852d9edfe.png)
![3befb340efce2f47847353120cc2f65a.png](https://img-blog.csdnimg.cn/img_convert/3befb340efce2f47847353120cc2f65a.png)
- MaterialParameterCollection(材质参数集):可以存储两种参数,一种是标量参数(ScalarParameter)也就是一个浮点值,一种是矢量参数(VectorParameter)(包含四通道矢量值即4 个浮点值)。在这里存储后,可以在所有材质中直接获取,适合用来做统一控制,导入全局数据等等。
- OrthoWidth的作用:CaptureComponent的OrthoWidth是相机正交拍摄的宽度,比如设置的是512,那么拍摄的范围就是以(-256,-256)(256,-256)(-256,256)(256,256)为四个顶点的正方形区域。
那么我们现在得到了一张正方形照片了,我们需要打印到地面上,并且每个点对应上,就需要通过UV坐标每个像素一一对应了,有了OrthoWidth,我们就能通过地形上的每个点的世界坐标(这里只需要x,y就行了)算出对应的UV坐标,再去照片上获取这个点该有的颜色。 - 此篇重点!详细图解计算UV:先解释下这张图。
这是一张以世界原点(0,0,0)为中心的俯拍图,主角是一个圆柱体,坐标为(1,3)。
那么根据图你应该可以看出,这里的OrthoWidth是10。红色为世界坐标系(俯视角),横y轴,竖x轴(UE4为左手坐标系,x轴向前,y轴向右)黑色则为UV坐标系,原点在左上角,横为U,竖为V。蓝色圆圈则是SceneCapture从下方拍摄获取到的照片中,圆柱体应该在的位置。
(镜头本来朝着X轴正方向,绕Y轴旋转90°后,俯视角为右上角的圆柱体就变到右下角了,这里需要一点空间想象或者自己在场景里拿个相机试一下就懂了)
我们的目标就是 通过圆柱体的世界坐标获得它在所拍摄图片上所在位置的UV坐标,也就是蓝色圆圈的UV坐标。
我们先通过圆柱体的世界坐标(1,3)来计算它的UV坐标:
U1=(3+5)/10=0.8 V1=(5-1)/10=0.4
将数字替换为x,y,OrthoWidth之后得到公式:U1=y/OrthoWidth+0.5 V1=0.5-x/OrthoWidth
那么蓝色圆圈的UV坐标为U2=U1=y/OrthoWidth+0.5 V2=1-V1=x/OrthoWidth+0.5
![55e3cad25dd2775d70d6569fce8824a1.png](https://img-blog.csdnimg.cn/img_convert/55e3cad25dd2775d70d6569fce8824a1.png)
11.在Snow材质中使用刚才获得的公式实现所谓的2D打印
![40f5124dfc07a0ac770a174832ec91e9.png](https://img-blog.csdnimg.cn/img_convert/40f5124dfc07a0ac770a174832ec91e9.png)
- TextureSample表达式用来输出纹理中的颜色值。此纹理可以是常规Texture2D(包括法线贴图)、立方体贴图或电影纹理等等。
- CollectionParameter可以获取到任意材质参数集中的参数。
这里我们MakeFloat2那里UV的值故意连反了,应该U对应着y,V对应着X的。
我们先看一下效果
![8e6d92611544acfbe200ac6f0fb78fa4.gif](https://img-blog.csdnimg.cn/img_convert/8e6d92611544acfbe200ac6f0fb78fa4.gif)
因为脚印不反的时候,很容易看不到,正好被完全挡住了,所以先确定一下脚印有没有正常被打印在地形上。
- 如果你看到的脚印很模糊,像个长方形,那么你可以调大RenderTarget1的尺寸比如1024(记得将RenderTarget2的也调为一样的),脚印清晰程度跟OrthoWidth和RenderTarget尺寸的比例有关。当然,这两个值越大,性能消耗就越大。
![01484572324e8e51c5cb1d31958d797a.png](https://img-blog.csdnimg.cn/img_convert/01484572324e8e51c5cb1d31958d797a.png)
现在我们把UV与XY的对应关系顺过来
![1f827078dcc56a86a23996350edafe49.png](https://img-blog.csdnimg.cn/img_convert/1f827078dcc56a86a23996350edafe49.png)
再进入游戏
![497612c3f8895c9581f698500e58efea.gif](https://img-blog.csdnimg.cn/img_convert/497612c3f8895c9581f698500e58efea.gif)
12.在Snow材质中开启Tessellation(曲面细分)
- Tessellation(曲面细分):曲面细分是DirectX11的一个功能。可以在运行时将各个三角形(场景中的一切都是有一个个三角形拼起来的)切分成更小的三角形,这样我们就能控制更多顶点,让画面更加细节。
这里我们使用Flat Tessellation。
![49bc2ff736b2e388ba3b2e91e8f4825a.png](https://img-blog.csdnimg.cn/img_convert/49bc2ff736b2e388ba3b2e91e8f4825a.png)
![915537819fbe05d42b28c4f2770e1c56.png](https://img-blog.csdnimg.cn/img_convert/915537819fbe05d42b28c4f2770e1c56.png)
13.在Snow材质中控制顶点的偏移,这里会详细解释,看图
![7ae7d59bdf153ffb6362e9c166a5bdcc.png](https://img-blog.csdnimg.cn/img_convert/7ae7d59bdf153ffb6362e9c166a5bdcc.png)
- VertexNormalWS(顶点全局空间法线):可以获得到当前这个点的法线,也就是垂直于地面的单位向量,假如地形是平的,那么每个点获得的值都是(0,0,1)。
- WorldDisplacement(世界位移):只有开启了Tessellation后才可以使用,可以控制所有顶点的位移,一般都是配合VertexNormalWS使用。
- World Position Offset:跟WorldDisplacement功能一样,开不开启Tessellation都可以使用,但是只能控制基本顶点,也就是说曲面细分后新增的那些顶点,是只能通过WorldDisplacement控制的。
- Tessellation Multiplier(多边形细分乘数):这个数值越大,分的就越细,三角片就越多,顶点也就越多,性能消耗更高,这里就设为2了。
- 这里取R值(白色即为1,黑色即为0),乘以一个自定义参数Height(雪地的最大厚度),再乘以单位法向量,得到的就是每个顶点需要的偏移量了。那么脚底的部分为黑色,偏移量为0,其他地方为白色,则是沿法线方向偏移Height个单位,假如是平坦地形的话,则是竖直向上偏移,也就是地面被拔高了。
现在进入游戏看下效果
![361ef68cb3e39275a3c8abdf672198e1.gif](https://img-blog.csdnimg.cn/img_convert/361ef68cb3e39275a3c8abdf672198e1.gif)
3D打印已经生效了,并且从下面看就很容易理解我们刚才做了什么了。我们让脚部的顶点不变,抬高了其他的部分,这样看起来就踩在雪上了。
- 解决地面闪烁问题
如果这时候你的地面有时候会一闪一闪的,是很正常的,因为我们没有调整地形的Bounds Bounds(边界): 每个静态网格和骨架网格都有Bounds,相机通过Bounds来决定剔除遮挡。简单地说,当相机看到了Bounds,这个物体才会被渲染,否则就算应该在视野内,也看不见。
而这里我们的地形被拉高了,但是Bounds并没有改变,所以就会出现剔除遮挡出现错误。
简而言之,Bounds最好是只能大,不能小。
我们可以勾选Show-Advanced-Bounds,这样就能看到物体的bounds了。
![b290dc311929d65236a980aa3cf2843e.png](https://img-blog.csdnimg.cn/img_convert/b290dc311929d65236a980aa3cf2843e.png)
选中地形,然后更改Positive ZBounds Extension的值,可以看到Bounds的变化
![241f6d4035c85b19ce8e50fe91c24e4b.gif](https://img-blog.csdnimg.cn/img_convert/241f6d4035c85b19ce8e50fe91c24e4b.gif)
Positive ZBounds Extension表示在Z正半轴上增大边界,Negative ZBounds Extension表示在Z负半轴上增大边界。
所以我们将Positive ZBounds Extension改为100就不会出现闪烁的问题了。
后面我们会解决如何留下脚印和SceneCapture不在原点的情况下如何计算等等问题。
下一篇:
[UE4蓝图][Materials]虚幻4中可互动的雪地材质完整实现(三)(完结)zhuanlan.zhihu.com![c7e43d6a33cb7df4cb7847faf642c098.png](https://img-blog.csdnimg.cn/img_convert/c7e43d6a33cb7df4cb7847faf642c098.png)