Unity3D笔记第二十一天——游戏特效处理,贴图材质与Shader

拖尾渲染器(Trail Renderer)
拖尾渲染器(Trail Renderer)用于制作跟在场景中的物体后面的拖尾效果来代表它们在到处移动。
添加方法:为物体添加Component->Effects->Trail Render组件。
主要参数介绍:
Materials:要显示的纹理图像。
Time:轨迹纹理从在场景中开始渲染到结束的停留时间。
Start Width:轮廓起始处的宽度。
End Width:轮廓结束处的宽度。
Colors:轮廓要显示的颜色。


线渲染器(Line Renderer)
线渲染器(Line Renderer)有一个包含两个或更多3D空间中点的数组并在每两个点之间绘制平直的线。
添加方法:为物体添加Component->Effects->Trail Render组件。
Cast Shadows: 是否投射阴影。
Receive Shadows: 是否接收阴影。 Materials :设置材质。
Positions:,它是专门设置线段在3D 世界中的点的坐标,size 设置点的数量为3 那么将会有3个点, 这三个点将确定这条曲线分为两段。
StartWidth :设置起点的宽度  。
EndWidth:  设置终点的宽度 。
Start Color: 设置起点颜色。
Start Color: 设置终点颜色。 Use World Space 使用世界坐标系。


图像特效Image Effect
Unity中所有的图像特效都编写在OnRenderImage 函数中,这样,任何附加在照相机上的脚本都可以通过重写它在完成自定义的特效效果。


光晕(Halos)
光晕(Halos)是光源周围的光线区域,常常用来表现在空气中的细小的灰尘颗粒的效果.光晕(Halos)利用光晕纹理( Halo Texture)在渲


染设置( Render Settings.)


镜头光晕(Lense Flare) 
镜头光晕模拟相机镜头内的折射光线的效果。


Flare Textures 耀斑纹理
纹理布局( Texture Layout )决定了元素(Elements )是如何在耀斑纹理(Flare Texture)进行布局。


投影器(Projector)
Projector能将一个Material投影到所有在设定的平截头体内的物体上。

当创建一个投影机,一定要设置投影器的纹理材质的循环模式为强制拉伸(Clamp)。


贴图材质与Shader
材质概述
物体呈现在我们面前除了形体外,还包括了”固有颜色”与”质地” (质感与光学性质)。固有颜色让物体的表面看起来是什么颜色,而质感


决定了该物质是使用什么材质制成的。在三维建模软件中,一般使用三维建模工具创作物质的形体,使用贴图表现物体的固有颜色,使用材


质表现物质的”质感”。
在Unity3D  中,所有的材质都是由着色语言编写出来的。由着色器语言编写的程序成为着色器。
每个物质除了形体,都具备“固有颜色”、“质感”、“光学性质”,这三种属性决定了该物质在视觉上的自身物理外观,以及在光线下呈


现出的各种质感。


贴图一般可以分为如下几种:
1.二维贴图
2.立方体贴图
3.视频贴图
4.渲染贴图
5.程序贴图


随着实时渲染技术的逐渐成熟,使得贴图越来越倾向于表现物体的固有颜色,而高光和光学特性的表现则分配给着色语言来完成。  
二维贴图就是一张普通的贴图。
一般一个游戏模型的顶点数和多边形都不能太多,所以很多的细节都需要靠贴图来表现。


Unity3D  支持的图片格式:  PSD、TIFF、JPG、TGA、PNG、BMP、IFF、PICT.  我们一般使用PSD、TIFF、TGA  等无压缩或者无损压缩的高


质量、高分辨率图片文件格式来制作贴图。
贴图尺寸,  制作游戏模型时,建议贴图的尺寸为2的n次幂,比如  2、4、8、16、32、64、128、256、512、1024、2048  pixels  等。


贴图属性:
  Texture 普通贴图
  Normal  map 法线贴图
  GUI GUI贴图
  Cursor 光标贴图
  Reflection 立方体贴图,一般制作反射效果。
  Cookie 用于灯光的遮罩贴图。
  Lightmap 光照贴图
  Advanced 高级设置。
  Sprite


贴图属性
Alpha  Frome  Grayscale:根据贴图的灰度级别生成Alpha  通道。
Wrap  Mode:设置纹理平铺方式。(Repeat  重复、Clamp  采用截断方式)
Filter  Mode:贴图拉伸时的差值过滤方式
Aniso  Level:各向异性过滤级别,用于提高贴图的视觉质量。


法线贴图
根据基本贴图的灰度级别把这张贴图转化为法线贴图。法线贴图是现代游戏,尤其是次时代游戏中运用最广泛的贴图之一,它可以通过改变


模型表面的法线方向来使得低多边形呈现更多的细节效果。


法线贴图比普通贴图多了两个属性:
Bumpiness  用于控制法线贴图的强度。
Filtering  用于设置法线贴图的过滤方式。


