2018-10-20 21:37:30 qq_43459806 阅读数 1395
  • Unity3D入门到精通-(3)Unity资源管理精讲

    本次系列课程的目标是让Unity3D初学者掌握Unity3d的资源管理技术进行了全面介绍,特别对AssetBundle资源如何进行更新,以及加载(依赖资源加载)进行了系统的介绍。 适合对象:Unity初学开发者,Unity中级开发者,网络程序开发者,所有对游戏开发有兴趣的人员。 学习条件:有一定的Unity3D基础,了解C#的基本开发知识。

    4645 人正在学习 去看看 张刚

Unity3D--光的反射与折射实现
  最近做老师的科研项目,主要方向是虚拟现实,重点是研究光学物理实验。在这里写一些自己开发过程中想法和实现细节,方便自己回顾和分享给需要的小伙伴! ☆☆☆☆☆☆☆☆☆☆☆
  说起光,首先要在Unity3D场景中将光线显示出来且满足光学实验规律。那么,先介绍目前我用过的两种光线显示方法:
  一、Unity3D中的LineRender画线法,该方法网上介绍都比较详细,我就不说了。主要介绍我目前实验中用到Vectrosity
  二、Vectrosity 5.4.2画线插件,该插件可以很方便地在2D和3D物体上绘制线段、射线以及折线等等。(点击下载:目前在审核中,需要可以私发插件包和官方文档。)
  接下来,回到我们的重点内容:光的反射和折射实现。
  光的反射,不用多说,Unity3D中包含该方法,即:reflect(float3 I,float3 N);I为入射光线向量,N为法线向量。
  例如:fanShe = Vector3.Reflect(hit.point - v0, hit.normal); //返回fanShe为反射光线。
  运用Vectrosity 插件绘制反射光线,即:

using UnityEngine;
using Vectrosity;
public class Lightings : MonoBehaviour
    {
        private VectorLine myLine;//绘制反射光线
        
        void Start()
        {
        }
        
        void Update()
        {
            v0 = GameObject.Find("origin").transform.position;
                //绘制反射光线...
                fanShe= Vector3.Reflect(hit.point - v0, hit.normal);
                myLine = VectorLine.SetRay3D(Color.blue, 0.1f, hit.point, fanShe);
                myLine.lineWidth = 4.0f; 
        }
}

光的折射,不幸的是在Unity3D中并没有写该方法,需要我们自己构造,没搞错吧??这种API方法难道不是应该Unity3D写好的吗?有反射,怎么会没有折射,这也太偏心了吧。。。。。

      没有办法的呀,自己默默找资料,写呗。废话不多说,直接上代码。GoGo~~~~~

 //该函数返回结果为:折射光线的方向,其中:I为入射光线,N为法线,h为折射率
        public Vector3 Refract(Vector3 I, Vector3 N, float h)
        {
            I = I.normalized;//单位化
            N = N.normalized;

            float A = Vector3.Dot(I, N);
            float B = 1.0f - h * h * (1.0f - A * A);
            Vector3 T = h * I - (h * A + Mathf.Sqrt(B)) * N;
            if (B > 0)
                return T;
            else
                return Vector3.zero;
        }

下面还是运用实例,讲解该方法如何运用,上代码——>>

public class Lightings : MonoBehaviour
    {
        public float mN1 = 1.0f;  //空气折射率1
        public float mN2 = 1.33f;  //水折射率1.33
        private VectorLine myLine1;//绘制反射光线
        
        void Start()
        {
        }
        
        void Update()
        {
                //绘制折射光线...光线从空气射向水中,绘制水中折射光线。
                //(endHit.point - startHit.point)为入射光线向量
                zheShe = Refract(endHit.point - startHit.point, endHit.normal, mN1/mN2);
                myLine1 = VectorLine.SetRay3D(Color.red, 0.1f, hit.point, zheShe);
                myLine1.lineWidth = 4.0f; 
        }
}

贴一张我的实验效果图(3D场景下):起始为红光,当然发生反射、折射(以及全反射)现象。

