美文网首页
Shaderlab Notizen 13 单色透明Shader

Shaderlab Notizen 13 单色透明Shader

作者: CarlDonitz | 来源:发表于2016-10-22 14:40 被阅读0次

    一、单色透明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  
            }  
        }  
    }  
    

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

    相关文章

      网友评论

          本文标题:Shaderlab Notizen 13 单色透明Shader

          本文链接:https://www.haomeiwen.com/subject/ltkhuttx.html