GUI  贴图类型  (GUI)
如果导入的贴图用于GUI,那么建议
把贴图定义为GUI  贴图。


光标类型  (Cursor)
此种类型的贴图用于例如鼠标
光标效果。


反射贴图  (Reflection)  类型
设置此贴图会被转换为立方体贴图,(根据Mapping  属性)使用它可以实现物体的反射贴图效果。


Cookie  类型
该类型是用于把贴图转换为用于灯光Cookie  效果的贴图。


光照贴图类型(Lightmap)
如果是从第三方建模软件中烘焙出来的光照贴图导入到Unity3D  中,最好把该贴图定义为Lightmap  类型。


高级类型设置
Non  Power  of  2
如果贴图的尺寸不是2的n次幂,需要给它一个缩放的方式。
Bypass  sRGB  Sampling
使用贴图的原有色彩,而不进行Gamma校正。如果是GUI贴图建议开启这个功能。
Generate  Mip  Maps
生成  Mipmap  贴图,游戏场景中的贴图建议打开,但对于GUI贴图建议关闭。


Border  Mip  Maps
防止在较低级别的Mipmap  贴图时颜色在贴图边缘溢出。非常适合光照贴图的使用。
Mip  Map  Filtering
过滤  Mipmap  贴图以优化图像质量的方式。如果贴图在远距离变得模糊,可以试试这选项。
备注:  Mipmap  贴图是一个包含了相同内容不同尺寸的图像列表,它是一种优化实时渲染的贴图技术。  当摄像机较近时使用高尺寸贴图


,当摄像机较远时使用尺寸较小的贴图。  建议场景中所有的模型贴图都要包含Mipmap,但是用于GUI的贴图要取消Mipmap贴图,这样才能保


证GUI贴图的清晰度。


贴图:立方体贴图
立方体贴图  Cubemap
立方体贴图是由六张二维无缝贴图构成的贴图类型。它与天空盒的原理相似,但它主要用来模拟物体对环境的反射效果。
注意:此时的反射是根据这个立方体贴图的内容显示反射的内容,而不是虚拟环境中周围的实时场景。


贴图:视频贴图


继承关系 :    Texture2D 继承与Texture 而Texture继承与Object
Set Pixel    设置坐标(x,y)处的像素颜色
GetPixel    获取坐标(x,y)处的像素颜色
Apply    实际应用前面的SetPixel和Setpixels的更改
Width    以像素为单位的贴图宽度 (只读)
Height      以像素为单位的贴图的高度(只读)


Shader(了解)
CG语言的基础知识
Cg代表“用于图形的C语言”(C for graphics)。C语言是一种非常流行的、开发与20世纪70年代的通用编程语言。Cg语言本身是基于C语言


的。如果已经掌握C语言语法的话,那么掌握Cg也会比较容易。
NVIDIA和Microsoft密切协作开发了Cg语言。Microsoft把他们的实现成为高级着色语言,简称HLSL。HLSL和Cg是同样的语言,但是反应了每


个公司使用不同的名字来识别语言和它的基础技术。HLSL是Microsoft的DirectX Graphics的一部分。而Cg是独立于三维编程接口的,完全和


Direct3D或者OpenGL结合在一起了。一个正确编写的Cg应用程序可以编写一次,然后工作在OpenGL或Direct3D上了。


Shader概述
常用的Shader性能
在Unity中不同的shader着色器会对系统负担产生不一样的负担。以下Unity自带shader的复杂度会按照排列顺序依次增加。
Unlit. 不发光。只是一个纹理,不被任何光照影响。
VertexLit. 顶点光照。
Diffuse. 漫反射。
Normal mapped.法线贴图,比漫反射更昂贵:增加了一个或更多纹理
(法线贴图)和几个着色器结构。
Specular. 高光。这增加了特殊的高光计算。
Normal Mapped Specular. 光法线贴图。这比高光更昂贵一点。
Parallax Normal mapped. 视差法线贴图。这增加了视差法线贴图计算。
Parallax Normal Mapped Specular. 视差高光法线贴图。这增加了视差法线贴图和镜面高光计算。


unity内置Shader
内建的Shader根据应用对象可以分为如下几大类:
普通(Normal Shader Family):用于不透明的对象。
透明(Transparent Shader Family):用于透明的对象。
透明镂空效果(Transparent Cutout Shader Family):用于包含完全透明部分的半透明对象。
自发光(Self-Illuminated Shader Family):用于有发光效果的对象。
反射(Reflective Shader Family):用于能反射环境立方体贴图的不透明对象。


Shader三种基本形态
在Unity中,Shader便可以分成如下三种基本类型:
1. 固定功能着色器(FixedFunction Shader)
2. 表面着色器(SurfaceShader)
3. 顶点着色器&片段着色器(Vertex Shader & Fragment Shader)