2015-03-05 10:29:18 book_longssl 阅读数 3345
  • Unity3D入门到精通-(3)Unity资源管理精讲

    本次系列课程的目标是让Unity3D初学者掌握Unity3d的资源管理技术进行了全面介绍,特别对AssetBundle资源如何进行更新,以及加载(依赖资源加载)进行了系统的介绍。 适合对象:Unity初学开发者,Unity中级开发者,网络程序开发者,所有对游戏开发有兴趣的人员。 学习条件:有一定的Unity3D基础,了解C#的基本开发知识。

    4645 人正在学习 去看看 张刚
【狗刨学习网】

1、  画多条线
画多条线需要在场景中放置多个GameObject,因为一个GameObject只能添加一个LineRenderer Component。

2、  线段样式
线段的样式由LineRenderer组件的材质控制

3、  坐标系
LineRenderer使用了2种坐标系:World和Location。在设置目标点的时候需要注意你使用的坐标系是哪一种。
声明:此篇文档时来自于【狗刨学习网】社区,是网友自行发布的Unity3D学习文章,如果有什么内容侵犯了你的相关权益,请与官方沟通,我们会即时处理。
Location:
  1. transform.LookAt(rh.point);  //GameObject始终面对目标点
  2. lineRenderer = (LineRenderer)gameObject.GetComponent ("LineRenderer");     
  3.        lineRenderer.useWorldSpace=false;
  4.        lineRenderer.SetWidth(0.1f,0.1f);
  5. Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
  6.             if(Physics.Raycast(ray,out rh)){
  7. lineRenderer.SetPosition(0, Vector3.forward*rh.distance);//方向*距离,典型的Location坐标系用法
  8. }
复制代码
World:
  1. void Start () {
  2.         gameObject.SetActive(false);
  3.         lr = gameObject.GetComponent(typeof(LineRenderer)) as LineRenderer;            
  4.         lr.SetWidth(0.1f,0.1f);
  5.     }
  6.     
  7.     // Update is called once per frame
  8.     void Update () {    
  9.         if(Input.GetMouseButtonUp(0)){
  10.             
  11.             //Get click position
  12.             Ray ray = Camera.mainCamera.ScreenPointToRay(Input.mousePosition);
  13.             lr.SetVertexCount(lineSeg+1);
  14.             if(Physics.Raycast(ray,out rh)){                
  15.                 pointPos.Add(DrawLine(rh));
  16.             }            
  17.         }
  18.         
  19.         if(Input.GetMouseButtonUp(1)){
  20.             //destroy point
  21.             DestroyLine();
  22.         }
  23.         
  24.         
  25.     }
  26.     
  27.     
  28.     GameObject DrawLine(RaycastHit pointPos){

  29.                 //Display point
  30.                 GameObject gb_pointer = GameObject.Instantiate(pointer) as GameObject;
  31.                 gb_pointer.transform.position =pointPos.point + (transform.position - pointPos.point) * 0.01f; 
  32.                 gb_pointer.transform.rotation = Quaternion.LookRotation (pointPos.normal, Camera.mainCamera.transform.up);
  33.                 Vector3 laserpos = new Vector3();
  34.                 laserpos.x= 90.0f;
  35.                 laserpos.y= gb_pointer.transform.position.y;
  36.                 laserpos.z= gb_pointer.transform.position.z;
  37.                 gb_pointer.transform.eulerAngles = laserpos;
  38.                 lr.SetPosition(lineSeg,pointPos.point);   //设置目标点的坐标,使用的是world坐标系
  39.                 lineSeg++;
  40.                 return gb_pointer;
  41.     }
  42.     
  43.     void DestroyLine(){
  44.     
  45.         int arrayLength = pointPos.Count;
  46.         if(arrayLength > 0){
  47.             GameObject.Destroy(pointPos[arrayLength-1]);
  48.             pointPos.RemoveAt(arrayLength-1);        
  49.             lr.SetVertexCount(--lineSeg);
  50.         }
  51.     }
复制代码




2018-09-20 13:16:09 weixin_42513339 阅读数 3727
  • Unity3D入门到精通-(3)Unity资源管理精讲

    本次系列课程的目标是让Unity3D初学者掌握Unity3d的资源管理技术进行了全面介绍,特别对AssetBundle资源如何进行更新,以及加载(依赖资源加载)进行了系统的介绍。 适合对象:Unity初学开发者,Unity中级开发者,网络程序开发者,所有对游戏开发有兴趣的人员。 学习条件:有一定的Unity3D基础,了解C#的基本开发知识。

    4645 人正在学习 去看看 张刚

