简单的Untiy Shader模板脚本(ShaderLab)

Shader "Unlit/defaultShader"
{
    
    
    // 属性数据列表
    Properties
    {
    
    
        // 变量名字("显示名字", 变量类型) = 默认值
        // 这个变量在所有着色器里都能访问
        _MainTex ("Texture", 2D) = "white" {
    
    }
    }
    SubShader
    {
    
    
        Tags {
    
     "RenderType"="Opaque" }
        // 绘制远近的物体,细节展示
        LOD 100

        // 渲染管线,每有一个Pass就会完整的绘制一次
        Pass
        {
    
    
            CGPROGRAM // CG代码的开始
            // 预编译:# (告诉编辑器:顶点Shader(#pragma vertex vert)、片元着色Shader(#pragma fragment frag)、几何Shader(#pragma geometry geome)等)
            #pragma vertex vert
            #pragma fragment frag
            
            // 接口导入,Unity 封装的ShaderAPI(在引擎安装文件,Editor/Data/CGIncludes)
            #include "UnityCG.cginc"

            // Unity 定义了一些语义描述,来描述数据的标准
            // POSITION: 存放模型坐标
            // TEXCOORD0: 存放纹理坐标
            // NORMAL: 存放法线坐标
            struct appdata
            {
    
    
                float4 vertex : POSITION; // (顶点Shader开始的时候)模型顶点坐标
                float2 uv : TEXCOORD0; // (顶点Shader开始的时候)纹理坐标
            };

            struct v2f
            {
    
    
                float2 uv : TEXCOORD0; // 由编程者自己定义
                float4 vertex : SV_POSITION; // 由编程者自己定义
            };

            sampler2D _MainTex; // 2D纹理的第一种类型,变量名Properties定义的相同
            float4 _MainTex_ST; // 2D纹理的第二种类型(Tiling(,), offset(,)), _MainTex_ST变量名是引擎写死的

            // 顶点Shader
            // 1、改变模型坐标 --> 改变形状
            // 2、坐标变化 --> 观察者的角度来绘制物体
               // 模型坐标 * 世界变化矩阵 * 摄像机变换矩阵 * 投影变换矩阵 --> 投影到一个平面的坐标
            // appdata: Shader需要使用的来自渲染管线的数据
            v2f vert (appdata v)
            {
    
    
                v2f o;
                // 坐标空间的转换
                o.vertex = UnityObjectToClipPos(v.vertex);

                // 纹理坐标变换
                //(tex.xy * name##_ST.xy + name##_ST.zw) => (v.uv.xy * _MainTex_ST.xy + _MainTex.zw)
                o.uv = TRANSFORM_TEX(v.uv, _MainTex);

                // 返回数据给渲染管线,同时将顶点数据插值后给片元
                return o;
            }

            // 着色的调用次数,通常情况下大于顶点调用次数
            // 着色好后将颜色放到SV_Target
            fixed4 frag (v2f i) : SV_Target
            {
    
    
                // sample the texture
                // 纹理采样
                fixed4 col = tex2D(_MainTex, i.uv);
                return col;
            }
            ENDCG // CG代码的结束
        }
    }
}

猜你喜欢

转载自blog.csdn.net/ABCGods/article/details/128797275