Shader的创建以及框架
在Unity中,开始编写Shader之前,需要在项目工程中创建一个Shader文件。
在Project视图中找到Shader文件,可以为Shader文件重新命名,双击文件,默认会在MonoDevelop中打开它,然后就可以编写Shader了。


ShaderLab语法
着色器(Shader)是着色器文件的根命令。每个文件必须定义一个(且只有一个)Shader。因为Shader说明了如何渲染其材质使用此着色器


的物体。
语法:
 Shader“name”{[Properties] SubShader[Fallback]}
定义一个着色器。


Properties属性
着色器可以有一系列属性。着色器中定义的任何属性都显示在Unity内的材质检视器中。典型属性有物体颜色和纹理,或者只是着色器使用的


任意值。


Fallback
回退(Fallback)可定义在所有子着色器(Subshader)之后。大致来说就是“如果所有子着色器都无法在该硬件上运行,请尝试使用另一个


着色器的子着色器”。
语法
Fallback”name”
回退到有给定名称的着色器。
回退关闭(Fallback Off)
明确表示即使没有子着色器可以在该硬件上运行,也不会有回退以及应要打印的警告。


表面着色器(Surface Shader)
表面着色器(Surface Shader)通常情况下用户都会使用这种Shader,它可以与灯光、阴影、投影器进行交互。表面着色器的抽象层次比较


高,它可以容易地以简洁方式实现复杂的着色器。表面着色器可同时正常工作在前向渲染及延迟渲染模式下。表面着色器以Cg/HLSL语言进行


编写。


顶点、片段着色器
顶点、片段着色器如果需要一些表面着色器无法处理的酷炫效果,或者编写的Shader不需要与灯光进行交互,或是想要的只是全屏图像效果


,那么可以使用顶点和片段着色器。这种Shader可以非常灵活地实现需要的效果,但是需要编写更多的代码,并且很难与Unity的渲染管线完


美集成。顶点和片段着色器同样是用Cg/HLSL语言来编写。


固定功能管线着色器
如果游戏要运行在不支持可编程管线的老旧硬件上,那么需要编写这种Shader了。固定功能管线着色器可以作为片段或者表面着色器的备用


选择,这在当硬件无法运行那些酷炫Shader的时候,还可以通过固定功能管线着色器来绘制出一些基本的内容。固定功能管线着色器完全以


ShaderLab语言编写,类似于微软的Effects或是Nvidia的CgFX。

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
代码在文件 Properties { _Color ("Main Color", Color) = (1,1,1,1) _MainTex ("Diffuse (RGB) Alpha (A)", 2D) = "white" {} _SpecularTex ("Specular (R) Gloss (G) Anisotropic Mask (B)", 2D) = "gray" {} _BumpMap ("Normal (Normal)", 2D) = "bump" {} _AnisoTex ("Anisotropic Direction (RGB)", 2D) = "bump" {} _AnisoOffset ("Anisotropic Highlight Offset", Range(-1,1)) = -0.2 _Cutoff ("Alpha Cut-Off Threshold", Range(0,1)) = 0.5 } SubShader{ Tags { "RenderType" = "Opaque" } CGPROGRAM struct SurfaceOutputAniso { fixed3 Albedo; fixed3 Normal; fixed4 AnisoDir; fixed3 Emission; half Specular; fixed Gloss; fixed Alpha; }; float _AnisoOffset, _Cutoff; inline fixed4 LightingAniso (SurfaceOutputAniso s, fixed3 lightDir, fixed3 viewDir, fixed atten) { fixed3 h = normalize(normalize(lightDir) + normalize(viewDir)); float NdotL = saturate(dot(s.Normal, lightDir)); fixed HdotA = dot(normalize(s.Normal + s.AnisoDir.rgb), h); float aniso = max(0, sin(radians((HdotA + _AnisoOffset) * 180))); float spec = saturate(dot(s.Normal, h)); spec = saturate(pow(lerp(spec, aniso, s.AnisoDir.a), s.Gloss * 128) * s.Specular); fixed4 c; c.rgb = ((s.Albedo * _LightColor0.rgb * NdotL) + (_LightColor0.rgb * spec)) * (atten * 2); c.a = 1; clip(s.Alpha - _Cutoff); return c; } #pragma surface surf Aniso #pragma target 3.0 struct Input { float2 uv_MainTex; float2 uv_AnisoTex; }; sampler2D _MainTex, _SpecularTex, _BumpMap, _AnisoTex; void surf (Input IN, inout SurfaceOutputAniso o) { fixed4 albedo = tex2D(_MainTex, IN.uv_MainTex); o.Albedo = albedo.rgb; o.Alpha = albedo.a; o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_MainTex)); fixed3 spec = tex2D(_SpecularTex, IN.uv_MainTex).rgb; o.Specular = spec.r; o.Gloss = spec.g; o.AnisoDir = fixed4(tex2D(_AnisoTex, IN.uv_AnisoTex).rgb, spec.b); } ENDCG } FallBack "Transparent/Cutout/VertexLit" }[/code]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值