[Shader] 固定管线2 纹理混合及透明


Shader "Sbin/ff2"
{
    Properties{
        //变量名 在监视面板显示的名字 类型 = 默认值
        _Color("Main Color",Color) = (1,1,1,1)
        _Ambient("环境光",Color) = (0.3,0.3,0.3,0.3)
        _Specular("高光(镜面反射光)",Color)=(1,1,1,1)
        _Shininess("高光强度",Range(0,8)) = 4
        _Emission("自发光",Color)=(1,1,1,1)
        _MainTexture("主纹理",2d)=""
        _SecondTexture("次纹理",2d)=""
    }

    SubShader {
        //必须使用pass编写一个渲染通道
        pass{
            //小括号为固定值 中括号为参数值
            // Color(1,0,0,1)
            // Color[_Color]

            //材质命令块
            Material{
                //下面是属性

                //描述的是材质的漫反射颜色,可以理解为这个物体本身固有的颜色
                DIFFUSE[_Color]
                //设置环境光
                AMBIENT[_Ambient]
                //设置高光
                SPECULAR[_Specular]
                // 浮点值 描述Specular有多强,决定在镜面高光反射过程中被高光反射的部分的区域
                SHININESS[_Shininess]
                //自发光
                emission[_Emission]
            }
            //启用顶点光照 如果不开启光照,物体的颜色不会被反射,这时不论怎么修改颜色都不会变化
            Lighting on
            //独立的高光
            SeparateSpecular on
            
            SetTexture[_MainTexture]
            {   
                // Combine texture
                // Combine 表示合并,texture 表示参数_MainTexture
                // 这里只应用了贴图而没有应用之前的顶点光照,因此会失去光照效果
                
                // Combine texture * primary
                // primary 是fixed function shader的关键词
                // primary 代表前面所有计算了材质和光照以后的颜色
                // 这两个颜色相乘就会得到一个混合的颜色
                // 这里要注意的是 颜色rgba的每一个分量都是一个浮点数,范围是[0,1]
                // 也就是两个浮点数相乘,这时会得到一个更小的浮点数,因此颜色会看起来更深

                Combine texture * primary double
                // double 表示对这个结果乘2,也就是对 texture * primary 乘2 ,也就是提高两倍的亮度

                // Combine texture * primary quad
                // qua 乘4
            }
            // 多个纹理混合
            // SetTexture 只能有一个参数
            SetTexture[_SecondTexture]
            {
                Combine texture * previous double
                // previous 表示在这个SetTexture之前的所有计算过的材质和光照的颜色
                // 按照这个想法,可以继续编写SetTexture,但不是无限写的
                // fixed function shader 是基本对照于显卡硬件的固定渲染部分
                // 显示卡是有一个混合纹理最大上限的,显卡硬件越好能混合的纹理越多
                // 两张纹理混合是现在几乎所有显卡都支持的
            }
        }
    }
}