一、材质和着色器

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. cordova开发跨平台应用问题随笔记

    iOS下频繁请求地理位置授权 做的某个cordova应用有用到geolocation插件,跑在iOS的时候发现app请求了一次授权,结果webkit还请求了一次授权,不但如此,webkit请求的格式还 ...

  2. JAXB基本使用

    JAXB主要用来实现对象和XML之间的序列化和反序列化,关于JAXB的介绍就不多说了,网上一搜一大把,这里主要总结下基本使用方法和一些注意事项 首先定义两个示例类ClassA,ClassB,用于后续的 ...

  3. win上的某个端口是否开启

    1.添加Telnet服务 控制面板-->程序-->打开或关闭windows功能 2.配置Telnet为自动并开启服务 计算机-->服务和应用程序-->服务 3.telnet - ...

  4. C++ 使用vector时遇到的一个问题

    我在测试程序中定义一个存储三维点的结构体,并定义该结构体的vector,当我在向vector插入元素时,编译一直提示错误: 代码片段如下:  C++ Code  1234567891011121314 ...

  5. Sql server连接数据库报错相关

    情况一:此版本的 SQL Server 不支持用户实例登录标志. 解决方法: 方法1:在连接属性的设置里边,点高级,将User Instance 设置为false,默认的true(我在中没有找到相应的 ...

  6. ASP.NET 动态创建文本框 TextBox (add TextBox to page dynamically)

    下面的函数每执行一次就生成一个TextBox(其实是<input type="Text">)    var i=0;     function changeIt()   ...

  7. JS三种简单排序算法

    冒泡排序:最简单.最慢.长度小于7的时候最优 插入排序:比冒泡要快比快速排序和希尔排序慢,数据量小的时候优势大 快速排序:速度很快  //js利用systemSort进行排序 systemSort: ...

  8. Eclipse------maven使用Maven build编译web项目显示" javax.servlet.http 不存在"

    缺少javax.servlet包 解决方法: 引入下面代码即可 <project> <dependencies> <dependency> <groupId& ...

  9. Mysql主从热备

    mysql主从配置比较不错的文章,大家可以参考下~ https://www.cnblogs.com/kissdodog/p/5422195.html

  10. Selenium 前进和后退

    我们平常使用浏览器时都有前进和后退功能, Selenium 也可以完成这个操作,它使用 back() 方法后退,使用 forward() 方法前进 from selenium import webdr ...