Shaderlab Notizen 13 单色透明Shader

2016-10-22  本文已影响0人  CarlDonitz

一、单色透明Shader
源码如下:

//透明单色Shader  

Shader "Shader/SimpleAlphaShader"   
{  
    //------------------------------------【唯一的子着色器】------------------------------------  
    SubShader  
    {     
        //设置Queue为透明,在所有非透明几何体绘制之后再进行绘制  
        Tags{ "Queue" = "Transparent" }  

        Pass  
        {  
            //不写入深度缓冲,为了不遮挡住其他物体  
            ZWrite Off  

            //选取Alpha混合方式  
            Blend  SrcAlpha SrcAlpha  
            //Blend SrcAlpha OneMinusSrcAlpha  

            //===========开启CG着色器语言编写模块============  
            CGPROGRAM  

            //编译指令:告知编译器顶点和片段着色函数的名称  
            #pragma vertex vert   
            #pragma fragment frag  

            //--------------------------------【顶点着色函数】-----------------------------  
            // 输入:POSITION语义(坐标位置)  
            // 输出:SV_POSITION语义(像素位置)  
            //---------------------------------------------------------------------------------  
            float4 vert(float4 vertexPos : POSITION) : SV_POSITION  
            {  
                //坐标系变换  
                //输出的顶点位置(像素位置)为模型视图投影矩阵乘以顶点位置,也就是将三维空间中的坐标投影到了二维窗口  
                return mul(UNITY_MATRIX_MVP, vertexPos);  
            }  

            //--------------------------------【片段着色函数】-----------------------------  
            // 输入:无  
            // 输出:COLOR语义(颜色值)  
            //---------------------------------------------------------------------------------  
            float4 frag(void) : COLOR  
            {  
                //返回单色  
                return float4(0.3, 1.0, 0.1, 0.6);  
            }  

            //===========结束CG着色器语言编写模块===========  
            ENDCG  
        }  
    }  
}

二、颜色可调版单色透明Shader
让颜色可调,来一个Properties属性块,替换掉Hard encoding硬编码的颜色
源码如下:

//颜色可以调版单色透明Shader  

Shader "Shader/ColorChangeAlpha"  
{  
    //------------------------------------【属性值】------------------------------------  
    Properties  
    {  
        //颜色值  
        _ColorWithAlpha("ColorWithAlpha", Color) = (0.9, 0.1, 0.1, 0.5)  
    }  

    //------------------------------------【唯一的子着色器】------------------------------------  
    SubShader  
    {  
        //设置Queue为透明,在所有非透明几何体绘制之后再进行绘制  
        Tags{ "Queue" = "Transparent" }  

        //--------------------------------唯一的通道-------------------------------  
        Pass  
        {  
            //不写入深度缓冲,为了不遮挡住其他物体  
            ZWrite Off  

            //选取Alpha混合方式  
            Blend  SrcAlpha SrcAlpha  
            //Blend SrcAlpha OneMinusSrcAlpha  

            //===========开启CG着色器语言编写模块============  
            CGPROGRAM  

            //编译指令:告知编译器顶点和片段着色函数的名称  
            #pragma vertex vert  
            #pragma fragment frag  

            //变量声明  
            uniform float4 _ColorWithAlpha;  

            //--------------------------------【顶点着色函数】-----------------------------  
            // 输入:POSITION语义(坐标位置)  
            // 输出:SV_POSITION语义(像素位置)  
            //---------------------------------------------------------------------------------  
            float4 vert(float4 vertexPos : POSITION) : SV_POSITION  
            {  
                //坐标系变换  
                //输出的顶点位置(像素位置)为模型视图投影矩阵乘以顶点位置,也就是将三维空间中的坐标投影到了二维窗口  
                return mul(UNITY_MATRIX_MVP, vertexPos);  
            }  

            //--------------------------------【片段着色函数】-----------------------------  
            // 输入:无  
            // 输出:COLOR语义(颜色值)  
            //---------------------------------------------------------------------------------  
            float4 frag(void) : COLOR  
            {  
                //返回自定义的RGBA颜色  
                return _ColorWithAlpha;  
            }  

            //===========结束CG着色器语言编写模块===========  
            ENDCG  
        }  
    }  
}  

三、双面双色颜色可调版透明Shader

利用Cull语句,分别在两个Pass中Cull Front和Cull Back,以让材质的正面和反面显示出不同的颜色
源码如下:

