Unity中Sharder的3个类别及区分
- 格式:pdf
- 大小:196.46 KB
- 文档页数:4
原创文章如需转载请注明:转载自风宇冲Unity3D教程学院基础讲:基本知识以下内容不需要入门的时候立刻阅读和理解,建议逐渐深入学习后,不时回来看看即可。
什么是GPU?GPU:Graphic Processing Unit,中文翻译为“图形处理器”。
显卡包括(GPU,显存,显卡BIOS,显卡PCB板)。
什么是Shader?Shader程序:GPU执行的,针对3D对象进行操作的程序。
Shader有哪几种?CG:与DirectX 9.0以上以及OpenGL 完全兼容。
运行时或事先编译成GPU汇编代码。
HLSL: 主要用于Direct3D。
平台:windows。
GLSL: 主要用于OpenGL。
平台:移动平台(iOS,安卓),mac(only use when you target Mac OS X or OpenGL ES 2.0)为什么Shader中选择CG?因为CG/HLSL 比GLSL支持更多的平台。
Unity3d里CG输出什么?windows平台:Direct3D, GPU汇编代码mac:OpenGL GPU汇编代码flash:flash GPU汇编代码ios/android:unity会将CG转换成GLSL代码。
总结:也就是除了移动平台会把CG转换成GLSL代码,其余平台都是转换成汇编代码。
什么是缓冲?一个像素有如下缓冲颜色缓存color buffer/pixel buffer:储存该点即将显示的颜色,RGBA值深度缓存depth buffer/z buffer:储存该点的深度,z模板缓存stencil buffer:通常用作限制渲染区域。
更高级用法需结合深度缓冲,例如某像素的模板缓冲值会随着其是否通过深度缓冲测试而改变。
累积缓存Accumulation Buffer: 与颜色缓冲类似,同样储存一个RGBA值。
累积缓存是为合成多幅图像而设计的,累积缓存提供了一种在保持好的颜色分辨率下实现在场景中“多重曝光(multiple exposures)”的方法。
Unity3D Built-in Shader详解一Unity3D的ShaderUnity里面的Shaders是使用一种叫ShaderLab的语言编写的,它同微软的.FX文件或者NVIDIA的CgFX有些类似。
传统意义上的vertex shader和pixel shader 还是使用标准的Cg/HLSL 编程语言编写的。
(因此Unity文档里面的Shader,都是指用ShaderLab编写的代码)然后我们来看下Unity3D 自带的60多个Shader。
这些Shader被分为五个大类:Normal,Transparent,Transparent Cutout,Self-llluminated,Reflective。
由于数量比较多,将分几个篇幅一一介绍。
(一) Normal Shader Family 这个家族一共9个Shader,都是针对不透明的对象的。
(1) Vertex-Lit:最简单的一种Shader之一,所有照射在该物体上的光在一个Pass里面渲染完,光源只在顶点计算。
所以不会有任何基于像素渲染得效果,比如说:normal mapping,light cookies和shadows.这个shader对模型的剖分(将一个物体从几何描述变为多边形表示的过程)非常敏感,如果你将一个点光源放在很靠近一个立方体的一个顶点那里,并且对立方体使用这个shader,光源只会在角落计算。
基于像素光照的shader对剖分没有要求,在表现圆形高光上效果也很好。
如果上述情况时你想要的效果,你可以考虑使用一个基于像素光照的shader或者增加模型的剖分。
(增加顶点数)总的来说,这个shader的渲染代价比较小。
这个shader包含了2个subshader,分别对应可编成管线和固定管线。
是所有硬件都支持的一个最基本的shader。
如果设备支持可编成管线,那使用可编成管线的subshader,否则使用固定管线的。
(2) Diffuse: Diffuse基于一个简单的光照模型-Lambertian,光照强度随着物体表面和光入射角夹角的减小而减小(即光垂直于表面时强度最大)。
佳诺明德教育Unity3D试题一、什么叫动态合批?跟静态合批有什么区别?答:如果动态物体共用着相同的材质,那么Unity会自动对这些物体进行批处理。
动态批处理操作是自动完成的,并不需要你进行额外的操作。
区别:动态批处理一切都是自动的,不需要做任何操作,而且物体是可以移动的,但是限制很多。
静态批处理:自由度很高,限制很少,缺点可能会占用更多的内存,而且经过静态批处理后的所有物体都不可以再移动了。
参考二、简述StringBuilder和String的区别?答:String是字符串常量。
StringBuffer是字符串变量,线程安全。
StringBuilder是字符串变量,线程不安全。
String类型是个不可变的对象,当每次对String进行改变时都需要生成一个新的String 对象,然后将指针指向一个新的对象,如果在一个循环里面,不断的改变一个对象,就要不断的生成新的对象,所以效率很低,建议在不断更改String对象的地方不要使用String 类型。
StringBuilder对象在做字符串连接操作时是在原来的字符串上进行修改,改善了性能。
这一点我们平时使用中也许都知道,连接操作频繁的时候,使用StringBuilder对象。
三、Unity3D Shader分哪几种,有什么区别?答:表面着色器的抽象层次比较高,它可以轻松地以简洁方式实现复杂着色。
表面着色器可同时在前向渲染及延迟渲染模式下正常工作。
顶点片段着色器可以非常灵活地实现需要的效果,但是需要编写更多的代码,并且很难与Unity的渲染管线完美集成。
固定功能管线着色器可以作为前两种着色器的备用选择,当硬件无法运行那些酷炫Shader 的时,还可以通过固定功能管线着色器来绘制出一些基本的内容。
四、已知strcpy函数的原型是:char * strcpy(char * strDest,const char * strSrc); 1.不调用库函数,实现strcpy函数。
云风的BLOG:Unity3Dassetbundle格式简析asset bundle 分为压缩模式和非压缩模式。
压缩模式仅仅是用开源的lzma 库对整个非压缩包做了一次整体压缩。
压缩数据的头有 13 个字节,前 5 个字节是 lzma 解压缩的 API 需要穿入的 props ,接下来的 4 字节是解压缩后的数据库长度。
最后 4 字节不用理会它。
把压缩数据解开后,就和非压缩模式没有差别,下面只讨论非压缩格式:assert bundle 的文件头是从这样一个数据结构序列化出来的。
struct AssetBundleFileHead {struct LevelInfo {unsigned int PackSize;unsigned int UncompressedSize;};string FileID;unsigned int Version;string MainVersion;string BuildVersion;size_t MinimumStreamedBytes;size_t HeaderSize;size_t NumberOfLevelsToDownloadBeforeStreaming;size_t LevelCount;LevelInfo LevelList[];size_t CompleteFileSize;size_t FileInfoHeaderSize;bool Compressed;};string 是直接以 \0 结尾的字符串,顺序序列化;size_t 是大端的4 字节数字;bool 是单个字节;vector 就是顺着排列的结构。
根据Unity 版本的不同,assert bundle 的格式也不完全相同。
Version 指明了 bundle 的格式版本,从 Unity 3.5 开始到 4.x 版都使用 Version = 3 ,下面只讨论这个版本。
HeaderSize 应该恰好等于以上这个文件头的数据长度。
Shader第三讲:Vertex and Fragment ShaderVertex and Fragment Shader:最强大的Shader类型,也是本系列的重点,下文中简称V&F Shader,属于可编程渲染管线. 使用的是CG/HLSL语法。
分为2个部分vertex顶点部分和Fragment像素部分。
下面依然通过写几个简单的Shader来学习。
例一:显示一张贴图新建Unity工程,新建一个Cube立方体,新建一个名为Exam1的Shader(Project视图->Create->Shader),输入如下代码。
1.Shader"Custom/Exam1"{2.Properties{3._MainTex ("Texture",2D) ="white"{ }4.}5.SubShader6.{7.pass8.{9.CGPROGRAM10.#pragma vertex vert11.#pragma fragment frag12.#include "UnityCG.cginc"13.sampler2D _MainTex;14.float4 _MainTex_ST;15.struct v2f {16. float4 pos : SV_POSITION;17. float2 uv :TEXCOORD0;18.} ;19.v2f vert (appdata_base v)20.{21. v2f o;22.o.pos = mul(UNITY_MATRIX_MVP,v.vertex);23.o.uv =TRANSFORM_TEX(v.texcoord,_MainTex);24. return o;25.}26.float4 frag (v2f i) :COLOR27.{28.float4 texCol = tex2D(_MainTex,i.uv);29. float4 outp = texCol;30. return outp;31.}32.ENDCG33.}34.}35.}详细讲解如下图之后我们把之前创建的立方体的shader设置为Exam1,Inspector里有对应的Texture。
UnityShader曲⾯细分简介⽬录Unity Shader 曲⾯细分简介概念介绍曲⾯细分⼀种对输⼊的图元(三⾓形、四边形、线段)进⾏细化,产⽣出更多的顶点,使其变得更精细的技术。
这⼀功能在渲染管线中完成,通常会由显卡硬件⽀持。
从阶段上讲它位于顶点着⾊器之后,像素着⾊器之前。
它的内部流程分为三部分:可编程的Hull Shader(控制细分参数),不可编程的Generator(细分顶点),可编程的Domain Shader(顶点位置计算)。
因此,它基于顶点着⾊器阶段后的顶点数据,并可以控制⽣成更多的顶点数据交由像素着⾊器使⽤。
作⽤曲⾯细分技术降低了模型精细度要求,在模型制作、存储、加载上都可带来节省。
通过曲⾯细分⽣成更精细的顶点后,可以应⽤“置换贴图”技术来渲染出更加精细、逼真的模型。
置换贴图不同于法线贴图修改顶点的法线⽅向来造成光影错觉,它会真正修改顶点的位置来产⽣凹凸感,因此当视线与⽹格切⾯⽅向接近时法线贴图基本上失效⽽置换贴图仍可产⽣逼真的效果。
例如以下分别是【标准】材质、【未细分仅置换】材质、【固定数⽬细分置换】材质的效果:关于Unity⽀持unity⽂档⾥只提了Built-in Render Pipeline的Surface Shader⽀持曲⾯细分,并且只⽀持三⾓形。
同时它需要Shader Model 4.6target,因此不⽀持更⽼的设备。
官⽅案例在使⽤Surface Shader的前提下使⽤曲⾯细分⾮常简单,以下的每种细分⽅法都提供了内置的函数,直接调⽤就完事。
总的来说是在shader中增加两个函数:tessellate:FunctionNamevertex:FunctionNametessellate声明的函数返回细分控制参数,这是⼀个float4类型,前三个值分别表⽰输⼊三⾓形的三个边被分成⼏段,第四个值是Inside因⼦,算法使⽤,不太清楚。
vertex声明的函数可以拿到细分后的所有顶点,可以在这⾥修改其位置。
Unity3D Built-in Shader,unity3d内置shader详解unity3d内置了很多Shader,文档很详细,自己翻一下.便于加深印象.首先先解释下Unity3D的Shader.Unity里面的Shaders是使用一种叫ShaderLab 的语言编写的,它同微软的.FX文件或者NVIDIA的CgFX有些类似。
传统意义上的vertex shader和pixel shader 还是使用标准的Cg/HLSL 编程语言编写的。
(因此Unity文档里面的Shader,都是指用ShaderLab编写的代码)然后我们来看下Unity3D自带的60多个Shader。
这些Shader被分为五个大类:Normal,Transparent,Transparent Cutout,Self-llluminated,Reflective。
由于数量比较多,将分几个篇幅一一介绍。
(一) Normal Shader Family这个家族一共9个Shader,都是针对不透明的对象的。
(1) Vertex-Lit:最简单的一种Shader之一,所有照射在该物体上的光在一个Pass里面渲染完,光源只在顶点计算。
所以不会有任何基于像素渲染得效果,比如说:normal mapping,light cookies和shadows.这个shader对模型的剖分(将一个物体从几何描述变为多边形表示的过程)非常敏感,如果你将一个点光源放在很靠近一个立方体的一个顶点那里,并且对立方体使用这个shader,光源只会在角落计算。
基于像素光照的shader对剖分没有要求,在表现圆形高光上效果也很好。
如果上述情况时你想要的效果,你可以考虑使用一个基于像素光照的shader或者增加模型的剖分。
(增加顶点数)总的来说,这个shader的渲染代价比较小。
这个shader包含了2个subshader,分别对应可编成管线和固定管线。
是所有硬件都支持的一个最基本的shader。
UnityShader⼊门这篇⽂章是我在学习蛮⽜的⼀套关于Shader教程()后的简单总结,个⼈感觉这套教程并不是以⾼级Shader编程为⽬的的,更像是授⼈以渔的宗旨。
下⾯我会分为三个部分:Shader简述、图形学基础,Cg简介为⼤家介绍Shader的相关内容,也算是做⼀个总结。
⼀:Shader简述a.先说⼀下GPU与CPU的区别,简单说:GPU主要负责跟显⽰相关的数据处理,⽽CPU主要负责操作系统和应⽤程序。
为什么不把显⽰相关的数据直接交给CPU处理呢?下⾯附上解释:b.Shader分类。
Shader中⽂翻译为“着⾊器”,含义是:可编程图形管线。
主要分为:Vertex Shader和fragment Shader,即定点Shader和⽚段Shader。
上⾯有⼀个概念是“图形管线”,简单解释就是:计算机处理图形显⽰的处理流⽔线。
c.Shader 的主流编程语⾔。
主流的Shader编程语⾔主要有HLSL、GLSL、CG。
下⾯简单说⼀下区别:HLSL(High Level Shader Language)是微软基于DX的作品,只能运⾏在Windows平台上。
GLSL(OpenGL Shading Language),OpenGL着⾊语⾔,是⽤来在中着⾊编程的语⾔(OpenGL是个定义了⼀个跨编程语⾔、跨平台的规格的专业的图形),是跨平台的着⾊器语⾔。
到这⾥,我们已经可以发现有⼀个⽐较⿇烦的问题出现了,就是我们底层图形驱动限制了上层的编程语⾔,⼀旦想要改动图形驱动库,那就不得不重写整个Shader Files,此时CG就应运⽽⽣了,CG在HLSL和GLSL上做了进⼀步封装,屏蔽了上层的着⾊器语⾔对底层图形库的依赖。
d.Unity Shader。
ShaderLab其实是Unity对Shader语法结构的⼀种包装,其中⽀持三种Shader:surface Shader、Vertex and Fragment Shader 和 Fixed function shader 。
Unity3D Built-in Shader,unity3d内置shader详解1Unity3D内置了很多Shader,文档很详细,自己翻一下.便于加深印象.首先先解释下Unity3D的Shader.Unity里面的Shaders是使用一种叫ShaderLab的语言编写的,它同微软的.FX文件或者NVIDIA的CgFX有些类似。
传统意义上的vertex shader和pixel shader 还是使用标准的Cg/HLSL 编程语言编写的。
(因此Unity文档里面的Shader,都是指用ShaderLab编写的代码)然后我们来看下Unity3D自带的60多个Shader。
这些Shader被分为五个大类:Norm al,Transparent,Transparent Cutout,Self-lllum inated,Reflective。
由于数量比较多,将分几个篇幅一一介绍。
(一) Norm al Shader Fam ily这个家族一共9个Shader,都是针对不透明的对象的。
(1) Vertex-Lit:最简单的一种Shader之一,所有照射在该物体上的光在一个Pass里面渲染完,光源只在顶点计算。
所以不会有任何基于像素渲染得效果,比如说:norm al mapping,light cookies和shadows.这个shader 对模型的剖分(将一个物体从几何描述变为多边形表示的过程)非常敏感,如果你将一个点光源放在很靠近一个立方体的一个顶点那里,并且对立方体使用这个shader,光源只会在角落计算。
基于像素光照的shader对剖分没有要求,在表现圆形高光上效果也很好。
如果上述情况时你想要的效果,你可以考虑使用一个基于像素光照的shader或者增加模型的剖分。
(增加顶点数)总的来说,这个shader的渲染代价比较小。
这个shader包含了2个subshader,分别对应可编成管线和固定管线。
原创文章如需转载请注明:转载自风宇冲Unity3D教程学院Shader第九讲Render PathRender Path定义Render Path,就是采取的光照流程。
Render Path设置可以在Edit-> Project Settings->Player 里设定,见下图。
也可以直接在摄像机的Inspector面板里设置。
Render Path详细讲解一:Vertex LitVertex Lit即顶点光照,顾名思义,就是所有的光照计算都是在顶点进行的,因此所有的像素运算效果都不支持,如阴影,法线贴图,light cookies等。
一个物体一般只有一个pass。
效果最差,运行最快。
适合老设备或者一般的移动设备。
二:Forward LightingForward Lighting是以shader为基础的。
支持像素光照(包括法线贴图和light cookies)。
支持单方向光的实时阴影。
通常最亮(对环境影响最大)的光在Render Mode项勾选Important,对应Forward,其余的用Not Important,对应Vertex Lit。
细节:(1)最亮的几个光源使用像素计算(2)其次的(最多4个)使用顶点计算。
剩余的使用(3)Spherical Harmonics (SH)计算,它是一种快速的近似算法。
判断顺序1.Render Mode为Not Important的肯定是顶点计算或者SH.2.亮度值最高的方向光肯定是像素计算3.Important的是像素计算。
如果光的数量没有达到Quaility Setting里设置的Pixel Light Count。
则依据亮度值将顶点或者SH转换成像素计算。
Bass Pass: 渲染一个像素计算的方向光。
以及所有顶点计算和SH方向光。
之后每增加一个逐像素计算的光都需要增加一个对应的pass.LightMap在此应用,在此步的方向光可以有阴影。
unityshader常用方法Unity中的Shader编程非常重要,它用于控制游戏中的图形渲染效果。
下面是一些Unity Shader中常用的方法:2. SubShader(子着色器):SubShader是Shader中最重要的部分之一、它是一系列渲染特效和通道的集合,能够在不同的硬件和平台上进行自适应。
3. Pass(通道):Pass是SubShader中的一个阶段,它定义了渲染对象时所进行的着色操作。
通道包含了顶点着色器和片段着色器两个部分。
4.CGPROGRAM(CG编程):CGPROGRAM标记着一个可编程阶段的开始,通常包含顶点着色器和片段着色器的代码。
5. vertex(顶点函数):顶点函数是Shader中的一个函数,用于对顶点进行变换、计算等操作。
顶点函数必须返回修改后的顶点位置。
6. fragment(片段函数):片段函数是Shader中的一个函数,用于对片段进行计算和着色操作。
片段函数会返回一个颜色值,表示该片段的最终颜色。
7. UnityObjectToClipPos(顶点位置转换):这个内置变量用于将顶点位置从对象空间转换为裁剪空间。
它可以在顶点着色器中使用。
8. UnityObjectToWorldNormal(顶点法线变换):这个内置变量用于将顶点法线从对象空间转换为世界空间。
它可以在顶点着色器中使用。
9.UNITY_MATRIX_MVP(变换矩阵):这个内置变量包含了将顶点位置从对象空间转换到裁剪空间所需的变换矩阵。
它可以在顶点着色器中使用。
10. uv(纹理坐标):uv是一个表示纹理坐标的变量,在片段着色器中用于查找纹理并获取对应像素的颜色值。
11. float4(四维向量):float4是一个表示四维向量的数据类型,用于表示顶点位置、颜色、纹理坐标等。
12. tex2D(纹理采样):tex2D函数用于在片段着色器中从纹理中获取对应像素的颜色值。
13. lerp(线性插值):lerp函数用于在两个值之间进行线性插值。
U n i t y3D中的s h a d e r基础知识时间:12-05-25 栏目:Unity3D教程作者:liuxiaoni 评论:461.Unity中配备了强大的阴影和材料的语言工具称为ShaderLab,以程式语言来看,它类似于CgFX 和Direct3D的效果框架语法,它描述了材质所必须要的一切咨询,而不仅仅局限于平面顶点/像素着色。
2.在Unity3D中创建一个Shader:Assets -> Create -> Shader3.创建了Shader就可以应用到各个材质Material中,创建材质:Assets -> Create -> Material。
然后就可以在材质的Inspector面板中,shader下拉框中可以找到新增加的shader4.Rendering Paths是Unity3D中一个重要的概念,中文翻译就是“渲染通道”。
它可以很大程度上影响光线和阴影的渲染效果,但具体要依赖于具体的游戏内容和硬件设备,以及平台。
Unity3D中有三种渲染通道类型,从高到低分别为:Deferred Lighting,Forward Rendering,Vertex Lit。
如果平台或设备显卡不能支持高级别的通道类型,Unity3D会自动选择稍微低一些的类型。
三种类型的细节比较,详情看参考手册。
5.如何设置渲染通道:在Edit -> Project Setting -> Player中Inspector面板下面,三种发布类型里都有一个渲染通道的设置。
另外,每个摄像机的Inspector面板中,也都有一个渲染通道Rendering Path的设置。
6.渲染通道与shader的关系。
Deferred Lighting通道类型不关心有多少个光源会影响它,每个物体一般都会绘制两次;类似地,Vertex Lit只绘制一次。
所以对于这两种类型来说,shader对表现效果的改变大多在于多重纹理方面。
浅谈Unity中的Shader⽬录⼀、Shader基础知识1.1、什么是Shader1.2、OpenGL的渲染流程1.3、shader的种类1.4、shader的开发语⾔⼆、Unity中Shader知识介绍2.1、shader在GPU的渲染流程2.2、Unity中shader的类型三、Surface Shader语法⼀、Shader基础知识1.1、什么是Shader在讲什么是Shader之前我们先看看下⾯两段代码这两段代码实现的功能都是提取 2D 图像上每个像素点的颜⾊值,第⼀段代码是⽤c++写的,在cup上⾯运⾏,它需要循环遍历每个像素点,第⼆段代码是CG代码,在GPU上⾯运⾏,它只需要⼀⾏代码就能实现同样的功能。
GPU是专门⽤来进⾏图形处理的,⽽Shader,就是GPU执⾏的⼀段针对3D对象进⾏操作的程序。
维基百科上对shader的解释是这样Shader(着⾊器)应⽤于计算机图形学领域,指⼀组供计算机图形资源在执⾏渲染任务时使⽤的指令,⽤于计算图像的颜⾊或明暗。
但近来,它也能⽤于处理⼀些特殊效果,或者视频后处理。
通俗地说,着⾊器告诉电脑如何⽤特有的⼀种⽅法去绘制物体。
程序员将着⾊器应⽤于图形处理器(GPU)的可编程流⽔线,来实现三维应⽤程序。
这样的图形处理器有别于传统的固定流⽔线处理器,为GPU编程带来更⾼的灵活性和适应性。
以前固有的流⽔线只能进⾏⼀些⼏何变换和像素灰度计算。
现在可编程流⽔线还能处理所有像素、顶点、纹理的位置、⾊调、饱和度、明度、对⽐度并实时地绘制图像。
着⾊器还能产⽣如模糊、⾼光、有体积光源、失焦、卡通渲染、⾊调分离、畸变、凹凸贴图、边缘检测、运动检测等效果。
1.2、OpenGL的渲染流程知道了什么是shader,我们再来了解⼀下shader的种类,⾸先我先介绍⼀下OpenGL的渲染流程上图便是OpenGL的渲染流程,将这个流程简化之后是这样的顶点变换→图元装配和光栅化→⽚元纹理映射和着⾊→写⼊帧缓存在顶点变换和⽚元着⾊这两步时,我们就可以对其编程,进⾏各种操作,其他的部分我们是没法进⾏编程的。
当然,因为我本身在Shader开发方面也是一个不折不扣的大菜鸟,本文很多内容也只是在自己的理解加上一些可能不太靠谱的求证和总结。
本文中的示例应该会有更好的方式来实现,因此您是高手并且恰巧路过的话,如果有好的方式来实现某些内容,恳请您不吝留下评论,我会对本文进行不断更新和维护。
一些基本概念Shader和Material如果是进行3D游戏开发的话,想必您对着两个词不会陌生。
Shader(着色器)实际上就是一小段程序,它负责将输入的Mesh(网格)以指定的方式和输入的贴图或者颜色等组合作用,然后输出。
绘图单元可以依据这个输出来将图像绘制到屏幕上。
输入的贴图或者颜色等,加上对应的Shader,以及对Shader的特定的参数设置,将这些内容(Shader及输入参数)打包存储在一起,得到的就是一个Material(材质)。
之后,我们便可以将材质赋予合适的renderer(渲染器)来进行渲染(输出)了。
所以说Shader并没有什么特别神奇的,它只是一段规定好输入(颜色,贴图等)和输出(渲染器能够读懂的点和颜色的对应关系)的程序。
而Shader开发者要做的就是根据输入,进行计算变换,产生输出而已。
Shader大体上可以分为两类,简单来说∙表面着色器(Surface Shader)- 为你做了大部分的工作,只需要简单的技巧即可实现很多不错的效果。
类比卡片机,上手以后不太需要很多努力就能拍出不错的效果。
∙片段着色器(Fragment Shader)- 可以做的事情更多,但是也比较难写。
使用片段着色器的主要目的是可以在比较低的层级上进行更复杂(或者针对目标设备更高效)的开发。
因为是入门文章,所以之后的介绍将主要集中在表面着色器上。
Shader程序的基本结构因为着色器代码可以说专用性非常强,因此人为地规定了它的基本结构。
一个普通的着色器的结构应该是这样的:一段Shader程序的结构首先是一些属性定义,用来指定这段代码将有哪些输入。
【UnityShader】---数据类型和关键字⼀、基本数据类型:Cg⽀持7种基本的数据类型1、float,32位浮点数据,⼀个符号位。
浮点数据类型被所有的图形接⼝⽀持;2、half,16位浮点数据;3、int,32位整形数据4,fixed,12位定点数,5、bool,布尔数据,被所有的图形接⼝⽀持;6、sampler*,纹理对象的句柄,分为sampler、sampler1D、sampler2D、sampler3D、samplerCUBE和samplerRECT。
⼆、内置的数据类型基于基础数据类型,如float3,表⽰float类型的三维向量;同理,bool2表⽰布尔类型的⼆维向量。
注:向量最长不能超过四元,如float5 vector;//编译错误向量的赋值: float2 a=float(1.0,1.0); //编译通过float2 a=float(1.0f,1.0f); //编译错误float3 b=float(a,0.0); //编译通过矩阵数据类型: float1X1 m1; //即float m1,⼀维矩阵float3X4 m34 //3*4阶矩阵注:X是字符,不是乘号,最⼤的维数为4*4阶,矩阵的初始化 float 2*2 m22={1.0,2.0,3.0,2.3};float3 x和floatx[3]是不同的,前者为向量是内置的数据类型,⽽数组则是⼀种,不是内置的数据类型。
三、类型转换Cg中的类型转换有强制转换和隐式转换;如果是隐式转换则数据类型从低精度向⾼精度转换。
如:float a=1.0; half b=2.0; loat c=a+b; //等价于float c=a+(float)b;Cg语⾔中可以对常量数据加上类型后缀表⽰该数据类型的数据,如:float a=1.0h; //1.0h为half类型常量数据这样的后缀类型有三种:f:表⽰float;h:表⽰half;x:表⽰fixed;四、Swizzle操作符Cg语⾔中的其他操作符和⾼级CPU语⾔C++类似,包括关系操作符、逻辑操作符和位移操作符以及条件操作符。
Unity3Dshader简介Unity3D shader简介可以肯定的说Unity3D使得很多开发者开发游戏更容易。
毫⽆疑问,shader(着⾊器)编码,仍有很长的路要⾛。
shader是⼀个专门运⾏在GPU的程序,经常被神秘包围,它最终绘制3D模型的三⾓形。
如果你想给游戏⼀个特殊的显⽰,学习如何编写shader是必要的。
Unity3D使⽤shader做后期处理,对2D游戏也是必不可少的。
这个系列的⽂章将逐步介绍shader编程,并⾯向⼏乎没有任何shader知识的开发者。
简介下图⼤致表⽰了在Unity3D渲染流程中发挥作⽤的3个不同实体:3D模型本质上是,被称为顶点的3D坐标集合。
他们连接在⼀起构成⼀些三⾓形。
每个顶点包含⼀些其它的信息,如颜⾊、点指的⽅向(法线)、纹理映射坐标(UV数据)。
没有材质模型是不能被渲染的。
材质包含⼀个shader和其属性值的封装。
因此,不同材质可以共享相同的shader,赋予不同的数据。
shader剖析Unity3D⽀持两种不同的shader:表⾯shader、⽚段和顶点shader。
还有第三种类型:固定管线shader,但是如今已经过时了,将不包含在本系列⽂章。
⽆论你需要的是哪种类型,shader的结构都⼀样:Shader "MyShader"{Properties{// The properties of your shaders// - textures// - colours// - parameters// ...}SubShader{// The code of your shaders// - surface shader// OR// - vertex and fragment shader// OR// - fixed function shader}}可以包含多个SubShader,⼀个接⼀个。
他们包含GPU的实际指令。
Unity3D将找到与你显卡兼容的SubShader,并顺序执⾏他们。
unityshader变种(多重编译multi这篇文章比较全面的介绍了Unity中shader的multi_compile与shader_feature的定义和使用以及限制。
一、定义在unity中我们可以通过使用#pragma multi_compile或#pragma shader_feature指令来为shader创建多个稍微有点区别的shader变体。
这个Shader被称为宏着色器(mega shader)或者超着色器(uber shader)。
实现原理:根据不同的情况,使用不同的预处理器指令,来多次编译Shader代码。
在运行时,Unity从Material宏Material.EnableKeyword和Shader.DisableKeyword或全局着色器宏Shader.EnableKeyword和Shader.DisableKeyword中选择适当的着色器变体。
如果这两个宏都未启用,则Unity使用第一个宏。
二、使用//定义两个TEST_1,TEST_2两个宏#pragma multi_compile TEST_1 TEST_2//在shader中使用#ifdef TEST_1//Todo#endif#ifdef TEST_2//Todo#endif上面这个命令会产生2种着色器变种:TEST_1,TEST_2。
要生成未定义预处理器宏的着色器变体,请添加一个仅为下划线(__)的名称。
这是避免使用两个宏的常用技术,因为对项目中可以使用的宏数量有限制,例如:#pragma multi_compile __ TEST_1在脚本中控制使用://使用TEST_1变种Shader.EnableKeyword ("TEST_1");Shader.DisableKeyword ("TEST_2");三、组合#pragma multi_compile TEST_1 TEST_2#pragma multi_compile TEST_3 TEST_4 TEST_5它产生总共六个着色器变体(TEST_1_TEST_3,TEST_1_TEST_4,TEST_1_TEST_5,TEST_2_TEST_3,TEST_2_TEST_4,TEST_2_TEST_5)。
Unity3D Shader 入门什么是ShaderShader(着色器)是一段能够针对3D对象进行操作、并被GPU所执行的程序。
Shader并不是一个统一的标准,不同的图形接口的Shader并不相同。
OpenGL的着色语言是GLSL, NVidia开发了Cg,而微软的Direct3D使用高级着色器语言(HLSL)。
而Unity的Shader 是将传统的图形接口的Shader(由 Cg / HLSL编写)嵌入到独有的描述性结构中而形成的一种代码生成框架,最终会自动生成各硬件平台自己的Shader,从而实现跨平台。
Unity Shader 其实并不难,初学者往往很迷惑是因为它有太多固定的命令和结构,而这些命令又需要我们对3D渲染有一定的了解才能知道它们是做什么的。
Shader种类OpenGL和Direct3D都提供了三类着色器:?顶点着色器:处理每个顶点,将顶点的空间位置投影在屏幕上,即计算顶点的二维坐标。
同时,它也负责顶点的深度缓冲(Z-Buffer)的计算。
顶点着色器可以掌控顶点的位置、颜色和纹理坐标等属性,但无法生成新的顶点。
顶点着色器的输出传递到流水线的下一步。
如果有之后定义了几何着色器,则几何着色器会处理顶点着色器的输出数据,否则,光栅化器继续流水线任务。
? 像素着色器(Direct3D),常常又称为片断着色器(OpenGL):处理来自光栅化器的数据。
光栅化器已经将多边形填满并通过流水线传送至像素着色器,后者逐像素计算颜色。
像素着色器常用来处理场景光照和与之相关的效果,如凸凹纹理映射和调色。
名称片断着色器似乎更为准确,因为对于着色器的调用和屏幕上像素的显示并非一一对应。
举个例子,对于一个像素,片断着色器可能会被调用若干次来决定它最终的颜色,那些被遮挡的物体也会被计算,直到最后的深度缓冲才将各物体前后排序。
? 几何着色器:可以从多边形网格中增删顶点。
它能够执行对CPU来说过于繁重的生成几何结构和增加模型细节的工作。