1.若只需要在调试场景Scene里查看,不需要在Game运行场景看到,可以使用

Debug.Draw

这个函数一般在Update/Fixed Update/LateUpdate里调用,并且不能设置材质,不过可以指定颜色,例子如下:

void Update()
    {
        Debug.DrawLine (Pos1, Pos2,Color.yellow);
    }

 

2.如需要在游戏运行场景中看到,则需要使用lineRender,这个可以直接在组件栏下直接添加

其中可以增加材质,在Positions里可以增加点,然后连直线,若需要实时更新直线,则需要添加脚本,在Update函数里面添加点,例子如下:

this.GetComponent<LineRenderer>().SetPosition(0, transform.position);

transform.position就是你需要时刻改变的点位置。

画直线有很多方法,现在我只是写了两个,若以后使用了其他方法,再来补充。

LineRender画圆的方法详见 https://blog.csdn.net/weixin_42513339/article/details/83210495

 

下面说一下画虚线的方法:

本人还是用了lineRender,主要是自己做一个虚线的材质赋给lineRender。

步骤如下:

1.下载一张只有带虚线的图,背景是透明的,一般为PNG格式,

2.新建一个material,然后材质把最上面的shader改成如下,贴图找到上面的图,然后把这个材质给lineRender即可,其中需要注意的是,画出虚线之后,看到的可能是实线,这里我们就需要条件下面的Tiling和Offset了,我这里调节了Tiling中的X得到了虚线。

 

 

 

 

 

 

图片来自:https://blog.csdn.net/dengshunhao/article/details/80402444

 

2015-02-03 12:29:33 book_longssl 阅读数 723
  • Unity3D入门到精通-(3)Unity资源管理精讲

    本次系列课程的目标是让Unity3D初学者掌握Unity3d的资源管理技术进行了全面介绍,特别对AssetBundle资源如何进行更新,以及加载(依赖资源加载)进行了系统的介绍。 适合对象:Unity初学开发者,Unity中级开发者,网络程序开发者,所有对游戏开发有兴趣的人员。 学习条件:有一定的Unity3D基础,了解C#的基本开发知识。

    4645 人正在学习 去看看 张刚


重要模块的类图


是一个Component-Based的游戏引擎,并且为GamePlay Progrmmer提供了很多游戏性层上的支持。比如可以在图形界面上设计动画状态转换的Animator。比如可以直接在场景编辑器中方便进行调整的Collider。比如可以动态调整动画曲线的Animation。总的来说,是一个架构比Cocos2d-x精巧许多的游戏引擎。

但是很遗憾的是,本身并不开源,还好,在不开源的情况下却做了比较详尽的文档支持。同时,的社区也是很友好的,stackoverflow也有许多值得一看的问题。

我在学的知识的时候,发现内部涉及的重要类比Cocos2d-x要多,有点理不清的感觉,所以制作了下面的设计类图来为像我一样的初学者提供一个的初步印象。




GameObject和Component
由于是一个Component-Based的游戏引擎,所以游戏中所有的物体都是一个GameObject,为了给这个GameObject附加上各种各样的属性,所以我们引入了Component这个概念。

GameObject是由Component组合成的,Component的生命周期和GameObject息息相关。一旦GameObject的Destroy方法,它的子对象和对应的所有Component都会被销毁,同时,我们也可以一次只销毁一个单独的Component。

Component有如下这些种类,我制作了一张表格来记录它们的用途:



组件附属于游戏物体.把一个 Renderer(渲染器)组件附到游戏对象,可以使游戏对象显示到场景,附一个 Camera(摄像机)可以把物体变成一个摄像机物体.所有脚本都是组件,因此都能附到游戏对象上.

常用的组件可以通过简单的成员变量取得:

附在游戏对象上的组件或脚本可以通过GetComponent获取.如下代码示例:
using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {   
    void Awake() {        
        transform.Translate(010);        
        GetComponent[tr]().Translate(010);   
    }
}


Input和InputManager
支持,键盘,操纵杆和游戏手柄输入。

输入管理器(Input Manager)可以创建虚拟轴和按钮,并终端用户可以在屏幕配置对话框配置键盘输入。

