版权声明:本文为CSDN博主「Papals」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
要制作一张 uv 贴图,是什么意思?
我们知道一般来说,我们都是根据 uv 来采样贴图,一般来说这个事情都是美术同学来制作的,所以我们想要进行的是在 UE4 中,动态或者根据自己的实际情况来生成一张贴图,并且我们要存储的内容也可以自己定。你可以自己生成 法线贴图 ,或者是 世界坐标的贴图 ,等等,并不拘泥于只存储颜色信息。
我们如何进行相关的操作?
渲染目标
首先我们要做的就是生成一张 RT ,也就是 Render Target,
在内容浏览器中,我们进行创建,这里我们要创建 2 个 RT 。创建后,打开它们并将分辨率设置为所需的分辨率。一个大概的尺寸是 1024x1024 。你可以随便给它们起个名字,但我建议给它们起个名字:RT_SceneCapture 然后 RT_Expanded 以避免之后混淆。
展开材质(Unwrap_UVs)
制作一个新材质,并将其设置为 “Unlit” 和 “Two Sided”(防止任何光照贴图 uv 都被镜像,这将导致它们在展开时背面不清晰)。然后将这些节点插入到材质的 World Position Offset(世界位置偏移) 输入中。“Size” 将是您设置的 Scene Capture Actor(场景捕捉) 的 Orthographic Width 。在本例中,我们将使用之前文章提到的 BoundingBox_0-1UVW 连接到自发光上。这很有用,因为它可以用于在光线跟踪或光子映射时检查材质中的光线位置。
设计 Actor 蓝图
接下来我们将制作一个新的蓝图 Actor 并添加一个 “场景捕捉组件 2d”(Scene Capture Component 2D) 组件。
如上图所示,选择组件并将 “投影类型”(Projection Type)设置为 “正交”(Orthographic)并将 “正交宽度” (Ortho Width)设置为 1000 ,以匹配 “uv 展开大小”(UV Unwrap Size)1000。将 “纹理目标”(Texture Target) 设置为我们在第一步中创建的 RT_SceneCapture 。同时将位置设置为 0,0,500 ,并将旋转设置为 -90,-90,0 。这是为了从自顶向下的视图匹配 uv 展开的方向。最后,将 “Capture Every Frame” 设置为 false ,以防止它无缘无故地连续捕捉。
接下来,将 “静态网格”(Static Mesh) 组件添加到蓝图中,并将其所有设置保留为默认值。然后添加一个新变量,使其成为 “静态网格” 类型并使其可编辑(变量右侧的这个小眼球按钮)。
现在转到蓝图的 构造脚本(Construction Script),放置一个 “Set Static Mesh” 节点,该节点将 静态网格组件 设置为使用您创建的 “静态网格” 变量。接下来,添加一个 “Set Material” 节点并指定前面提到的 展开材质 。具有 多个材质元素 的静态网格可以使用 “Get Num Materials-1” 作为 forloop 最后一个索引,将 展开材质 指定给所有元素。
现在我们只需要在事件图(Event Graph)中添加一些蓝图节点。首先,我们放置一个“自定义事件”(Custom Event) 并将其命名为 “Dilate” 。
在这次活动中,我们只做了两件事。首先我们告诉 场景捕捉 来捕捉图像。然后我们调用 “Draw Material to Render Target”函数。我们将 膨胀材质(作者笔误还是遗漏了新建一个材质的关键步骤?个人感觉应该是 Dilate 事件中用该新材质把 RT_SceneCapture 的结果取出来?)用作材质,将第二个渲染目标 RT_Expanded 用作指定的渲染目标。
一旦将此数据写入渲染目标,通常可以使用实际的渲染目标执行所需的任何操作,因为 位置贴图 在 HDR 形式下最有效。
如果要创建扩展(作者笔误?展开?)纹理的 静态纹理 ,可以在内容浏览器中的渲染目标上单击鼠标右键,然后选择 “创建静态纹理”。