UnityShader之顶点片段着色器Vertex and Fragment Shader【Shader资料】

  顶点片段着色器

  V&F Shader:英文全称Vertex and Fragment Shader,最强大的Shader类型,也是我们在使用ShaderLab中的重点部分,属于可编程管线,使用的是CG/HLSL语法。分为vertex顶点部分和Fragment像素部分。

  本篇的末尾讲述顶点函数传入的结构体类型的参数appdata_base。

Shader "Custom/Exam1" {
    Properties {
    _MainTex ("Texture", 2D) = "white" { }   //引号里面的"Texture"则是Unity检视面板中对应显示的属性名称
    }
    SubShader
    {
        pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"
            sampler2D _MainTex;
            float4 _MainTex_ST;
            struct v2f {
                float4  pos : SV_POSITION;
                float2  uv : TEXCOORD0;
            } ;
            v2f vert (appdata_base v)
            {
                v2f o;
                o.pos = mul(UNITY_MATRIX_MVP,v.vertex); //MVP矩阵变换,将裁剪空间坐标转换为相对屏幕位置的UV坐标
                o.uv = TRANSFORM_TEX(v.texcoord,_MainTex); //TRANSFORM_TEX的作用是用顶点的UV v.texcoord和材质球的采样图片_MainTex做运算,确保顶点材质球里的缩放和偏移是正确的。
                return o;
            }
            float4 frag (v2f i) : COLOR
            {
                float4 texCol = tex2D(_MainTex,i.uv);
                float4 outp = texCol;
                return outp;
            }
            ENDCG
        }
    }
}

  这里有一张图片,直接山寨过来吧。

  

  顶点片段着色器,用文字描述永远不及一张图解。

 

  顶点函数传入的结构体参数:

  只要引用UnityCg.cginc头文件(目录Unity > Editor > Data > CGIncludes下)就可以使用预先设定好的结构体直接使用,他们分别有appdata_base  appdata_tan和appdata_full:

  如下所示:

  注:顶点坐标和正切线为什么是float4,这有点意思,因为这里它表示是齐次坐标,比如我们这样表示一个float4(x,y,z,w),当w = 1的时候它表示点(x,y,z),当w= 0的时候它表示一个向量(x,y,z)。区别就在这里,当W为1时表示点,当W为0时表示向量。

  texcoord0和texcoord1分别表示两层UV,有时候我们模型上的贴图需要多个图片一起贴在一处,那么贴两层就会有两层UV,至于更多的层数,这里就不讲了,因为更深入的笔者也并不是特别了解,当然学过美术的,对这个应该是非常的了解。

  以下三种类型为Unity内置的顶点Shader传入结构体,如果想自定义也是可以的,但是自定义结构体里面的属性,必须是基于appdata_full的,这样才能识别出来,也就是自定义的结构里的属性必须到appdata_full里的属性里去选。

struct appdata_base {
    float4 vertex : POSITION; //顶点坐标
    float3 normal : NORMAL;//法线
    float4 texcoord : TEXCOORD0;//UV
};
struct appdata_tan {

    float4 vertex : POSITION;
    float4 tangent : TANGENT;
    float3 normal : NORMAL;
    float4 texcoord : TEXCOORD0;
};
struct appdata_full {
    float4 vertex : POSITION;//顶点坐标
    float4 tangent : TANGENT;//正切
    float3 normal : NORMAL;//法线
    float4 texcoord : TEXCOORD0;//第一层UV
    float4 texcoord1 : TEXCOORD1; //第二层UV
    fixed4 color : COLOR; //颜色
};

 

posted @ 2016-10-25 03:24  威少小二orz  阅读(3672)  评论(0编辑  收藏  举报