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


    【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,官网代码.
    将代码拷贝下来,然后在场景中随意地搭个场景,比如这样:
    img
    随便搭个就可以,这就是我们要反射的场景,只要场景里有东西就可以。当然你可以弄个漂亮些的。
    然后再建一个空物体,作为我们需要的Transform,这就是脚本中那个go相机的位置,也就是最后生成六张贴图中,front贴图中的图像,就是go相机看到的景象。
    最后我们还需要一个空的Cubemap,在Project视图里右键,Create-Legacy-Cubemap,创建一个Cubemap。
    点击我们自己创建菜单Render into Cubemap,会弹出一个对话框,将Transform、Cubemap赋给它就可以,然后render。需要注意的是,Cubemap要勾选Readable才可以。
    渲染后的效果是这样的:
    img
    这样就生成了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。

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

  • 相关阅读:
    VS2008编译出现问题:error C2485: “__restrict”: 无法识别的扩展属性 解决办法
    精度试验结果报告Sleep, GetTickCount, timeGetTime, QueryPerformanceCounter
    error C2872: 'ULONG_PTR' : ambiguous symbol
    无法删除文件:无法读源文件或磁盘”
    如何HOOK桌面窗口消息
    批处理常用特殊符号
    我的Hook学习笔记
    代码注入的三种方法
    Ubuntu 安装 “宋体,微软雅黑,WPS Office的symbol、wingdings、wingdings 2、wingdings 3、webding字体,Consolas雅黑混合版编程字体” 等 Windows 7 下的字体(转)
    Delphi中如何将 Exe 程序或其他资料打包在内,使用时再释放使用(转)
  • 原文地址:https://www.cnblogs.com/-867259206/p/5630261.html
Copyright © 2020-2023  润新知