一、材质和着色器

1、材质和着色器
紧密的联系,其中材质相当于是一个框架,而着色器就是框架中中的内容。在材质框架中可以选择不同的Shader并调节不同的

属性

Material和Physic Material区别?
PhysicMaterial 物理材质:物理材质描述,如何处理物体碰撞(摩擦,弹性)。
Material 材质(材质类)为了获得一个对象使用的材质,可以使用 Renderer.material 属性:

导入的资源Material:Normal map (法线贴图),
新建的Material材质:Bumped Diffuse

小知识

  发现贴图:

  1、说起Normal Map(法线贴图),就会想起Bump Map(凹凸贴图)。Bump Mapping是Blin大师在1978年提出的图形学算法,目的是以低代价给予计算机几何体以更丰富的表面信息(高模盖低模)。30年来,这项技术不断延展,尤其是计算机图形学成熟以后,相继出现了不少算法变体,90年代末的Normal Map解放了必须自行计算纹理像素法线的痛苦,新世纪以来相继又出现了Parallax Mapping(视差映射[ˈpærəlæks]), Relief Mapping([rɪˈli:f]浮雕贴图映射)等技术。抛开那些无聊的概念区分,它们的本体还是Bump Map,目的也是一致的。

  2、(转)我们知道,在游戏中经常会有这样的情况,就是一个平面——这个平面在现实中并不是一 个“平”面,例如砖墙的表面带有石质浮雕等等。这样的情况如果要求游戏开发人员将复杂的3D细节都做出来是不现实的,因为即使不计较在建模时候的复杂度, 过多的3D细节也同样会大量消耗显示芯片的性能,让游戏根本没有可玩性。

如何利用贴图实现凹凸效果呢?

  可行的方法就是将这个平面用一个贴图覆盖,用贴图的纹理实现一定的凹凸效果。但是这种方法实现的效果并不是很好,因为如果视角一变化,看起来就会像一张简单的画有图案的平面了。

  后来,聪明的游戏开发者想出了一种方法,就是在贴图过程中对贴图进行一定的处理,从而保证了在视角变换以后仍然保证有较为明显的凹凸效果。

  我们可以通过在贴图上的局部做一些亮暗的变化来做到一种假的3D效果。

  

法线贴图就是记录了一个需要进行光影变换的贴图上的各个点的凹凸情况的贴图,显示芯片根据这个贴图的内容,来实时的生成新的有过光影变化的贴图,从而实现立体效果。

  那么,究竟是怎样利用法线贴图记录一个平面或者说是一个贴图的凹凸情况呢?我们知 道,物体表面产生明暗变化的直接原因,就是光线照射角度的不同,光线垂直于平面的地方就亮,光线斜射到平面的地方就暗,光线照不到的地方就更暗(应该是黑 色,但是由于环境光照所以不会有阴影是真正的黑色)。

  

记录这些法线的载体就被我们称为法线贴图。为什么称之为贴图呢?我们知道,一条法线 是一个三维向量,一个三维向量由X、Y、Z等3个分量组成,于是人们想出了一个聪明的方法,就是以这3个分量当作红绿蓝3个颜色的值存储,这样的话就生成 一张新的贴图了,这就是法线贴图的来历。


采用色彩通道存储法线向量

法线贴图其实并不是真正的贴图,所以也不会直接贴到物体的表面,它所起的作用就是记录每个点上的法线的方向。所以这个贴图如果看起来也会比较诡异,经常呈现一种偏蓝紫色的样子。


法线贴图的生成过程


Doom3中的一张纹理贴图和这张贴图对应的法线贴图

  『小提示-05:事实上,真正的法线贴图并不是记录贴图上每个点的法线的绝对角度,而是记录的是相对于平面的一个差值。这样的话,随着平面的3D变换都能够实现即时的法线运算了。』