如果想添加新的虚拟轴,选择菜单Edit->;Project Settings->Input menu。这里可以改变每个轴的设置。即可进入Input Manager的配置界面。


从脚本,所有虚拟轴通过它们的名字(name)来访问。

当创建时,每个项目都具有下面的默认输入轴

  • Horizontal and Vertical are mapped to w, a, s, d and the arrow keys. 
    水平和垂直被映射到w, a, s, d键和方向键
  • Fire1Fire2Fire3 are mapped to Control, Option (Alt), and Command, respectively. 
    Fire1, Fire2, Fire3被分别映射到Ctrl,Option(Alt)和Command键
  • Mouse X and Mouse Y are mapped to the delta of mouse movement. 
    Mouse X 和 Mouse Y被映射到鼠标移动增量
  • Window Shake X and Window Shake Y is mapped to the movement of the window. 
    Window Shake X 和 Window Shake Y 被映射到窗口的移动

Time

Time类是Unity中的一个全局变量,它记载了和游戏相关的时间,帧数等数据。

Time类包含一个非常重要的变量叫deltaTime.这个变量包含从上次调用Update 或FixedUpdate到现在的时间(根据你是放在Update函数还是FixedUpdate函数中).(另注: Update每帧调用一次)

依照上面的例子,使得物体在一个匀速的速度下旋转,不依赖帧的速率,如下:

using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {   
    void Update() {        
        transform.Rotate(05 * Time.deltaTime, 0);   
    }
}

当然了,在使用Time这个类的时候,我们也要记住使用各种各样的Lerp函数来减少自己的工作量,在Unity3D中,Vector3,Vector2,Color等类都提供了相应的Lerp函数给我们调用。 Physics和Transform

Physics类是Unity重的一个工具函数类,它主要提供了Linecast和Raycast两种射线投射方式。

其中Linecast是以投射的起始位置和终止位置为参数,来判断这个投射有没有和某个Collider发生了碰撞。

而Raycast则是以投射的起始位置和投射方向为参数,来判断这个投射有没有和某个Collider发生了碰撞。
相应的实例可以看下面的这一段程序:

using UnityEngine;
using System.Collections;
public class Example : MonoBehaviour {   
    void Update() {   
        // 使用Raycast        
        Vector3 fwd = transform.TransformDirection(Vector3.forward);        
        if (Physics.Raycast(transform.position, fwd, 10))            
            print("There is something in front of the object!");        
        // 使用Linecast    Transform target;   
        if (!Physics.Linecast(transform.position, target.position))        
            ProcessData.AndDoSomeCalculations();   
    }
}

在Physics这个模块中,有三个Component是至关重要的,分别是RigidBody,Collision,Joint。在新的版本中,又引入了RigidBody2D,Collision2D,Joint2D这些Component来处理2D中的Physics事件。

这三个类都是处理物理相关的事件的,那么它们有什么区别呢?

RgidBody是作为一个受力物体而存在的,所以可以向一个RigidBody施加Force(力),Drag(阻力)。同时RigidBody还有 velocity (速度),mass(质量),position(位置),旋转(rotation)等等。

Collider是为了处理物理中的碰撞事件而出现的类,就像上面表格中所说的,如果没有Collider,两个RigidBody之间是无法发生碰撞的。对同一个GameObject可以绑定多个Collider构建更加复杂的碰撞体结构。Collider另外一个很值得注意的就是我们可以为Collider设置material,即Collider的物理材质。 物理材质用于调整摩擦力和碰撞单位之间的反弹效果。

当发生碰撞时,会触发毁掉函数OnCollisionEnter,OnCollisionStay,OnCollisionExit等等。这几个函数与OnTriggerXXX的区别会在接下来的博客中提到。

Joint用于连接两个RigidBody,当Joint断掉的时候会触发OnJointBreak的回调函数。



2017-10-20 17:41:44 q764424567 阅读数 2433
  • Unity3D入门到精通-(3)Unity资源管理精讲

    本次系列课程的目标是让Unity3D初学者掌握Unity3d的资源管理技术进行了全面介绍,特别对AssetBundle资源如何进行更新,以及加载(依赖资源加载)进行了系统的介绍。 适合对象:Unity初学开发者,Unity中级开发者,网络程序开发者,所有对游戏开发有兴趣的人员。 学习条件:有一定的Unity3D基础,了解C#的基本开发知识。

    4645 人正在学习 去看看 张刚

