我爱萨其马虞co 发表于 2021-3-6 07:31

Unity Shader(一): 入门概念和代码

写在前面

首先感谢大佬的分享,膝盖先行奉上:
因为好久已经没有回归Unity的怀抱了(真香!!!吹爆!!!
决定打算从头开始复盘各个功能。
本文是对自己学习大佬分享的1-5章进行总结,详细内容看大佬的文章就可以。
渲染管线

当然首先要学习渲染管线,不然对Shader每个阶段做了什么就会容易产生混淆:
其中VS和PS是可编程的阶段,UnityShader的原理也是对VS传入的数据在PS中进行修改。
Untiy创建Shader种类

Standard Surface Shader
标准表面着色器,是一种基于物理的着色系统(使用了Physically Based Rendering(简称PBR)技术,即基于物理的渲染技术),以模拟现实真实的方式来模拟材质与灯光之间的关系,可以很轻易的表现出各种金属反光效果,同时此种Shader的书写逻辑也更符合人类的思维模式。
Unlit Shader
Vertex/Fragment Shader,也就是最基本的顶点片断着色器,不受光照影响的Shader,多用于特效、UI上的效果制作。
Image Effect Shader
也是顶点片断着色器,只不过是针对后处理而定制的模版。
Compute Shader
Compute Shader是运行在图形显卡上的一段程序,独立于常规渲染管线之外的,它可以直接将GPU作为并行处理器加以利用,从而使GPU不仅具有3D渲染能力,还具有其他的运算能力。
Shader Variant Collection
Shader变体收集器,是对Shader变体进行打包用的容器。
Unity的Shader结构

代码--阶段性自我小测交作业结果

针对
交作业,有题目怎么能没有答案抄(笑~
Shader "Unlit/Unit"{
    Properties{
      _MainTex("Main Texture", 2D) = "white"{}
                _DisplacementTex("Displacement Texture", 2D) = "white"{}
               
                _Magnitude("Magnitude", Range(0, 1)) = 0
                _Tween("Tween", Range(0, 1)) = 0
                _Color("Color", Color) = (1,1,1,1)
                //Properties
                // {
                //         _Color("我是Color", Color) = (1,1,1,1)
                // }
                // 变量名:_Color
                // 显示名称:我是Color
                // 类型:Color
                // 默认值:(1,1,1,1)
        }

    SubShader
        {
                // Transparent 表示是透明通道
                Tags
                {
                        "Queue" = "Transparent"
                }
                Pass
                {
                        Blend SrcAlpha OneMinusSrcAlpha
                        CGPROGRAM
                        #pragma vertex vert
                        #pragma fragment frag
                        // 对上面声明的值进行定义
            sampler2D _MainTex;
            sampler2D _DisplacementTex;
            float _Magnitude;
                        float4 _Color;
                        float _Tween;

                        #include "UnityCG.cginc"
                        // 获取模型数据
                        struct appdata
                        {
                                float4 vertex : POSITION;
                                float2 uv: TEXCOORD0;
                        };
                        // 存放计算结果
                        struct v2f
                        {
                                float4 vertex : SV_POSITION;
                                float2 uv: TEXCOORD1;
                        };
                        // 拿取模型数据计算后传给fragment shader
                        v2f vert(appdata v)
                        {
                                v2f o;
                                o.vertex = UnityObjectToClipPos(v.vertex);
                                o.uv = v.uv;
                                return o;
                        }
                        // 拿取计算结果作用于目标
                        float4 frag(v2f i) : SV_Target
                        {
                                float2 disuv = float2( i.uv.x + _Time.x*2 , i.uv.y + _Time.x*2 );
                float2 dis = tex2D(_DisplacementTex,disuv).xy;
                dis = ((dis*2)-1)*_Magnitude;
                                //lerp
                float4 tex_color = lerp(tex2(_MainTex, i.uv), tex2D(_DisplacementTex, i.uv),_Tween);
                                // distortion
                                float4 tex_color1 = tex2D(_MainTex, i.uv + dis)*_Color;
                                // multi UV
                                float4 tex = tex2D(_MainTex, i.uv);
                float luminance = 0.2125 * tex.rgb.r + 0.07154 * tex.rgb.g + 0.0721 * tex.rgb.b;
                                // luminance
                                loat4 tex1 = float4(luminance,luminance,luminance, tex.rgba.a);
                                return tex_color1;
                        }
                        ENDCG
                }
        }
}

       


图 1 新增一个_Color属性,并将其与主纹理的颜色相乘
图 2用uv值计算颜色值的方法,将其结果与主纹理的颜色相乘
图 3两张纹理,以及第五章讲到的拖动条,当移动滑杆时在两张纹理中进行插值
图 4对纹理采样时,将uv乘2
图 5明亮度(luminance)公式来算出一个明亮度值,然后将红绿蓝通道都设置为明亮度值,透明度通道则用对图片采样获得的透明度
图 6 返回颜色与自定义的颜色属性相乘
用心的完成了作业,有空再补充写点什么吧。
页: [1]
查看完整版本: Unity Shader(一): 入门概念和代码