//双面双色颜色可以调版透明Shader  

Shader "Shader/TwoSideColorChangeAlpha"  
{  
    //------------------------------------【属性值】------------------------------------  
    Properties  
    {  
        //正面颜色值  
        _ColorWithAlpha_Front("ColorWithAlpha_Front", Color) = (0.9, 0.1, 0.1, 0.5)  
        //背面颜色值  
        _ColorWithAlpha_Back("ColorWithAlpha_Back", Color) = (0.1, 0.3, 0.9, 0.5)  
    }  

    //------------------------------------【唯一的子着色器】------------------------------------  
    SubShader  
    {  
        //设置Queue为透明,在所有非透明几何体绘制之后再进行绘制  
        Tags{ "Queue" = "Transparent" }  

        //------------------------【通道1:渲染正面】-------------------------  
        Pass  
        {  
            //剔除背面,渲染正面  
            Cull Back  
            //不写入深度缓冲,为了不遮挡住其他物体  
            ZWrite Off  

            //选取Alpha混合方式  
            Blend SrcAlpha OneMinusSrcAlpha  
            //Blend  SrcAlpha SrcAlpha  

            //===========开启CG着色器语言编写模块============  
            CGPROGRAM  

            //编译指令:告知编译器顶点和片段着色函数的名称  
            #pragma vertex vert  
            #pragma fragment frag  

            //变量声明  
            uniform float4 _ColorWithAlpha_Front;  

            //--------------------------------【顶点着色函数】-----------------------------  
            // 输入:POSITION语义(坐标位置)  
            // 输出:SV_POSITION语义(像素位置)  
            //---------------------------------------------------------------------------------  
            float4 vert(float4 vertexPos : POSITION) : SV_POSITION  
            {  
                //坐标系变换  
                //输出的顶点位置(像素位置)为模型视图投影矩阵乘以顶点位置,也就是将三维空间中的坐标投影到了二维窗口  
                return mul(UNITY_MATRIX_MVP, vertexPos);  
            }  

            //--------------------------------【片段着色函数】-----------------------------  
            // 输入:无  
            // 输出:COLOR语义(颜色值)  
            //---------------------------------------------------------------------------------  
            float4 frag(void) : COLOR  
            {  
                //返回自定义的RGBA颜色  
                return _ColorWithAlpha_Front;  
            }  

            //===========结束CG着色器语言编写模块===========  
            ENDCG  
        }  

        //------------------------【通道2:渲染背面】-------------------------  
        Pass  
        {  
            //剔除正面,渲染背面  
            Cull Front  

            //不写入深度缓冲,为了不遮挡住其他物体  
            ZWrite Off  

            //选取Alpha混合方式  
            Blend SrcAlpha OneMinusSrcAlpha  
            //Blend  SrcAlpha SrcAlpha  

            //===========开启CG着色器语言编写模块============  
            CGPROGRAM  

            //编译指令:告知编译器顶点和片段着色函数的名称  
            #pragma vertex vert  
            #pragma fragment frag  

            //变量声明  
            uniform float4 _ColorWithAlpha_Back;  

            //--------------------------------【顶点着色函数】-----------------------------  
            // 输入:POSITION语义(坐标位置)  
            // 输出:SV_POSITION语义(像素位置)  
            //---------------------------------------------------------------------------------  
            float4 vert(float4 vertexPos : POSITION) : SV_POSITION  
            {  
                //坐标系变换  
                //输出的顶点位置(像素位置)为模型视图投影矩阵乘以顶点位置,也就是将三维空间中的坐标投影到了二维窗口  
                return mul(UNITY_MATRIX_MVP, vertexPos);  
            }  

            //--------------------------------【片段着色函数】-----------------------------  
            // 输入:无  
            // 输出:COLOR语义(颜色值)  
            //---------------------------------------------------------------------------------  
            float4 frag(void) : COLOR  
            {  
                //返回自定义的RGBA颜色  
                return _ColorWithAlpha_Back;  
            }  

            //===========结束CG着色器语言编写模块===========  
            ENDCG  
        }  
    }  
}  

材质最终表现出来的透明颜色,是这两种颜色的混合。
在实景表现中,从物体外部和内部,可以看到其显示出了不同的颜色。

上一篇下一篇

猜你喜欢

热点阅读