Inspector 灯光检视面板

![这里写图片描述](https://imgconvert.csdnimg.cn/aHR0cDovL2ltZy5ibG9nLmNzZG4ubmV0LzIwMTcxMDIwMTcyMTIzNDIw?x-oss-process=image/format,png)

Unity有三种灯光

Point

点光源。从一个位置向四面八方发出光线,就像一盏灯。

Directional

方向光源(平行光)。 被放置在无穷远的地方,影响场景的所有物体,就像太阳

Spot

聚光灯 。灯光从一点发出,只在一个方向按照一个锥形物体的范围照射,就像一辆汽车的车头灯。

灯光也可以投射阴影。阴影是专业版的功能。阴影属性可以在每一个灯光的基础上进行调整。

Properties 属性

Type 类型

灯光对象的当前类型

Directional 方向光

灯光放在无穷远处。它影响着在场景里所有物体。

Point 点光

灯光从它的位置各个方向发出光线,影响其范围内的所有对象。

Spot 聚光

光线在 按照聚光灯的角度和范围所定义的一个圆锥区域 照射所有物体。只有在这个区域内的对象才会受到光线照射。

Range 范围

光从物体的中心发射能到达多远?。只对点光源和聚光灯

Spot Angle 聚光灯角度

灯光的聚光角度。只用于聚光灯

Color 颜色

光线的颜色.

Intensity 强度

线的明亮程度,点光源/聚光灯 默认值是1。方向光源 默认值是0.5

Cookie

这个纹理的阿尔法(alpha)通道作为一个遮罩,使光线在不同的地方有不同的亮度。如果灯光是聚光灯或方向光,这必须是一个2D纹理。如果灯光是一个点光源,它必须是一个立方图(Cubemap)。

Cookie Size

缩放Cookie投影。只用于方向光。

Shadow Type 阴影类型(Pro only)

硬或软的阴影,将是由灯光所投射的。只适用于编译桌面目标程序(PC)。软阴影更为昂贵。(耗资源)

Strength 硬度

阴影的黑暗程度。取值范围是在0和1之间。

Resolution 分辨率

阴影的细节水平。

Bias 偏移

用于比较灯光空间的像素位置与阴影贴图的值比较的偏移量。当值太小,表面会产生self-shadow("影子痤疮"),-----就是物体的表面会有来自于自身的阴影,物体就像长了痘痘一样。当值太大,光源就会脱离了接收器("彼得平移")。

Softness 柔化

缩放半阴影区(模糊样本的偏移量)。只用于方向光

Softness Fade 柔化淡出

阴影柔化是根据到相机距离进行淡出的。只用于方向光。

Draw Halo 绘制光晕

如果勾选此项, 光线带有一定半径范围的球形光晕被绘制。

Flare 耀斑

可选的。参考耀斑(Flare) , 在光的位置渲染出来。

Render Mode 渲染模式

这灯光的重要性。这可能会影响照明的保真度和性能,请参阅下面的性能注意事项。包括:

Auto 自动

为桌面构建目标渲染的方法是根据附近的灯光的亮度和当前的质量设置( Quality Settings)在运行时确定。

Important 重要

灯光是逐个像素渲染。只用在一些非常重要的效果(比如玩家的车的车头灯)。

Not Important 不重要

灯光总是以最快的速度渲染。顶点/对象光模式

Culling Mask 消隐遮罩

有选择地使组对象不受光的效果影响;请看层(Layers.)。

Lightmapping 光照贴图

光照贴图的模式:仅灯光实时计算(RealtimeOnly), 自动(Auto) or 仅烘焙( BakedOnly) 请看双光照贴图(Dual Lightmaps )

Details 细节

There are three basic light types in Unity. Each type can be customized to fit your needs.

在Unity中光有三种基本类型。各类型可以定制,以满足您的需要。

You can create a texture that contains an alpha channel and assign it to the Cookie variable of the light. The Cookie will be projected from the light. The Cookie’s alpha mask modulates the light amount, creating light and dark spots on surfaces. They are a great way af adding lots of complexity or atmosphere to a scene.

你可以创建一个包含alpha通道的纹理,并将其赋予光线的Cookie变量。Cookie会被光线投影。cookie的Alpha遮罩调节光量,可以在表面产生亮点和黑点。他们是往场景加入大量复杂的东西或气氛的一种很好的方法。

All built-in shaders in Unity seamlessly work with any type of light. VertexLit shaders cannot display Cookies or Shadows, however.

Unity里所有的内置的着色器(built-in shaders)全都可用于任何类型的灯光。然而,VertexLit 着色器不能显示Cookies或者阴影。

In Unity Pro with a build target of webplayer or standalone, all Lights can optionally cast Shadows. This is done by selecting either Hard Shadows or Soft Shadows for the Shadow Type property of each individual Light. For more information about shadows, please read the Shadows page.

在Unity专业版,编译目标为网页版或单机版,所有的灯光可以选择性地投射阴影(Shadows)。这是通过选择每个灯光阴影类型( Shadow Type)属性为"硬阴影或软阴影来完成的。更多关于阴影的信息,请阅读阴影(Shadows )页。

Point Lights 点光源

Point lights shine out from a point in all directions. They are the most common lights in computer games - typically used for explosions, light bulbs, etc. They have an average cost on the graphics processor (though point light shadows are the most expensive).

点光源光线在某一点从各个方向发射。它们是电脑游戏中最常用的灯光——通常用于爆炸、灯泡、等。他们有一个图形处理器的平均成本(虽然点光源阴影是最昂贵的—最耗费资源的)。

Point Lights 点光源
这里写图片描述

Point lights can have cookies - Cubemap texture with alpha channel. This Cubemap gets projected out in all directions.

点光源可以有cookies – 带有 alpha通道的立方图(Cubemap )纹理。立方图 (Cubemap)可在各个方向得出投影。

这里写图片描述
Point Light with a Cookie 带有Cookie的点光源
这里写图片描述

Spot Lights 聚光灯

这里写图片描述

Spot lights only shine in one direction, in a cone. They are perfect for flashlights, car headlights or lamp posts. They are the most expensive on the graphics processor.

聚光灯只在一个方向上,在一个圆锥体范围发射光线。它们用作手电筒真是完美,汽车的车头灯或者灯柱。它们在图形处理器上是最耗费资源的。

Spot Lights 聚光灯
这里写图片描述

Spot lights can also have cookies - a texture projected down the cone of the light. This is good for creating an effect of light shining through the window. It is very important that the texture is black at the edges, has Border Mipmaps option on and its wrapping mode is set to Clamp. For more info on this, see Textures.

聚光灯同样也可以带有cookies - 这可以很好地创建光芒透过窗户的效果。纹理的边缘是黑色的,打开边框多层纹理(Border Mipmaps )选项和它的循环模式(wrapping mode)设置为强制拉伸(Clamp),这是非常重要的。想要得到更多关于这方面的信息,参见纹理(Textures.)

Spot Light with a Cookie 带有Cookie的聚光灯
这里写图片描述

Directional Lights 方向光源
这里写图片描述

Directional lights are used mainly in outdoor scenes for sun & moonlight. The light affect all surfaces of objects in your scene. They are the least expensive on the graphics processor. Shadows from directional lights (for platforms that support shadows) are explained in depth on this page.

方向光主要用于模拟在室外场景的阳光与月光。方向光影响你的场景中的对象的所有表面。 他们在图形处理器中是最不耗费资源的。方向光产生的阴影(因为平台支持阴影)标识着在此页(this page)上的深度。

这里写图片描述
Directional Light 方向光源

When directional light has a cookie, it is projected down the center of the light’s Z axis. The size of the cookie is controlled with Cookie Size property. Set the cookie texture’s wrapping mode to Repeat in the Inspector.

当平行光有一个cookie,它是预测光的Z轴的中心。cookie大小由cookie的大小(Cookie Size)属性控制。在检视面板设置cookie贴图的循环模式(wrapping mode)为重复(Repeat)

这里写图片描述
Directional Light projecting a cloud-like cookie texture
方向光投影一个云状的cookie纹理

A cookie is a great way to add some quick detail to large outdoor scenes. You can even slide the light slowly over the scene to give the impression of moving clouds.

Cookie是在大型户外场景中快速添加细节的好方法。你甚至可以将的灯光在场景中慢慢移动,给人的感觉就像云在动。

Performance considerations 性能考虑

Lights can be rendered in one of two methods: vertex lighting and pixel lighting. Vertex lighting only calculates the lighting at the vertices of the game models and interpolates the lighting over the surfaces of the models. Pixel lights are calculated at every screen pixel, and hence are much more expensive. Some older graphics cards only support vertex lighting.

灯光有两种渲染方式:顶点(vertex )光照和像素(pixel )光照。顶点光照只计算游戏模型的顶点照明和通过插值计算得出模型表面所有光线。灯光在屏幕每一个像素计算,因此很奢侈(耗费资源)。一些旧的显卡只支持顶点光照。

While pixel lighting is slower to render, it does allow some effects that are not possible with vertex lighting. Normal-mapping, light cookies and realtime shadows are only rendered for pixel lights. Spotlight shapes and Point light highlights are much better when rendered in pixel mode as well. The three light types above would look like this when rendered in vertex light mode:

像素光照渲染得慢,但它能够实现一些顶点光照不能实现的效果。正规映射(Normal-mapping),灯光cookies(light cookies) 和实时阴影(realtime shadows)只能由像素光照渲染。在像素光照模式下,聚光灯的形状和点光源亮点效果更好。当在顶点光照模式下渲染,以上三种光照类型的效果就像这样:
这里写图片描述

Point light in Vertex lighting mode. 在顶点光照模式下的点光源

这里写图片描述
Spot light in Vertex lighting mode. 在顶点光照模式下的聚光灯
这里写图片描述
Directional light in Vertex lighting mode. 在顶点光照模式下的方向光

Lights have a big impact on rendering speed - therefore a tradeoff has to be made betwen lighting quality and game speed. Since pixel lights are much more expensive than vertex lights, Unity will only render the brightest lights at per-pixel quality. The actual number of pixel lights can be set in the Quality Settings for webplayer and standalone build targets.

灯光有对渲染速度有非常大的影响——因此必须权衡前后照明质量和游戏速度。由于像素光照比顶点光照奢侈得多(更耗费资源),Unity将只在最亮的光逐个像素渲染。网页版(webplayer)和单机版(standalone)编译目标中,像素灯的实际数量可以质量设置( Quality Settings )进行设置。

You can explicitly control if a light should be rendered as a vertex or pixel light using the Render Mode property. By default Unity will classify the light automatically based on how much the object is affected by the light.

光线以顶点光照或像素光照模式渲染。你可以通过渲染模式属性(Render Mode property)显式控制。默认情况下,Unity根据对象受到光影响的多少自动对光进行归类。

The actual lights that are rendered as pixel lights are determined on an object-by-object case. This means:

实际灯光被渲染在object-by-object的情况下确定作为像素光渲染。这句话的意思是:

Huge objects with bright lights could use all the pixel lights (depending on the quality settings). If the player is far from these, nearby lights will be rendered as vertex lights. Therefore, it is better to split huge objects up in a couple of small ones.
带有明亮灯光的巨大物体,可以全用像素光照(根据质量设置)。如果玩家非常远,附近的灯光可以用顶点光照模式渲染。因此,巨大的物体应分割成几个小的物体这样更好。
See Optimizing Graphics performance on Desktop, iOS or Android page for more information.

在 台式机(Desktop),iOS 或Android 页面参见优化图形性能(Optimizing Graphics performance),获取更多信息。

Creating Cookies

For more information on creating cookies, please see the tutorial on how to create a Spot light cookie.

创建的Cookie的更多信息,请参阅关于如何创建一个射灯cookie的教程( tutorial on how to create a Spot light cookie)

Hints 提示

Spot lights with cookies can be extremely effective for making light coming in from windows.
带cookies的聚光灯可以很有效的制作出光线从窗户射进来的效果。
Low-intensity point lights are good for providing depth to a scene.
低强度点光源带来场景深度。
For maximum performance, use a VertexLit shader. This shader only does per-vertex lighting, giving a much higher throughput on low-end cards.
为了获得最佳性能,使用VertexLit 着色。这个着色器(shader)只进行顶点光照,在低端卡提供高得多的吞吐量。

没有更多推荐了,返回首页