【Unity Shaders】学习笔记——SurfaceShader(八)生成立方图

时间:2022-05-18 17:54:14

【Unity Shaders】学习笔记——SurfaceShader(八)生成立方图


转载请注明出处:http://www.cnblogs.com/-867259206/p/5630261.html

写作本系列文章时使用的是Unity5.3。
写代码之前:

  1. 当然啦,如果Unity都没安装的话肯定不会来学Unity Shaders吧?

  2. 阅读本系列文章之前你需要有一些编程的概念。

  3. 在VS里面,Unity Shaders是没有语法高亮显示和智能提示的,VS党可以参考一下这篇文章使代码高亮显示,也可以下载shaderlabvsNShader之类的插件使代码高亮显示。

  4. 这是针对小白的Unity Shaders的基础知识,如果你已经有了基础或者你是大神,那么这些文章不适合你。

  5. 由于作者水平的局限,文中或许会有谬误之处,恳请指出。


Cubemap是一种类似天空盒的由六张贴图组成的贴图。它是用于一些需要反射效果的材质,用来反射周围的环境。如果要表现金属材质,通常会给它添加一张反射贴图,来模拟金属表面反射的环境的颜色。因为金属之类的材质它本身其实是没有颜色的,它的颜色就是它反射的周围物体的颜色。如果给金属赋予银白色,并不能得到金属的质感,要让它反射周围的颜色。立方图就是这样一种记录了周围环境颜色的贴图。
Unity提供了一个RenderToCubemap的方法在脚本中生成Cubemap,官网代码.
将代码拷贝下来,然后在场景中随意地搭个场景,比如这样:
【Unity Shaders】学习笔记——SurfaceShader(八)生成立方图
随便搭个就可以,这就是我们要反射的场景,只要场景里有东西就可以。当然你可以弄个漂亮些的。
然后再建一个空物体,作为我们需要的Transform,这就是脚本中那个go相机的位置,也就是最后生成六张贴图中,front贴图中的图像,就是go相机看到的景象。
最后我们还需要一个空的Cubemap,在Project视图里右键,Create-Legacy-Cubemap,创建一个Cubemap。
点击我们自己创建菜单Render into Cubemap,会弹出一个对话框,将Transform、Cubemap赋给它就可以,然后render。需要注意的是,Cubemap要勾选Readable才可以。
渲染后的效果是这样的:
【Unity Shaders】学习笔记——SurfaceShader(八)生成立方图
这样就生成了Cubemap。

解释

using UnityEngine;
using UnityEditor;
using System.Collections; public class RenderCubemapWizard : ScriptableWizard { public Transform renderFromPosition;
public Cubemap cubemap; void OnWizardUpdate () {
string helpString = "Select transform to render from and cubemap to render into";
bool isValid = (renderFromPosition != null) && (cubemap != null);
} void OnWizardCreate () {
// create temporary camera for rendering
GameObject go = new GameObject( "CubemapCamera");
go.AddComponent<Camera>();
// place it on the object
go.transform.position = renderFromPosition.position;
go.transform.rotation = Quaternion.identity;
// render into cubemap
go.GetComponent<Camera>().RenderToCubemap( cubemap ); // destroy temporary camera
DestroyImmediate( go );
} [MenuItem("GameObject/Render into Cubemap")]
static void RenderCubemap () {
ScriptableWizard.DisplayWizard<RenderCubemapWizard>(
"Render cubemap", "Render!");
}
}
  1. 首先需要添加UnityEditor的命名空间。

  2. 然后要继承ScriptableWizard类,而不是MonoBehavior。

  3. OnWizardUpdate()是Unity内置的函数。当向导(wizard)第一次弹出或者当GUI被用户改变时(如拖进去某些对象,输入某些字符等)它会被调用。我们可以使用它来判断用户是否真的输入了我们需要的资源。isValid也是Unity内置的一个变量。isValid用来控制向导下方的按钮是否可用。

  4. MenuItem用来自定义自己的菜单栏,你会发现在GameObject菜单栏中多了要一个RenderintoCubemap菜单选项。点击菜单,就会执行下面的RenderCubemap函数,打开一个向导。

  5. "Render cubemap", "Render!"定义了向导的标题和想到下方默认的create按钮的文字,点击Render!按钮就会执行OnWizardCreate ()函数,这也是Unity内置的函数,在create按钮按下时执行。

  6. 将我们设置的渲染位置赋给相机,相机执行RenderToCubemap方法生成Cubemap。

还有其他的工具可以生成立方图,大家可以搜搜看。