美文网首页
Unity_Shader着色器(顶点片段着色器)

Unity_Shader着色器(顶点片段着色器)

作者: Your_w | 来源:发表于2017-03-11 14:08 被阅读0次

    //顶点片段着色器

    //流程:

    //1.首先,vertexprogram收到系统传递给它的数据模型

    //2.然后把这些数据处理成我们后续需要的数据(至少包含顶点的位置信息)进行输出,其他的数据还有

    //纹理的UV坐标,以及其他需要传递给fragment,program的数据

    //3.系统对vertexprogram输出的顶点数据进行插值,并将插值结果传递给fragment,program

    //4.最后,fragment,program根据这些插值结果计算成屏幕上显示的像素颜色

    Shader"CustomLearn/Fourth"{

    Properties{

    _myColor("Color",color) = (1,1,1,1)

    _outLine("OutLine",Range(0,1)) =0.1

    }

    SubShader{

    //渲染不透明物体,渲染类型:非透明物体不受投影的影响

    Tags{"Queue"="Geometry""RendererType"="Qpaque""IgnoreProject"="True"}

    //第一通道

    Pass{

    CGPROGRAM

    //告诉程序定义了一个顶点着色器

    #pragmavertexvert

    //告诉程序定义了一个片段着色器

    #pragmafragmentfrag

    //使用顶点和片段的CG时,需要引入头文件,相当于引入C#的命名空间

    #include"UnityCG.cginc"

    fixed4_myColor;

    //定义vertextofragment结构体

    //v2f表示:顶点程序到片段程序的信息传递,这里传递的是位置和颜色的参数

    //顶点着色器将计算color并输出给片段着色器

    structv2f{

    //还有一些其他成员变量

    //1.float4vertex:POSITION顶点/位置

    //2.float3normal:NORMAL顶点法线

    //3.float4texcoord:TEXCOORD0第一UV坐标

    //4.float4texcoord:TEXCOORD1第二UV坐标

    //5.float4tangent:TANGENT切线向量(一般用在法线贴图中)

    //6.float4color:COLOR每个顶点的颜色

    float4pos:SV_POSITION;

    float3color:COLOR;

    };

    //顶点函数,参数是一个结构体返回值也是一个结构体

    //appdata_full是UnityCG.cginc的结构体类型

    //结构体里面的类型有:

    //appdata_base:包含顶点位置,法线和一个纹理坐标

    //appdata_full:包含顶点位置,切线,法线和两个纹理坐标

    //appdata_tan:包含顶点位置,切线,法线和一个纹理坐标

    //appdata_img:包含位置和一个纹理坐标

    v2f vert(appdata_full v) {

    v2f o;

    //UNITY_MATRIX_MVP:当前模型视图投影矩阵

    //UNITY_MATRIX_MV:当前模型视图矩阵

    //UNITY_MATRIX_V:当前视图矩阵

    //UNITY_MATRIX_P:当前投影矩阵

    //UNITY_MATRIX_VP:当前视图投影矩阵

    //UNITY_MATRIX_T_MV:转置模型+视图模型

    //UNITY_MATRIX_IT_MV:逆转置模型+视图模型

    //mul是矩阵相乘的方法

    o.pos =mul(UNITY_MATRIX_MVP,v.vertex);

    //彩虹色

    o.color= v.vertex*0.8+0.5;

    //纯色

    //o.color=v.normal*0.4+0.5;

    returno;

    }

    //片段函数参数是v2f的结构体,返回值是fixed4类型

    fixed4frag(v2f i):COLOR{

    returnfixed4(i.color* _myColor,1);

    }

    ENDCG

    }

    //第二通道

    Pass{

    Name"Border"

    Tags{"LightModel"="ForwadBase"}

    //前方剔除

    CULLFront

    LightingOn

    CGPROGRAM

    #pragmavertexvert

    #pragmafragmentfrag

    //编译指令:编译正向渲染基础的通道

    //用于正向渲染中,应用环境光照,主方向光照和顶点所需要的变体

    //这些变体用于处理不同的光源模型贴图,主要方向光照的阴影选项的开关与否

    #pragmamulti_compile_fwdbase

    #include"UnityCG.cginc"

    float_outLine;

    structa2v {

    float4vertex:POSITION;

    float3normal:NORMAL;

    };

    structv2f {

    float4pos:POSITION;

    };

    //顶点函数

    v2f vert(a2v v) {

    v2f o;

    float4pos =mul(UNITY_MATRIX_MV,v.vertex);

    float3normal=mul(UNITY_MATRIX_IT_MV,v.normal);

    pos = pos +float4(normalize(normal),0)*_outLine;

    o.pos =mul(UNITY_MATRIX_P,pos);

    returno;

    }

    //片段函数

    fixed4frag(v2f i):COLOR{

    returnfixed4(0,0,0,1);

    }

    ENDCG

    }

    }

    FallBack"Diffuse"

    }

    相关文章

      网友评论

          本文标题:Unity_Shader着色器(顶点片段着色器)

          本文链接:https://www.haomeiwen.com/subject/umwagttx.html