shader入门精要(笔记2)

 //Shader 文件在选择面板以树状结构组织的
    Shader "Hidden/NewImageEffectShader"
    {
        //这个申明程序中所需要的变量信息
        Properties在这里插入代码片
        {
            //_MainTex 变量名 ; “Texture” 在Inspector面板上显示的名称 ; 2D 指变量类型 
            // "white" 变量默认值     
            _MainTex ("Texture", 2D) = "white" {}
        }
        // Shader 语法块,一个Shader程序至少有一个SubShader,系统在渲染时会依次调用,
        // 直到找到匹配的SubShader,否则使用最后默认指定的Shader
        SubShader//`在这里插入代码片`
        {
            // Cull Off:关闭剔除、  ZWrite : 要将像素的深度写入深度缓存中   
            // Test Always:将当前深度值与缓冲区颜色值的深度对比 
            Cull Off ZWrite Off ZTest Always
            //渲染通道,固定写法
            Pass
            {
                //Shader 代码段开始
                CGPROGRAM
                //顶点着色器函数编译指令
                #pragma vertex vert
                //片元着色器函数编译指令
                #pragma fragment frag 
                //引用Unity内置的一些定义,头文件包含
                #include "UnityCG.cginc"
                //自定义结构体,作为顶点着色器函数的输入参数
                struct appdata
                {    
                    //float4 4维向量、POSITION 语义,相当于告诉渲染引擎,这个变量是代表什么含义,一般是读取
                    //模型,材质传过来的顶点数据,在每一帧调用DrawCall的时候,模型的组件Mesh Render组件会把
                    //他负责的模型顶点数据传给shader
                    float4 vertex : POSITION;
                    //TEXCOORD0 纹理语义,初始的纹理坐标,比如模型展的uv
                    float2 uv : TEXCOORD0;
                };
    
                struct v2f//定义结构体v2f,作为顶点着色器输出参数
                {
                    float2 uv : TEXCOORD0;//这个uv是经过计算后的纹理坐标,可能是投射到屏幕上的坐标,也可能是裁剪空间坐标,摄像机空间坐标等等
                    float4 vertex : SV_POSITION;//经过计算后的顶点数据(位置,缩放,偏移等),可能是投射到屏幕空间的数据,也可能是裁剪空间数据
                };
                //Vertex Shader 对应的入口
                v2f vert (appdata v)    //appdata v 作为参数,渲染引擎会把对应语义的信息传递进来,此处会传递顶点的位置信息和纹理信息
                {
                    v2f o;//声明输出结构
                    //传递进来的顶点坐标是模型坐标系中的坐标值,需要经过矩阵转换车成屏幕坐标
                    //新的等价写法:o.vertex=UnityObjectToClipPos(v.vertex);
                    o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
                    o.uv = v.uv;
                    //将计算后的结果输出给渲染引擎,底层会根据具体的语义去做对应的处理
                    return o;
                }
                //在Properties 中定义的变量需要在此申明一下才能在程序中使用
                sampler2D _MainTex;
                    
                //fragment Shader 对应的入口
                fixed4 frag (v2f i) : SV_Target//还有一种写法是:COLOR
                {
                    fixed4 col = tex2D(_MainTex, i.uv);
                    // just invert the colors
                    col = 1 - col;
                    return col;
                }
                ENDCG
            }
        }    
        //当上述的SubShader无法匹配硬件环境时,会调这个指定的默认Shader
        Fallback "Mobile/VertexLit"
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值