• Vertex And Fragment Shader(顶点和片段着色器)


    Vertex And Fragment Shader(顶点和片段着色器)

    Shader "Unlit/ Vertex­_And_Fragment_Shader "

    {

                      Properties

             {

                       _MainColor("主颜色", color) = (1, 1, 1, 1)

             }

             SubShader

             {

                       Tags { "RenderType"="Opaque" }

                       LOD 100

                       Pass

                       {

          //固定的一些格式

                                Tags{"LightModel" = "ForwardBase"}             

                                CGPROGRAM

                       //声明为顶点着色器  vertex 关键字  vert是顶点着色器渲染时执行的函数

                                #pragma vertex vert

                       //声明为片段着色器 fragment 为关键字 frag是片段着色器渲染时执行的函数

                                #pragma fragment frag

                                //调用的unity中的指令(标签)

                                #include "UnityCG.cginc"

                                #include "Lighting.cginc"

                       //应用阶段数据  获取应用阶段的数据 模型的顶点颜色 法线 切线之类的数据

                                struct appdata

                                {

                                //float4  变量的属性  vertex是变量名 POSITION是一个语义 作用:把模型空间的顶点位置放入前面的变量中  这个语义可以自动填充

                                         float4 vertex : POSITION;

                                         float3 normal : NORMAL;//获取模型的顶点法线

                                };

                                //V  To F 顶点着色器的数据传递给片段着色器

                                struct v2f

                                {

    //SV_POSITION 也是一个语义  规定变量只能接收投影空间下的顶点位置

                                         float4 vertex : SV_POSITION; 

                                         fixed3 col:Color0;                         //得到颜色传到片段着色器

                                };

                                float4 _MainColor;   //声明主颜色

                                v2f vert (appdata v)

                                {

                                         v2f o;                           //得到v2f数据

                                         o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);    //获得position

                                         //归一化后的光照方向向量 

                                         float3 LiaghtDir = normalize(ObjSpaceLightDir(v.vertex));

                                         //对顶点的法线方向向量和光照方向向量进行点积

                                         float Ndotl =saturate(dot(normalize(v.normal), LiaghtDir));

                                         //环境光、unity自带光线、主颜色叠加

    fixed3 diffus =  Ndotl*_LightColor0.rgb + UNITY_LIGHTMODEL_AMBIENT.rgb+_MainColor.rgb;

                                         o.col = diffus;   //赋值

                                         return o;        

                                }

                                fixed4 frag (v2f i) : SV_Target   //SV_Target  缓冲区 

                                {

                                   return fixed4 (i.col, 1);  //渲染到窗口

                                }

                                ENDCG

                       }

             }

    }

     注:POSITION、SV_POSITION等是Unity为了方便对模型数据的传输,进行了特别的含义规定。语义就是一个赋给Shader输入和输出的字符串,表达了一些参数的含义,也就是让Shader知道从哪里读取数据,并把数据输出到哪里。

    支持个人观看使用,如商用或转载,请告知! -----萧朗(QQ:453929789 Email:xiaolang_xl@sina.com)
  • 相关阅读:
    CentOS 6.5 zabbix 3.0.4 乱码问题
    CentOS-6.5安装zabbix 3.0.4
    NFS工作原理及配置文件详解
    CentOS-6.5-NFS部署
    Swift中简单的单例设计
    UITableViewCell实现3D缩放动画
    Swift
    Swift
    [转]Swift编程风格指南
    pch文件出现no such file or directory错误
  • 原文地址:https://www.cnblogs.com/XiaoLang0/p/9524688.html
Copyright © 2020-2023  润新知