UNITY3D shader学习心得<三> Vertex and Fragment Shader

来源:互联网 发布:下周重要经济数据 编辑:程序博客网 时间:2024/05/21 07:12

Vertex and Fragment Shader:最强大的Shader类型可编程渲染管线. 使用的是CG/HLSL语法。分为2个部分vertex顶点部分和Fragment像素部分。


Pass

{

   Name "MyPass"              //Pass名称

   Tags {"LightMode"="Always"}     //光照模式

   CGPROGRAM                 //CG程序开始,嵌入CG程序

   #pragma  vertex  vert        //预编译指令 指定顶点函数的名字 必须实现  渲染管线自动调用  vertex要小写

   #pragma  vragment frag        //预编译指令 指定片段函数的名字 必须实现 渲染管线自动调用  vragment要小写

   #pragma  Target 3.0           //shader模式版本3.0   默认是2.0

   #include "UnityCG.cginc"        //包含"UnityCG.cginc"文件 路径在:\Editor\Data\CGIncludes

   sampler2D _MainTex;           //声明贴图 要和根Shader里的Properties的变量名对应。

   float4  _Color;             //声明颜色

   //vertex函数输出结构体,也是fragment函数输入结构体

   struct v2f{

   float4 pos:SV_POSITION;         // :SV_POSITION 指明语义,顶点位置  语义都是大写

   float4 texcoord:TEXCOORD0;       //  纹理坐标

   } ;                      //结构体后面要加 ; 号

   //vertex函数实现 appdate_base是UnityCG.cginc里定义的结构体 

   v2f vert(appdate_base v){

    v2f o;

    o.pos=mul(UNITY_MATRIX_MVP,v.vertex);       //使用HLSL中的mul函数   将顶点位置转化为投影坐标系位置。

    o.texcoord=v.vertex;                  

    return o;

   }

   //fragment函数实现

   half4 frag(v2f i):COLOR{   //指明函数返回的是COLOR,输出颜色

   half4 col= _Color*tex2D(_MainTex,i.texcoord.xy);  //使用tex2D函数 将位置信息和贴图相乘。得到每个点贴图纹理。

   return col;

}    


   ENDCG                   //CG程序结束


}


!!!!!  颜色取值范围是0-1 颜色四个值用XYZW表示 UV是0到1  normal是-1到1 

LightMode 的可选值:

  • Always: 总是渲染。没有光照应用。

  • ForwardBase: 用于正向渲染,环境主要方向灯和定点光/SH 等的应用

  • ForwardAdd用于正向渲染,附加的像素光被应用,每个光照一个pass

  • PrepassBase用于延迟光照,渲染法线/镜面指数。

  • PrepassFinal: 用于延迟光照,通过结合纹理,光照和自发光渲染最终颜色

  • Vertex: 用于顶点光照渲染,当物体没有光照映射时,所有顶点光照被应用

  • VertexLMRGBM: 用于顶点光照渲染,当物体有光照映射的时候使用顶点光照渲染。在平台上光照映射是RGBM 编码

  • VertexLM: 用于顶点光照渲染,当物体有光照映射的时候使用顶点光照渲染。在平台上光照映射是double-LDR 编码(移动平台,及老式台式CPU)
  • ShadowCaster: 将物体当做阴影产生者来渲染

  • ShadowCollector: 为了正向渲染对象的路径,将对象的阴影收集到屏幕空间缓冲区中。


0 0