总结:简而言之,NormalMapping只是扰动Normal,并未进行TextureOffset,所以表现剧烈凸凹感的时候效果并不如人意。ParallaxMapping是针对NormalMapping的改进,利用HeightMap进行了近似的TextureOffset。而ReliefMapping是精确的TextureOffset,所以表现力上应该是最完美的。

2、Bumped Specular
比Bumped Diffuse 多了Specular Color(高光)和Shininess

private var oneTexture:Texture2D;
private var allTexture:Object[];// function OnGUI()
{
if(GUI.Button(Rect(10,20,120,60),"LoadOneTexture"))
{
if(oneTexture==null)
{
oneTexture=Resources.Load("OneTexture/Grass");
}
} if(GUI.Button(Rect(10,140,120,60),"LoadOneTexture"))
{
if(allTexture==null)
{
allTexture=Resources.LoadAll("AllTexture");
}
} //DrawTexture (position : Rect, image : Texture, scaleMode : ScaleMode = ScaleMode.StretchToFill, alphaBlend : bool = true, imageAspect : float = 0) : void if(oneTexture!=null)
{
GUI.DrawTexture(Rect(140,20,120,120),oneTexture,ScaleMode.StretchToFill,true,0);
} if(allTexture!=null)
{
for(var i=0;i<allTexture.Length;i++)
{
GUI.DrawTexture(Rect(140+i*120,140,120,120),allTexture[i],ScaleMode.StretchToFill,true,0);
}
}
}

二、2D纹理Movie纹理

a.Movie纹理是从视频文件中产生的一系列动画纹理,用户可以向平常资源一样将其放置在Asset资源文件夹中进行导入。
b.Movie纹理是通过Apple Quick Time导入的,因此凡是Quick Time支持的格式,Movie纹理都可以支

持:.mov,.mpg,.mpeg,.mp4,.avi,.asf
c.当一个视频文件添加到项目中时,它会被自动输入并被Unity转换为Ogg Theora格式,然后可以像普通纹理那样进行使用。

Unity的Shader分为三种:
(1)Fixed function shader 属于固定渲染管线 Shader, 基本用于高级Shader在老显卡无法显示时的Fallback(之后有详

细介绍)。使用的是ShaderLab语言,语法与微软的FX files 或者NVIDIA的 CgFX类似。
(2)Vertex and Fragment Shader 最强大的Shader类型,属于可编程渲染管线. 使用的是CG/HLSL语法。
(3)Surface Shader Unity3d推崇的Shader类型,使用Unity预制的光照模型来进行光照运算。使用的也是CG/HLSL语法。

三、3D声音和2D声音

1、3D声音有空间的概念,如果离的远可能会听不到,离声音源近些会听到声音
2D声音则没有空间概念
2、假如游戏场景中有多个声音
可以使用AudioSource.PlayOneShot() 播放一个音频剪辑
@script RequireComponent(AudioSource)

