读一读

struct a2v{
    float4 vertex:POSITION;//模型空间的顶点坐标
    float3 normal:NORMAL;//模型空间的法线
    float4 texcoord:TEXCOORD0;//第一套纹理坐标
};

struct v2f{
    float4 position:SV_POSITION;//剪裁空间坐标
    float3 temp:COLOR0;
    .../其他要传递给frag的,要有语义
};

v2f vert(a2v v){
    v2f f;
    f.position = mul(UNITY_MATRIX_MVP,v.vertex);
    f.temp = v.normal;
    return f;
}

fixed4 frag(v2f f):SV_Target{
   return fixed4(f.temp,1);
}

通过语义:后面的,来说明这个参数是什么,或者说这个返回值是什么

float4 vert(float4 v:POSITION):SV_POSITION{
  return mul(UNITY_MATRIX_MVP,v);//矩阵变换
}

fixed4 frag():SV_Target{
    return fixed4(r,g,b,a);//针对每个像素
}

POSITION说明这个参数传入的就是顶点值

SV_POSITION说明返回的是剪裁空间的坐标

SV_Target说明这个返回值为像素颜色


顶点函数,说白了就是处理顶点的,一般的作用就是将顶点从模型空间转换到剪裁空间。

片元函数,说白了就是赋予顶点(其实是像素)颜色的

需要在CG(或其他语言)块中声明处理函数

Pass{
    CGPRAGRAM
    
    #pragma vertex vert(顶点函数名)
    #pragma fragment frag(片元函数名)
    
    xxx vert(xx){}
    xxx frag(xx){} 
    
    ENDCG
}



在Properties定义的属性并不能直接用到Pass通道的着色器代码中,需要再声明一次,在声明的使用什么语言编写块里。语言块里面注意语句要加;了。

Pass{
    CGPROGRAM
    
    float4 _Color;//Color
    float4 _Vector;//Vector
    float _Int;//Int
    float _Float;//Float
    float _Range;//Range
    sampler2D _2D;//2D
    samplerCube _Cube;//Cube
    sampler3D _3D;//3D
    
    ENDCG
}

float4表示4个float,同理的有float3,float2等

还有half(存储大小是float的一半),还有fixed(12位定点数,最小)


555.png


属性块下面就是子Shader了,硬件会在子着色器中从上到下选择一个可以运行的子着色器。

SubShader{
    Pass{
        //声明使用的语言cg hlsl?
        CGPROGRAM
        //渲染代码
        ENDCG
    }
}

SubShader{
    .....
}

Fallback "最后的选择,Unity存在的Shader"

属性放在Properties块里面

Properties{
    //名字("显示的名字",类型)=默认值
    _Color("Color",Color) = (r,g,b,a)
    _Vector("Vector",Vector) = (1,2,3,4)
    _Int("Int",Int) = 100
    _Float("Float",Float) = 3.6
    _Range("Range",Range(1,10)) = 6
    _2D("Texture",2D) = "white"{}
    _Cube("Cube",Cube) = "white"{}
    _3D("Texture3",3D) = "white"{}
}


纹理2、3D的默认值"white"{}指的是不指定图片时,默认整个纹理为白色


Shader "[路径/../]名字"{

}

在Unity中就可以在Material的Shader通过路径来找到这个名字,指定用这个Shader来渲染。(名字可以和文件名不一样)


使用的是ShaderLab编写的Unity中的Shader

  1. 表面着色器 Surface Shader

  2. 顶点/片元着色器 Vertex/fragment Shader

  3. 固定函数着色器 Fixed Function Shader

可以认为表面着色器是顶点(片元)着色器的封装,固定函数着色器是以前老硬件不支持才使用的,一般不用理。