一、Unity3D 初识Shader (一)
Unity3D 初识Shader (一)
我们都知道在unity中,Shader是担当着一个重要的角色,整个引擎的渲染是需要依靠Shader,今天小编就和大家一起来学习一下这个神奇的Shader吧!
1.首先从意义上认识Shader:
Shader(着色器)是一段能够针对3D对象进行操作,并被GPU所执行的程序;例如在一个3D场景中,一般会有多个的Shader,这些Shader中有的负责对3D对象进行表面的处理,有的负责对3D对象的纹理进行处理。
2.在Unity中 Shader一般有三种类型:
2.0 基本定义:
2.0.0 Fixed Function Shader:(固定渲染管线着色器)基于用于高级Shader 在老显卡死无法显示的Fallback,可以使用ShaderLab语言;(固定渲染管线:就是功能固定的管线,比如物体表面光的折射,反射的算法是无法修改的,我们只能对这些功能进行配置,比如开启或关闭反射效果、雾化效果,然而这种管线功能固定,无法在程序上对物体细节的表现给予更多自由的控制)
2.0.1 Vertex and Fragment Shader:最强大的Shader类型,属于可编程渲染管线,使用CG/HLSL语法;(可编程渲染管线:可以根据特定的需求实现更多自己想要的特效)
2.0.2 Surface Shader:是现在unity中最常用的Shader类型,使用中预制的光照模型来进行光照运算,使用CG/HLSL语法;
2.1 三种Shader类型的共同点:
2.1.0 只有唯一一个根Shader 开始;
2.1.1 Properties 参数部分、作用及语法是完全相同的;
2.1.2 具体功能都在SubShader子着色器里面,并且Shader 会自上而下运行第一个硬件能支持的子着色器,主要是为了对不同硬件的适配;
2.1.3 都可以打标签,例如 Tags{"RenderType"="Opaque"} LOD 300
2.1.4 都可以使用Fallback
2.1.5 都可以处理基本功能,例如光照慢反射、镜面反射,当然Vertex and Fragment Shader 和Surface Shader都能实现Fixed Function Shader实现不了的高级功能,例如基于UV的计算效果;
2.2 三种Shader类型的不同点:
2.2.0 Fixed Function Shader 和 Vertex and Fragment Sahder 在SubShader 下面还有pass{},但是Surface Shader 由于具体内容已经打包在光照模型,不能加pass{},否则会报错的;
2.2.1 Fixed Function Shader 每句代码之后没有分号";",但是Vertex and Fragment Sahder和 Surface Shader 每句代码后必须要加";";
2.2.2 代码结构不同
Fixed Function Shader 中SubShader结构:
Material{}
......
SetTexture[_MainTex]{......}
Vertex and Fragment Shader结构:
CGPROGRAM
#pragma vertex vert
#pragram fragment frag
......
#include "UnityCG.cginc"
ENDCG
Surface Shader 的结构:
CGPROGRAM
#pragma surface surf Lambert
......
ENDCG
3.认识Shader 开发的语言
CG(Nvida 公司开发的c for graphics 计算机图形C语言超集):CG 程序可以根据运行时的需要或者事先编译成GPU汇编代码;
HLSL(基于DirectX的High Level Shading Language):只能供微软Direct3D 以及XNA使用,移植性差;
GLSL(基于OpenGL的OpenGL Shading Language):只能OpenGL使用,具有良好跨平台和移植性;
ShaderLab(UnityShader):unity3d 上自带的一套Shader语言,核心顶点和片段程序是由CG/HLSL语言编写,可以对外提供一系列属性的输入接口(在UnityEditor材质Inspector 面板中用图形化方式设置属性和选择资源),输入的参数最终还是由CG/HLSL 程序来处理。
4.谈谈Shader和Material 之间的关系
我们都知道在unity中Shader和Material两者是紧密联系的,Shader 包含定义属性和资源使用种类的代码,Material 是调整属性和分配资源;
再简单来说:Shader(着色器)是代码,可以定义输入的属性和资源;而材质需要关联一个着色器,并且通过材质Inspector面板,可以图形化的选择资源(如纹理)或者调整属性;
Shader常用属性:
2D: _MainTex("Base(RGB)",2D)=" White"{} //定义2D纹理(2次方)属性,资源可以在材质里面选择,{}表示选择纹理属性
Color:_Color("Main Color",Color)={1,1,1,1} //定义颜色属性,RGB+Alpha
Range:_RangeValue("RangeValue",Range(0,1))=0.5 //定义一个浮点数属性
Rect:_RectMap("Rect Map",Rect)=""{} //定义长方形(非2次方)纹理属性
Cube:_CubeMap("Cube Map",Cube)=""{} //定义立方体贴图纹理属性
Float:_FloatValue("FloatValue",float)=100 //定义一个浮点数属性
Vector:_VectorValue("VectorValue",vector)=(1,1,1,1) //定义一个四元素的容器属性
教程名称:Unity3D 初识Shader (一) | 语 言:中文 | 页数/时长: 4页 |
软件版本: unity | 上传时间:2018/02/27 | 价格:¥0 |
文件格式: docx | 文件大小:15kb |
您还未登录
全部评论: 0条