zoukankan      html  css  js  c++  java
  • 关于Unity中的光照(三)

    法线贴图

    次时代游戏用的比较多

    1:法线贴图是凹凸贴图技术上 的一种应用,有时也称为Dot3(仿立体)凹凸纹理贴图;
    2: 法线贴图是不增加多边形的情况下,增强模型的细节;
    3: 法线贴图是高精度模型导出来的一种贴图,作用到低精度jing'd度模型上面,增强低精度模型的细节同时,又能获取很好的性能;
    4:法线贴图的使用:
    模型资源: (1) 低精度的模型; (2)法线贴图; (3) 漫反射贴图; -->美术提供,,使用3DMark,程序员不用管

    法线贴图实例

    思路

      创建材质: 创建Legacy Shaders/Diffuse Legacy,Shaders/Bumped Diffuse 两个shader的材质进行比较
      法线贴图的材质类型一定要是 normalmap
      切换材质: 来观察变化和比较区别;
      代码切换材质:
      学会使用代码来切换模型的材质,实现换皮

    步骤

    1.创建Unity工程和文件目录,保存场景

    2.把法线贴图和纹理贴图以及模型文件都复制到res文件夹下,Dinosaur.FBX模型,GRANDEB2.JPG法线,GRANDECO.JPG纹理

    3.把法线贴图GRANDEB2.JPG的Texture Type设置为Normal Map法线贴图,点击Apply

    4.创建一个Material文件夹或者把刚才自带的Material里面的内容删除,重新创建一个漫反射材质球叫Diffuse,设置它的shader为Legacy Shaders---->Diffuse,把纹理贴图GRANDECO.JPG拖进去

    5.把模型Dinosaur.FBX拖进Scene场景中,设置节点的Metarials的Element0,Element1为Diffuse,这个是普通的效果,细节看起来很一般

    6.接下来我们用法线贴图,创建一个材质球Normal,设置它的shader为Legacy Shaders---->Bumped Diffuse,把GRANDECO.JPG拖进base,把GRANDEB2.JPG拖进Normalmap里面

    7.重新设置模型的Metarials的Element0,Element1为Normal材质球,这个就是法线贴图的效果,效果很逼真,模型面没有增加,但是细节提升非常多。

    8.用代码实现材质的更换(常用,比如游戏中遇到某些事件物体变色等),创建脚本change_materails,关联到模型节点下

    9.打开change_materails脚本

    using UnityEngine;
    using System.Collections;
    
    public class change_materials : MonoBehaviour {
        public Material diffuse_map;//普通纹理
        public Material normal_map;//法线贴图
    
        private MeshRenderer render;
    
        private bool normal;
        // Use this for initialization
        void Start () {
            this.normal = false;
            this.render = this.GetComponent<MeshRenderer>();//获得MeshRenderer组件
            this.render.materials = new Material[2] { this.diffuse_map, this.diffuse_map };//设置材质为普通纹理,有几个Element,或者说size是多少,就是多大的数组
        }
        
        // Update is called once per frame
        void Update () {
            if (Input.GetMouseButtonDown(0)) {
                this.normal = !this.normal;
                if (this.normal) {
                    this.render.materials = new Material[2] { this.normal_map, this.normal_map };//设置材质为法线贴图
                }
                else {
                    this.render.materials = new Material[2] { this.diffuse_map, this.diffuse_map };//设置材质为法线贴图
                }
            }
        }
    }

    10.运行,点击Game屏幕,切换贴图

    阴影的设置

    是在Light组件上设置的,也可以在Edit-->Project Settings->Quality中设置全局参数,后者的设置只有在设置自己阴影的Resolution为Use Quality Settings的Light组件才能使用

    1: unity可以通过修改阴影的参数来对阴影的质量进行设置;
    2: unity使用阴影贴图来显示阴影的,阴影贴图可以看作是灯光投射到场景的阴影通过纹理贴图的形式表现出来;
    3: 阴影的质量取决于两个方面:

       (一) 贴图分辨率(Resolution)(二)阴影的类型(Hard/Soft);
        Resolution设置: 低质量 中等质量 高质量 极高质量,越高,越清晰,消耗也越大。
        Type: 可以设置为hard阴影和softer阴影; hard比较生硬,但是软阴影比硬阴影要消耗更多的资源。
        硬阴影是GPU运算的,不影响CPU的性能和内存,软阴影会消耗CPU,但是硬阴影的细节没有软阴影的精细,效果不好,太硬。
    4: 用户将阴影设置为 Use Quality Settings使用的是全局的设置参数:全局设置参数面板这样打开Edit-->Project Settings->Quality
    Edit-->Project Settings->Quality 中和阴影相关的参数。
      Shadows: 设置阴影的类型;Disable Shadows全局没有阴影,Hard Shadows Only全局只用硬阴影,Hard and Soft Shadows全局软和硬阴影都可以
      Shadow Resolution 阴影设置分辨率,分辨率越高,开销越大
      Shadow Projection 阴影投射, 平行光的投射投影有两种: Close Fit渲染高分辨率阴影, Stable Fit渲染低分辨率阴影; 
      Shadow Distance: 相机阴影可见的最大距离,超过这个距离阴影不会被计算和绘制;就是物体到摄像机的距离
      Shadow Casades : 阴影重叠,重叠数目越高,质量越好,开销越大;

    阴影的优化

    搞不好就是性能的瓶颈
    1: 静态物体: 尽量使用光照贴图,将阴影预先烘培出来,不实时的计算阴影;
    2: 设置分辨率和阴影类型,适当降低开销,硬件阴影的消耗要比软件阴影的小;
    3: 设置阴影在摄像机范围的显示距离;
    4:并非所有的显卡都支持硬件阴影,要做好测试;

    小技巧:

    打开模型的三角网格方法:

    在Scene视图的菜单栏的Gizmos下面勾选Selection Wire

  • 相关阅读:
    个人管理:提高你的搜商
    敏捷个人:提供更多文档下载,并转载一篇敏捷个人读书笔记
    个人管理: 激励你的一句话
    敏捷个人 从Scrum实践来思考如何导入价值观
    信息系统开发平台OpenExpressApp 如何解决ComboBox.TextProperty绑定带来问题的来龙去脉
    敏捷个人 敏捷个人价值观,欢迎提出你的意见和你的价值观
    使用VS2010的CodedUI来做自己的自动化测试框架
    .Net4下的MEF(Managed Extensibility Framework) 架构简介
    IronRuby - 快速在半小时学习Ruby基础知识
    敏捷个人 项目网站文档页签增加blog链接
  • 原文地址:https://www.cnblogs.com/HangZhe/p/7247467.html
Copyright © 2011-2022 走看看