Sorry, your browser cannot access this site
This page requires browser support (enable) JavaScript
Learn more >

动态生成立方体纹理

一、原因

立方体纹理最大的作用就是环境映射 在实现反射,折射等等效果时,需要用到立方体纹理来制作对应的效果 而立方体纹理中最重要的就是组成它的 6 张 2D 纹理图片

对于天空盒来说,6 张 2D 纹理图片可以更具想要的美术效果的表现,来进行自定义制作 提前将纹理制作好即可 这种立方体纹理往往是提前做好的,是场景里面公用的

但是如果制作反射、折射等效果还是使用这样的立方体纹理,效果是不够理想的 因为物体在场景中的位置不同,产生的效果也是不同的

因此为了更好的更真实的表现效果,对于场景中不同位置的物体 我们应该在不同位置生成不同的立方体纹理

二、实现思路

主要实现功能

  1. 自定义编辑器窗口中,关联对象(通过对象来指定位置)和 cubemap 变量
  2. 自定义编辑器窗口中,有一个生成按钮,点击使用后 Camera 中的 RenderToCubemap 自动生成对应的 6 张 2D 纹理贴图

三、实现步骤

  1. 新建一个脚本 RenderToCubemap 放在 Editor 文件夹中
  2. 该类继承 EditorWindow 将其作为一个编辑器窗口类
  3. 实现打开该窗口的静态函数
  4. 实现 OnGUI 的窗口布局,添加一下控件
    1. 关联位置对象的控件
    2. 关联立方体纹理贴图的控件
    3. 生成按钮
  5. 具体逻辑实现
    1. 通过动态创建一个空物体为它添加摄像机组件的形式生成立方体纹理贴图的实现 注意:该对象为临时对象,使用完删除即可
    2. cubemap 上需要勾选 Readable
    3. cubemap 上的分辨率决定占有内存和清晰度

四、实现示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
public class RenderToCubemap : EditorWindow
{
private GameObject obj;
private Cubemap cubemap;


[MenuItem("立方体纹理动态生成/打开生成窗口")]
static void OpenWindow()
{
RenderToCubemap windo = EditorWindow.GetWindow<RenderToCubemap>("立方体纹理生成窗口");
windo.Show();
}
void OnGUI()
{
GUILayout.Label("关联对应位置的对象");
obj = EditorGUILayout.ObjectField(obj, typeof(GameObject), true) as GameObject;
GUILayout.Label("关联对应立方体纹理");
cubemap = EditorGUILayout.ObjectField(cubemap, typeof(Cubemap), false) as Cubemap;
//点击按钮之后就去执行生成逻辑
if (GUILayout.Button("生成"))
{
if (cubemap == null || obj == null)
{
EditorUtility.DisplayDialog("提醒", "请先关联对应的对象", "确认");
return;
}

//生成立方体纹理
GameObject tmpObj = new GameObject("临时对象");
tmpObj.transform.position = obj.transform.position;
Camera camera = tmpObj.AddComponent<Camera>();
//关键方法 camera中的RenderToCubemap()方法
camera.RenderToCubemap(cubemap);
DestroyImmediate(tmpObj);
}
}
}

五、运行时生成的思路

camera 中的 RenderToCubemap()也可以在运行时动态生成立方体纹理 注意:

  1. 在 LateUpdate 中使用
  2. 降低立方体纹理贴图中的分辨率
  3. 分帧渲染,在 RenderToCubemap()中具有重载,可以一个面一个面的渲染
  4. 降低更新频率,不要每帧执行
  5. 总之:注意对性能的影响

评论