标签:eset shader and appdata gre equal 计算 htm 效果
Vertex and FragmentShader:最强大的Shader类型,也是本系列的重点,下文中简称V&FShader,属于可编程渲染管线.使用的是CG/HLSL语法。分为2个部分vertex顶点部分和Fragment像素部分。下面依然通过写几个简单的Shader来学习。
1、appdata_base: 包含顶点位置,法线和一个纹理坐标。
2、appdata_tan:包含顶点位置,切线,法线和一个纹理坐标。
3、appdata_full:包含位置、法线、切线、顶点色和两个纹理坐标。
4、appdata_img:包含位置和一个纹理坐标。
1、float4 vertex:顶点位置
2、float3 normal:顶点法线
3、float4 texcoord:第一UV坐标
4、float4 texcoord1:第二UV坐标
5、float4 tangent:切线向量(用在法线贴图中)
6、float4 color:每个顶点(per-vertex)颜色
1、UNITY_MATRIX_MVP:当前模型视投影矩阵。(注:模型矩阵为 本地->世界)
2、UNITY_MATRIX_MV:当前模型视图矩阵
3、UNITY_MATRIX_V:当前视图矩阵
4、UNITY_MATRIX_P:当前投影矩阵
5、UNITY_MATRIX_VP:当前视图投影矩阵
6、UNITY_MATRIX_T_MV:转置模型视图矩阵
7、UNITY_MATRIX_IT_MV:逆转置模型视矩阵
8、UNITY_MATRIX_TEXTURE0 to UNITY_MATRIX_TEXTURE3:纹理变换矩阵
1、UNITY_LIGHTMODEL_AMBIENT:当前环境色
这是GPU对游戏物体进行渲染时的流程,解释一下为:
1、Transform:要渲染的物体在空间中的位置变换,从局部坐标-世界坐标-观察坐标系-视口坐标系
2、TexGen:表示纹理坐标生成,当需要对游戏对象进行贴图时,需要确定贴图部分的纹理位置
3、Lighting:表示光照处理
4、Vertex Shader:表示顶点着色,主要是处理图形中的所有顶点位置
5、Culling:表示剔除,将游戏物体的部分不渲染
6、Depth Test:表示深度测试,判断游戏对象之间的深度和遮挡
7、Texturing:表示纹理处理,贴图
8、Fog:表示雾效果,雾参数
9、Fragment Shader:表示片段着色,对游戏对象的颜色进行处理
10、Alpha Test:表示透明测试
11、Blending:表示混合
Shader "name" { [Properties] Subshaders [Fallback] } 定义了一个着色器。着色器拥有一个 Properties 的列表。着色器包含一个子着色器的列表(SubShaders)。并且至少包含一个(SubShader)。当加载一个着色器时,Unity 将遍历这个列表,获取第一个能被用户机器支持的着色器。如果没有子着色器被支持,Unity 将尝试使用降级 Shader(Fallback )。
1、name ("display name", Range (min, max)) = number:定义浮点数范围属性。
2、name ("display name", Color) = (number,number,number,number):定义颜色属性。
3、name ("display name", 2D) = "name" { options }:定义2D纹理属性。
4、name ("display name", Rect) = "name" { options }:定义长方形(非2次方)纹理属性。
5、name ("display name", Cube) = "name" { options }:定义立方贴图纹理属性。
6、name ("display name", Float) = number:定义浮点数属性。
7、name ("display name", Vector) = (number,number,number,number):定义一个四元素的容器(Vector4)属性。
1、Material { Material Block }:定义一个使用顶点光照管线的材质。
2、Lighting On | Off:开启或关闭顶点光照。
3、Cull Back | Front | Off: 设置多边形剔除模式。
4、ZTest (Less | Greater | LEqual | GEqual | Equal | NotEqual | Always):设置深度测试模式。
5、ZWrite On | Off:设置深度写模式。
6、Fog { Fog Block }:设置雾参数。
7、AlphaTest (Less | Greater | LEqual | GEqual | Equal | NotEqual | Always) CutoffValue:开启 alpha 测试。
8、Blend SourceBlendMode DestBlendMode:设置 alpha 混合模式。
9、Color Color value:设置当顶点光照关闭时所使用的颜色。
10、ColorMask RGB | A | 0 | any combination of R, G, B, A:设置颜色写遮罩。设置为0将关闭所有颜色通道的渲染。
11、Offset OffsetFactor , OffsetUnits:设置深度偏移。
12、SeparateSpecular On | Off:开启或关闭顶点光照相关的平行高光颜色.
13、ColorMaterial AmbientAndDiffuse | Emission:当计算顶点光照时使用每顶点颜色。
1、SetTexture texture property { [Combine options] }:纹理设置 配置了 固定函数多纹理管线,当自定义fragment shaders 被使用时,将忽略这个设置。
2、Per-pixel Lighting:每像素光照。每像素光照管线通过多次通道渲染对象来完成。Unity渲染对象一次来获取阴影色和任何顶点光照。然后再在额外的并行通道中渲染出每像素光照的效果。
3、Per-vertex Lighting:每顶点光照。每顶点光照是标准的Direct3D/OpenGL光照模式,通过计算每个顶点的光照来完成。Lighting on命令开启光照。光照被材质块,颜色材质和平行高光命令所影响。
1、UsePass:包含来自其他着色器的通道。
2、GrabPass:捕获屏幕到一个纹理,通常使用在靠后的通道中。
1、Color Color:设定对象的纯色。颜色即可以是括号中的四值(RGBA),也可以是被方框包围的颜色属性名。
2、Material { Material Block }:材质块被用于定义对象的材质属性。
3、Lighting On | Off:定义材质块中的设定是否有效,你必须使用 Lighting On 命令开启光照,而颜色则通过 Color 命令直接给出。
4、SeparateSpecular On | Off:这个命令会添加高光光照到着色器通道的末尾,因此贴图对高光没有影响。只在光照开启时有效。
5、ColorMaterial AmbientAndDiffuse | Emission:使用每顶点的颜色替代材质中的颜色集。AmbientAndDiffuse 替代材质的阴影光和漫反射值;Emission 替代材质中的光发射值。
1、Diffuse Color:漫反射颜色构成。这是对象的基本颜色。
2、Ambient Color:环境色颜色构成.这是当对象被RenderSettings. 中设定的环境色所照射时对象所表现的颜色。
3、Specular Color:对象反射高光的颜色。
4、Shininess Number:加亮时的光泽度,在0和1之间。0的时候你会发现更大的高亮也看起来像漫反射光照,1的时候你会获得一个细微的亮斑。
5、Emission Color:自发光颜色,当不被任何光照所照到时,对象的颜色。
6、最终的计算效果是:Ambient RenderSettings ambient setting + (Light Color Diffuse + Light Color * Specular) + Emission。
1、Cull Back(不绘制背离观察者的几何体面)| Front(不绘制面向观察者的几何体面,用于由内自外的旋转对象) | Off(显示所有面,用于特殊效果):控制几何体的那一面会被剔除(不绘制)
2、ZWrite On | Off:控制是否将来之对象的像素写入深度缓冲(默认开启),如果你正绘制纯色物体,将此项打开。如果你正绘制半透明效果,关闭深度缓冲。
3、ZTest Less | Greater | LEqual | GEqual | Equal | NotEqual | Always:深度测试如何执行。缺省是LEqual (绘制和存在的对象一致或是在其中的对象;隐藏他们背后的对象)
4、Offset Factor , Units:允许你定义用两个参数深度偏移。因子和单位。Factor 缩放Z的最大斜率,几何体的X和Y也一样,units缩放可计算的深度缓冲值。这允许你迫使一个几何体绘制在另一个的上层,尽管他们实际上是在同一个位置。例如偏移0,-1使得靠近摄像机的几何体忽略几何体的斜率,而偏移-1,-1则会几何体在一个几乎擦过的角度被观察使看起来更近些。
1、combine src1 src2:将源1和源2的元素相乘。结果会比单独输出任何一个都要暗。
2、combine src1 + src2:将将源1和源2的元素相加。结果会比单独输出任何一个都要亮。
3、combine src1 - src2:源1减去源2。
4、combine src1 +- src2:先相加,然后减去0.5(添加了一个符号)。
5、combine src1 lerp (src2) src3:使用源2的透明度通道值在源3和源1中进行差值,注意差值是反向的:当透明度值是1是使用源1,透明度为0时使用源3。
6、combine src1 src2 + src3:源1和源2的透明度相乘,然后加上源3。
7、combine src1 src2 +- src3:源1和源2的透明度相乘,然后和源3做符号加。8、combine src1 src2 - src3:源1和源2的透明度相乘,然后和源3相减。所有源属性都可以是 Previous(上一次 SetTexture 的结果)、Constant(被 ConstantColor 定义的颜色)、 Primary(来自光照计算的颜色或是当它绑定时的顶点颜色)、Texture(在 SetTexture 中被定义的纹理的颜色)其中的一个。
1、ConstantColor color:定义在combine命令中能被使用的不变颜色。
1、matrix [MatrixPropertyName]:使用给定矩阵变换纹理坐标。
1、Mode Off | Global | Linear | Exp | Exp2:定义雾模式。缺省是全局的,依据雾在渲染设定中是否打开确定可从无变化到平方值。
2、Color ColorValue:设定雾的颜色。
3、Density FloatValue:以指数的方式 设定雾的密度。
4、Range FloatValue , FloatValue:为 linear 的雾设定远近距离。
1、AlphaTest Off:渲染所有像素(缺省)。
2、AlphaTest Greater(大于)| GEqual(大于等于)| Less(小于)| LEqual(小于等于)| Equal(等于)| NotEqual(不等于)| Always(渲染所有像素)| Never(不渲染任何像素) AlphaValue(一个范围在0到1之间的浮点值。也可以是一个指向浮点属性或是范围属性的索引,在后一种情况下需要使用标准的方括号写法标注索引名字,如([变量名])):设定透明度测试只渲染在某一确定范围内的透明度值的像素。
1、Blend Off:关闭混合。
2、Blend SrcFactor DstFactor: 配置并启动混合。产生的颜色被乘以 SrcFactor,已存在于屏幕的颜色乘以 DstFactor,并且两者将被叠加在一起。
3、Blend SrcFactor DstFactor, SrcFactorA DstFactorA:同上,但是使用不同的要素来混合 alpha 通道。4、BlendOp Min | Max | Sub | RevSub:不是添加混合颜色在一起,而是对它们做不同的操作。
1、One:值为1,使用此设置来让源(Source)或是目标颜色(Destination)完全的通过。
2、Zero:值为0,使用此设置来删除源(Source)或目标值(Destination)。
3、SrcColor:此阶段的值是乘以源颜色(Source)的值。
4、SrcAlpha:此阶段的值是乘以源(Source)alpha 的值。
5、DstColor:此阶段的值是乘以帧缓冲区源颜色(Source)的值。
6、DstAlpha:此阶段的值是乘以帧缓冲区源(Source)alpha 的值。
7、OneMinusSrcColor:此阶段的值是乘以(1 - 源颜色(Source))。
8、OneMinusSrcAlpha:此阶段的值是乘以(1 - 源(Source)alpha)。
9、OneMinusDstColor:此阶段的值是乘以(1 - 目标颜色(Destination))。
10、OneMinusDstAlpha:此阶段的值是乘以(1 - 目标(Destination)alpha)。
1、Always:总是渲染。没有光照应用。
2、ForwardBase:用于正向渲染,环境主要方向灯和定点光/SH 等的应用。
3、ForwardAdd:用于正向渲染,附加的像素光被应用,每个光照一个 pass。
4、PrepassBase:用于延迟光照,渲染法线/镜面指数。
5、PrepassFinal:用于延迟光照,通过结合纹理,光照和自发光渲染最终颜色。
6、Vertex:用于顶点光照渲染,当物体没有光照映射时,所有顶点光照被应用。
7、VertexLMRGBM:用于顶点光照渲染,当物体有光照映射的时候使用顶点光照渲染。在平台上光照映射是 RGBM 编码。
8、VertexLM:用于顶点光照渲染,当物体有光照映射的时候使用顶点光照渲染。在平台上光照映射是double-LDR 编码(移动平台,及老式台式CPU)。
9、ShadowCaster:将物体当做阴影产生者来渲染。
10、ShadowCollector:为了正向渲染对象的路径,将对象的阴影收集到屏幕空间缓冲区中。
1、Vertex: vertex position 顶点:顶点的位置。
2、Normal: vertex normal 法线:顶点的法线。
3、Tangent: vertex tangent 切线:顶点的切线。
4、Texcoord: primary UV coordinate 主要的UV坐标。
5、Texcoord1: secondary UV coordinate 次要的UV坐标。
6、Color: per-vertex color 颜色:每个顶点颜色。
1、Vertex: vertex position 顶点:顶点的位置。
2、Normal: vertex normal 法线:顶点的法线。
3、Tangent: vertex tangent 切线:顶点的切线。
4、Texcoord0, Texcoord1, ...: texture coordinates for corresponding texture stage 各个纹理处理阶段的纹理坐标。
5、Texcoord: texture coordinates for all texture stages 所有纹理处理阶段的纹理坐标。
6、Color: vertex color 颜色:顶点颜色。
使用unity,Asset>右键创建一个shader>创建一个Material>将shader添加到Material上>在Heriarchy中创建一个Quad>将Material添加到Quad上>打开创建的Shader
1 //Shader的名字和储存的位置 2 Shader "Custom/VertexFragmentBase1" { 3 //子着色器 4 SubShader 5 { 6 //子着色器的Tags值,渲染方式为Opaque,可以渲染大部分不透明的游戏对象 7 Tags{"RenderType"="Opaque"} 8 //LOD通道 9 LOD 200 10 //渲染通道 11 Pass 12 { 13 //cg语言开始标识 14 CGPROGRAM 15 //可以理解为引用定义一个vertex的方法,方法名vert(顶点着色方法) 16 #pragma vertex vert 17 //片段着色方法 18 #pragma fragment frag 19 //应用UnityCG库中的cginc,包含大多可以用的结构体 20 #include "UnityCG.cginc" 21 //自定义一个储存顶点位置的结构体v2f 22 struct v2f 23 { 24 //定义一个float4的顶点位置变量 25 float4 pos:POSITION; 26 }; 27 //自定义一个储存颜色的结构体v2c 28 struct v2c 29 { 30 //定义一个fixed4的颜色变量 31 fixed4 col:Color; 32 }; 33 //vert方法,将顶点的空间坐标转换为屏幕坐标,appdata_base是UnityCG.cginc中的一个结构体,储存了位置、法线和纹理 34 v2f vert(appdata_base v) 35 { 36 v2f o; 37 //将顶点的本地坐标转换为世界坐标(屏幕坐标) 38 o.pos=mul(UNITY_MATRIX_MVP,v.vertex); 39 return o; 40 } 41 //片段方法,给游戏对象的所有顶点着色 42 v2c frag() 43 { 44 v2c c; 45 //着色 46 c.col=fixed4(0,1,1,0); 47 return c; 48 } 49 //cg语言结束标识 50 ENDCG 51 } 52 53 } 54 }
效果如图:
使用unity,Asset>右键创建一个shader>创建一个Material>将shader添加到Material上>在Heriarchy中创建一个Quad>将Material添加到Quad上>打开创建的Shader
效果如图:
实现的秘密是将颜色的rgb值由常量改为随程序运行时间变化的变量,实现的代码如下(将frag方法改写):
1 //片段方法,给游戏对象的所有顶点着色 2 v2c frag(v2f IN) 3 { 4 v2c c; 5 fixed r=abs(sin(_Time*10)); 6 fixed g=abs(cos(_Time*10)); 7 fixed b=abs(tan(_Time*10)); 8 c.col=fixed4(r,g,b,1); 9 return c; 10 }
使用unity,Asset>右键创建一个shader>创建一个Material>将shader添加到Material上>在Heriarchy中创建一个Quad>将Material添加到Quad上>打开创建的Shader
效果如图:
实现的秘密是将颜色的rgb值由常量改为随游戏对象在屏幕上位移变化的变量,实现的代码如下(将frag方法改写):
1 //片段方法,给游戏对象的所有顶点着色 2 v2c frag(v2f IN) 3 { 4 v2c c; 5 //用顶点的xy除以屏幕参数的xy 6 c.col=fixed4(IN.pos.xy/_ScreenParams.xy,0,1); 7 return c; 8 }
有了颜色之后,我们如何添加一张纹理贴图呢?还是相同的逻辑,先定义一张纹理贴图,然后获得纹理贴图的顶点坐标和片段颜色,进行赋值处理即可,具体看下面代码:
1 Shader "Custom/VertexFragmentBase2" { 2 Properties { 3 //定义一个纹理贴图 4 _MainTex ("MainTex", 2D) = "white" {} 5 } 6 SubShader { 7 Tags { "RenderType"="Opaque" } 8 LOD 200 9 Pass 10 { 11 CGPROGRAM 12 //声明 13 #pragma vertex vert 14 #pragma fragment frag 15 #include "UnityCG.cginc" 16 17 //使用sampler2D来储存贴图 18 sampler2D _MainTex; 19 //_MainTex_ST的ST是SamplerTexture的意思 ,就是声明_MainTex是一张采样图,也就是会进行UV运算 20 float4 _MainTex_ST; 21 22 struct v2f 23 { 24 float4 pos:POSITION; 25 fixed2 uv:TEXCOORD; 26 }; 27 28 struct v2c 29 { 30 fixed4 col:Color; 31 }; 32 33 v2f vert(appdata_base v) 34 { 35 v2f o; 36 //将游戏对象的顶点坐标转换为世界坐标 37 o.pos=mul(UNITY_MATRIX_MVP,v.vertex); 38 //TRANSFORM_TEX主要作用是拿顶点的uv去和材质球的tiling和offset作运算, 确保材质球里的缩放和偏移设置是正确的 39 //v.texcoord就是顶点的uv 40 o.uv =TRANSFORM_TEX(v.texcoord,_MainTex); 41 return o; 42 } 43 44 v2c frag(v2f o) 45 { 46 v2c c ; 47 c.col = tex2D(_MainTex,o.uv); 48 return c ; 49 } 50 ENDCG 51 52 } 53 54 } 55 FallBack "Diffuse" 56 }
贴出效果图:
1 Shader "Custom/EarthShader" { 2 Properties 3 { 4 //主贴图(地球) 5 _MainTex("MainTex",2D)=""{} 6 //云贴图(云) 7 _CloudTex("CloudTex",2D)=""{} 8 } 9 10 SubShader 11 { 12 Tags{"RenderType" = "Transparent" "Queue" = "Transparent "} 13 LOD 200 14 //混合 15 /* 16 Alpha Blending,中文译作Alpha混合 17 Blending就是控制透明的。处于光栅化的最后阶段。 18 这里例如我们给一个模型贴一个材质,那么在某个点计算出来颜色值称为源,而该点之前累积的颜色值,叫目标。 19 20 语法 21 Blend Off 不混合 22 Blend SrcFactor DstFactor SrcFactor是源系数,DstFactor是目标系数 23 最终颜色 = (Shader计算出的点颜色值 * 源系数)+(点累积颜色 * 目标系数) 24 25 属性(往SrcFactor,DstFactor 上填的值) 26 one 1 27 zero 0 28 SrcColor 源的RGB值,例如(0.5,0.4,1) 29 SrcAlpha 源的A值, 例如0.6 30 DstColor 混合目标的RGB值例如(0.5,0.4,1) 31 DstAlpha 混合目标的A值例如0.6 32 OneMinusSrcColor (1,1,1) - SrcColor 33 OneMinusSrcAlpha 1- SrcAlpha 34 OneMinusDstColor (1,1,1) - DstColor 35 OneMinusDstAlpha 1- DstAlpha 36 37 运算法则示例: 38 (注:r,g,b,a,x,y,z取值范围为[0,1]) 39 (r,g,b) * a = (r*a , g*a , b*a) 40 (r,g,b) * (x,y,z) = (r*x , g*y , b*z) 41 (r,g,b) + (x,y,z) = (r+x , g+y , b+z) 42 (r,g,b) - (x,y,z) = (r-x , g-y , b-z) 43 */ 44 45 Blend SrcAlpha OneMinusSrcAlpha 46 Pass 47 { 48 CGPROGRAM 49 //声明 50 #pragma vertex vert 51 #pragma fragment frag 52 #include "UnityCG.cginc" 53 54 //储存贴图 55 sampler2D _MainTex; 56 sampler2D _CloudTex; 57 //声明 58 float4 _MainTex_ST; 59 60 struct v2f 61 { 62 float4 pos:POSITION; 63 fixed2 uv:TEXCOORD; 64 }; 65 66 v2f vert(appdata_base v ) 67 { 68 v2f o; 69 o.pos = mul(UNITY_MATRIX_MVP,v.vertex); 70 o.uv = TRANSFORM_TEX(v.texcoord,_MainTex); 71 return o; 72 } 73 74 fixed4 frag(v2f o):Color 75 { 76 //地球自转 77 fixed x = o.uv.x-_Time; 78 fixed2 uv = fixed2(x,o.uv.y); 79 fixed4 col=tex2D(_MainTex,uv); 80 //云的旋转速度比地球快 81 x = o.uv.x -_Time*1.8; 82 fixed2 uv2=fixed2(x,o.uv.y); 83 fixed4 cloud =tex2D(_CloudTex,uv2); 84 //将CloudTex贴图上转变成红色通道(即将红色转变为白色) 85 cloud =fixed4(1,1,1,0)*cloud.r; 86 return lerp(col,col + cloud,0.5f); 87 } 88 ENDCG 89 90 } 91 92 93 } 94 }
原文地址:http://www.jianshu.com/p/cc8cbe36ef06
Vertex and FragmentShader顶点与片段着色器
标签:eset shader and appdata gre equal 计算 htm 效果
原文地址:http://www.cnblogs.com/AaronBlogs/p/6964538.html