unity shader入门(一):基本结构话痨版

unity shader 有三种形式:表面着色器(Surface Shader),顶点/片元着色器(Vertex/Fragment Shader),固定函数着色器(Fixed Function Shader)

表面着色器是unity自创的一种着色器代码类型,在本质上与顶点/片元着色器是一样的,可以理解为表面着色器是对顶点/片元着色器的以更高一级的抽象。

顶点/片元着色器可以使用CG/HLSL语言编写,它比表面着色器更复杂也更灵活。

由于有些老旧设备(如iphone3)不支持可编程管线着色器,就需要用固定函数着色器,这些着色器往往值能实现一些简单效果。在unity5.2中,固定函数着色器在背后会被编译成顶点/片元着色器。

所以以下只介绍顶点着色器

下为一个简单的顶点/片元着色器

Shader "Custom/NewShader" {
//NewShader为这个着色器的名字,Custer为路径 Properties{
      //Properties为属性,下面会给出各种类型的属性
  _Range("Range",Range(0.0,1))=1   _Color("Color Tint",Color)=(1,1,1,1)

      //_Range和_Color为声明的两个属性 } SubShader{
      //一个着色器可以有多个SubShader,渲染时如果显卡不能使用第一个SubShader那么显卡会依次查找下一个SubShader,如果都不能使用,
      //那么会使用FallBack的着色器
      Tags{"RenderType"="Opaque"}
      Cull Off //Tags为一个标签,定义在SubShader下的Tags会对该SubShader下的所有Pass代码块都起作用,
     //也可以在Pass里面为该Pass单独定义Tags,但是不能在Pass下声明SubShader类型的标签。在下面给出SubShader的标签类型

     //Cull Off为一个状态,出现在SubShader下还是Pass下与Tags一样,下面给出常见状态设置 Pass{
          //Pass语块,下面给出Pass语块结构 Tags{"LightMode"="ForwardBase"}                //Pass标签

              //开始CG代码片段 CGPROGRAM               //顶点/片元着色器需要写在CGPROGRAM和ENDCG之间


              //该代码片段的编译指令,这里这两条编译指令告诉Unity 名为vert的函数包含了顶点着色器代码,
              //名为frag的函数包含了片元着色器代码 #pragma vertex vert #pragma fragment frag   
               //CG代码
              
              //为了能够使用Properties中定义的属性这里要做一个匹配 fixed _Range; fixed4 _Color;               
              //顶点着色器,逐顶点执行的
              //就跟一般函数一样有返回值,参数,方法体 float4 vert(float4 v:POSITION):SV_POSITION{               //float4 v:POSITION,还有后边的SV_POSITION 都是CG/HLSL中的语义,告诉系统用户需要输入那些输入值,以及输出的是什么
              //这里POSITION告诉unity把模型的顶点填充到参数v中,SV_POSITION告诉unity输出的是裁剪空间中的顶点坐标,这些语义不可省略
              //语义以后再说吧...
                   
                  //UnityObjectToClipPos(v)意思就是把顶点v从模型空间转换到裁剪空间 return UnityObjectToClipPos(v); }

              //片元着色器 fixed4 frag():SV_Target{
              //SV_Target语义告诉渲染器把用户的输入颜色存储到一个渲染目标中,这里将输出到默认的帧缓存               //没有输入,只是简单的输出了表示颜色的fixed4的变量,(0,0,0)表示黑色,(1,1,1)表示白色 return fixed4(_Color)*_Range; }
              //结束CG代码片段 ENDCG               //其他设置 }
//Pass{}//其他Pass语块 } //SubShader{}//其他显卡的SubShader FallBack "Diffuse"//上面所有SubShader在该显卡上都不能使用时使用这个,这里的写法会向其他物体投射阴影,换成FallBack Off就不能,这里不说明了。。。 }

  Properties语义块支持的属性类型

SubShader的标签类型

SubShader的标签是一个键值对,它的键和值都是字符串类型,用来告诉UNITY的渲染引擎我们希望怎么以及何时渲染这个对象

常见的渲染状态设置

这些指令设置显卡的各种状态,比如是否开启混合/深度测试

Pass语块结构

Pass{

[Name]

[Tags]

[RenderSetup]

//其他代码

}

通过Pass的名称(如 Name "MyPass")可以使用ShaderLab的UsePass命令类直接使用其他unity shader 的Pass提高代码复用

如 UsePass "MyShader/MYPASS",注意,使用UsePass命令是必须使用大写

Pass标签,也是告诉引擎怎么渲染物体的,下为Pass标签类型

渲染状态设置,SubShader中的设置同样适用于Pass

效果图如下

原文地址:https://www.cnblogs.com/lanrenqilanming/p/7700633.html