【Unity-Shader】顶点着色器和片段着色器

一、简介

  1. 着色器只是一种把输入转化为输出的程序。着色器也是一种非常独立的程序,因为它们之间不能相互通信;它们之间唯一的沟通只有通过输入和输出。
  2. 在最简配置下,至少都得有两个着色器:一个叫顶点着色器(vertex shader),它将作用于每个顶点上;另一个叫片段着色器(fragment shader),它将作用于每一个采样点。我们采用4倍抗锯齿,因此每个像素有四个采样点。
  3. 如果我们打算从一个着色器向另一个着色器发送数据,我们必须在发送方着色器中声明一个输出,在接收方着色器中声明一个类似的输入。当类型和名字都一样的时候,OpenGL就会把两个变量链接到一起,它们之间就能发送数据了(这是在链接程序对象时完成的)。

二、代码

Shader "Unlit/NewUnlitShader"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 100

        Pass
        {
            CGPROGRAM//Cg代码段标志, 与END组成一段cg逻辑
            #pragma vertex vert//顶点着色器的函数vert
            #pragma fragment frag//片段着色器的函数frag
            // make fog work
            //https://blog.csdn.net/yinfourever/article/details/103072057
            #pragma multi_compile_fog//多重编译

            #include "UnityCG.cginc"//引用库,unity提供的辅助函数
            //网格数据
            struct appdata
            {
                //网格的顶点数据
                float4 vertex : POSITION;
                //纹理空间中的多维坐标系,值为0-1,用以记录引入纹理的uv坐标
                float2 uv : TEXCOORD0;
            };
            //顶点到片元结构体:用以存储从顶点函数输出和片元函数输入的数据,计算输出的顶点位置, 
            //自动绘制到屏幕上
            //语义上的sv表示系统值(System vaule),SV_POSITION对应的是屏幕上的像素位置
            struct v2f
            {
                float2 uv : TEXCOORD0;
                UNITY_FOG_COORDS(1)
                float4 vertex : SV_POSITION;
            };
            //此处是cg语言使用的变量,必须与声明的属性名字一样,
            sampler2D _MainTex;
            float4 _MainTex_ST;
            //顶点函数
            v2f vert (appdata v)
            {
                v2f o;
                //将网格顶点对象空间转换到屏幕剪裁平面
                o.vertex = UnityObjectToClipPos(v.vertex);
                //取到网格数据上的UV信息,网格平铺成二维与纹理一一对应,赋值给v2f结构体
                o.uv = TRANSFORM_TEX(v.uv, _MainTex);
                //用UnityCG.cginc头文件中内置定义的宏处理雾效,从顶点着色器中输出雾效数据    
                UNITY_TRANSFER_FOG(o,o.vertex);
                return o;
            }
             //--------------------------------【片段着色函数】---------------------------    
            //输入:顶点输出结构体    
            //输出:float4型的像素颜色值    
            //---------------------------------------------------------------------------
            fixed4 frag (v2f i) : SV_Target
            {
                // sample the texture
                //采样主纹理在对应坐标下的颜色值   
                fixed4 col = tex2D(_MainTex, i.uv);
                // apply fog
                //用UnityCG.cginc头文件中内置定义的宏启用雾效   
                UNITY_APPLY_FOG(i.fogCoord, col);
                //返回最终的颜色值   
                return col;
            }
            ENDCG
        }
    }
}

 

上一篇:unity shader实现纹理贴图


下一篇:Interpolation in MATLAB