Unity3D笔记 英保通一的更多相关文章

  1. Unity3D笔记 英保通十 射线碰撞器检测

    射线碰撞检测可以用来检测方向和距离: 通过Physics.RayCast光线投射来实现:常用于射击利用发射的射线来判断.还有对战中刀剑交战中.. 一.要涉及到RayCast和RayCastHit 1. ...

  2. Unity3D笔记 英保通九 创建数

    Unity中创建树:可以直接通过程序自动来创建树木还可以手动创建树木(本质上在我看来就是给程序自动创建的树动动”小手术“) 一.程序自动创建树木 3.1.层次视图中创建:一个平行光.摄像机.地.数并且 ...

  3. Unity3D笔记 英保通八 关节、 布料、粒子系统

    一.关节1.1..链条关节 Hinge joint :他可以模拟两个物体间用一根链条连接在一起的情况,能保持两个物体在一个固定距离内部相互移动而不产生作用力,但是达到固定距离后就会产生拉力 1.2.. ...

  4. Unity3D笔记 英保通七 物理引擎

    给球体添加刚体RigidBody和球体碰撞器Sphere Collider 效果: OnTriggerEnter() 代码 using UnityEngine; using System.Collec ...

  5. Unity3D笔记 英保通六 角色控制器

    一.角色控制器 U3D有两种角色控制方式:Rigidbody刚体.角色控制器组件(胶囊体组件) 面试的题目中经常会遇到这个问题: CharacterController和Rigidbody的区别? 这 ...

  6. Unity3D笔记 英保通五 鼠标事件与GUI系统双击检测

    一.如何使用GUI事件来检测鼠标是否按下的事件: 获取当前事件:var e:Event=Event.current: using UnityEngine; using System.Collectio ...

  7. Unity3D笔记 英保通四 虚拟轴应用及键盘事件

    Input: 1.使用这个类能够读取输入管理器设置的按键,以及访问移动设备的多点触控或加速感应数据.想要读取轴向使用Input.GetAxis方法获取下列默认轴: "Horizontal&q ...

  8. Unity3D笔记 英保通三 脚本编写 、物体间通信

    一.脚本编写 1.1.同一类型的方法JS和C#的书写方式却不一样主要还是语法,在工程中创建一个Cube 分别把JSTest.js和CSharp.cs 添加到Cube中 JSTest.js #pragm ...

  9. Unity3D笔记 英保通二

    一.访问另一个物体 1.代码中定义一个public的物体 例如:var target:Transform; 在面板上直接拖拽一个物体赋值给target 2.通过GameObject.Find(&quo ...

随机推荐

  1. 到底什么时候才需要在ObjC的Block中使用weakSelf/strongSelf

    转载,原文: http://blog.lessfun.com/blog/2014/11/22/when-should-use-weakself-and-strongself-in-objc-block ...

  2. Node.js+Express on IIS(续)

    前一篇文章介绍了如何用iis来伺服node网站(开发期间特别有用),结果还落掉一点,我们用node来做restful服务的时候,很多时候可能要响应500系列的状态码,并不是整个系统从头到尾都是200, ...

  3. Unity3D热更新LuaFramework入门实战

    http://blog.sina.com.cn/s/blog_6788cd880102w8qy.html http://www.manew.com/thread-91845-1-1.html http ...

  4. mysql中删除binlog的方法?mysql中如何删除binlog?

    需求描述: 在mysql中如何删除binlog,因为随着数据库的运行,mysql中产生的binlog会越来越大,有可能把磁盘撑爆了,所以记录下删除 binlog的方法. 操作过程: 1.通过系统参数控 ...

  5. C#调用Delphi的dll之详解

    C#调用Delphi接口方法,有两种解决办法: 一.将Delphi程序编译成一个COM组件,然后在C#里引用COM组件. 二.非托管调用Dephi的DLL文件. 这里我们主要讲解一下第二种方法,讲第二 ...

  6. C#------如何处理缺少对公共可见类型或成员的xml注释的警告

    出现警告的原因: 使用Swagger框架时 如图,只要加上注释就可以了 使用前: 使用后:

  7. C#------Aspose的License文件

    Aspose官网: https://docs.aspose.com/display/cellsnet/Home 下载地址: http://vdisk.weibo.com/s/uoya0tRiZNf0X ...

  8. Dubbo -- 系统学习 笔记 -- 入门

    Dubbo -- 系统学习 笔记 -- 目录 入门 背景 需求 架构 用法 入门 背景 随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行, ...

  9. Anaconda本地安装python库

    很多时候我们需要自己手动安装一些库,例如因为网络原因,或者下载源没有这个包. 以Windows环境为例,无论是pip安装还是anaconda安装,最终的包都是安装在,工作目录/Lib/site-pac ...

  10. linux-指定特殊域去重

    测试数据: 2017-10-24 14:14:11:1123 [ INFO] order_type=add,order_id=9152017-10-24 14:14:11:1123 [ INFO] o ...