美文网首页
透明效果_双面渲染透明效果04

透明效果_双面渲染透明效果04

作者: Rayson | 来源:发表于2020-06-15 17:03 被阅读0次

Shader代码:
Shader中2个Pass代码一样,一个只渲染背面,一个只渲染正面
Cull Front
Cull Back

Shader "Unity Shaders/Alpha_TestBothSided" {

    Properties {

        _Color ("Color Tint",Color)=(1,1,1,1)
        _MainTex ("Main tex",2D)="white"{}
        _Cutoff ("Alpha Cutoff",Range (0,1))=0.5 //控制 透明度测试时使用的判断条件
        
    }
    SubShader {
        Tags{"Queue"="AlphaTest" "IgonreProjector"="True" "RenderType"="TransparentCutout"}

        Pass {
            Tags {"LightMode"="ForwardBase"}

            Cull Front
            CGPROGRAM

            #pragma vertex vert
            #pragma fragment frag
            #include "Lighting.cginc"

            fixed4 _Color;
            sampler2D _MainTex;
            float4 _MainTex_ST;
            fixed _Cutoff;


            // 应用>>>顶点
            struct a2v{

                float4 vertex : POSITION;
                float3 normal :NORMAL;
                float4 texcoord : TEXCOORD0;
            };

            // 顶点
            struct v2f{

                float4 pos :SV_POSITION;
                float3 worldNormal :TEXCOORD;
                float3 worldPos :TEXCOORD1;
                float2 uv : TEXCOORD2;
            };

            //模型-观察-投影
            v2f vert (a2v v)
            {
                v2f o;
                // 将顶点坐标从模型空间变换到裁剪空间
                // 等价于o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
                o.pos = UnityObjectToClipPos(v.vertex);     

                // 将法线从模型空间变换到时间空间
                // 等价于o.worldNormal = normalize(mul(unity_ObjectToWorld, v.normal));
                o.worldNormal = UnityObjectToWorldNormal(v.normal); 

                // 将顶点坐标从模型空间变换到世界空间
                o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;

                //获取纹理
                //o.uv = v.texcoord * _MainTex_ST.xy + _MainTex_ST.zw;
                o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
                
                return o;
            }


            // 片元
            fixed4 frag( v2f i) : SV_Target {

                
                fixed3 worldNormal = normalize(i.worldNormal);
                 // 获得世界空间下光照方向
                fixed3 worldLightDir = normalize(UnityWorldSpaceLightDir(i.worldPos));

                fixed4 texColor = tex2D(_MainTex, i.uv);

                // 透明度测试
                clip (texColor.a - _Cutoff);

                // 主纹理颜色
                fixed3 albedo = texColor.rgb * _Color.rgb;
                // 环境光
                fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz * albedo;

                 // 计算漫反射
                // 兰伯特公式:Id = Ip * Kd * N * L
                // IP:入射光的光颜色;
                // Kd:漫反射系数 ( 0 ≤ Kd ≤ 1);
                // N:单位法向量,
                // L:单位光向量
                fixed3 diffuse = _LightColor0.rgb * albedo * max(0, dot(worldNormal, worldLightDir));

                
                return fixed4(ambient + diffuse, 1.0);
            }
            ENDCG
        }

          Pass {
            Tags {"LightMode"="ForwardBase"}
            Cull Back
            
            CGPROGRAM
            

            #pragma vertex vert
            #pragma fragment frag
            #include "Lighting.cginc"

            fixed4 _Color;
            sampler2D _MainTex;
            float4 _MainTex_ST;
            fixed _Cutoff;


            // 应用>>>顶点
            struct a2v{

                float4 vertex : POSITION;
                float3 normal :NORMAL;
                float4 texcoord : TEXCOORD0;
            };

            // 顶点
            struct v2f{

                float4 pos :SV_POSITION;
                float3 worldNormal :TEXCOORD;
                float3 worldPos :TEXCOORD1;
                float2 uv : TEXCOORD2;
            };

            //模型-观察-投影
            v2f vert (a2v v)
            {
                v2f o;
                // 将顶点坐标从模型空间变换到裁剪空间
                // 等价于o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
                o.pos = UnityObjectToClipPos(v.vertex);     

                // 将法线从模型空间变换到时间空间
                // 等价于o.worldNormal = normalize(mul(unity_ObjectToWorld, v.normal));
                o.worldNormal = UnityObjectToWorldNormal(v.normal); 

                // 将顶点坐标从模型空间变换到世界空间
                o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;

                //获取纹理
                //o.uv = v.texcoord * _MainTex_ST.xy + _MainTex_ST.zw;
                o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
                
                return o;
            }


            // 片元
            fixed4 frag( v2f i) : SV_Target {

                
                fixed3 worldNormal = normalize(i.worldNormal);
                 // 获得世界空间下光照方向
                fixed3 worldLightDir = normalize(UnityWorldSpaceLightDir(i.worldPos));

                fixed4 texColor = tex2D(_MainTex, i.uv);

                // 透明度测试
                clip (texColor.a - _Cutoff);

                // 主纹理颜色
                fixed3 albedo = texColor.rgb * _Color.rgb;
                // 环境光
                fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz * albedo;

                 // 计算漫反射
                // 兰伯特公式:Id = Ip * Kd * N * L
                // IP:入射光的光颜色;
                // Kd:漫反射系数 ( 0 ≤ Kd ≤ 1);
                // N:单位法向量,
                // L:单位光向量
                fixed3 diffuse = _LightColor0.rgb * albedo * max(0, dot(worldNormal, worldLightDir));

                
                return fixed4(ambient + diffuse, 1.0);
            }
            ENDCG
        }
    }
    FallBack "Transparent/Cutout/VertexLit"
}
效果参考

相关文章

  • 透明效果_双面渲染透明效果04

    Shader代码:Shader中2个Pass代码一样,一个只渲染背面,一个只渲染正面Cull FrontCull ...

  • 【Unity Shader入门精要学习】透明(六)

    双面渲染的透明效果 透明度测试的双面渲染透明效果 因为透明度测试没有关深度写入,所以这个透明物体的像素级别的深度信...

  • Shader笔记-透明效果

    ●透明是游戏中经常使用的一种效果,在实时渲染透明效果,通常会在渲染模型时控制它的透明通道。在unity中实现透明效...

  • 渲染概念透明物体的渲染

    渲染队列:渲染分了好几层,是规划好的,我们这里有一个透明物体,比如UI经常使用透明效果,比如粒子效果,透明物体最重...

  • 透明效果

    透明度测试 不需要关闭深度写入 效果极端(完全透明 / 完全不透明)透明片元只要不满足条件(小于特定阈值),对应的...

  • Ⅲ透明效果

    透明效果 前言 Unity中通常使用两种方法来实现透明 :透明度测试(AlphaTest)和透明度混合(Alpha...

  • 回答网友问题之十七

    网友问:我在PS中制作一个透明的PNG文件,为什么载入C4D中,不能渲染出透明效果? 各种渲染原理,其实,...

  • 关于unity ZWrite ZTest -透明(2)

    上一篇关于不透明物体,这一篇我们来探究半透明物体。 如果要想得到一个正常的渲染效果:先渲染不透明物体,顺序(相对于...

  • react native 导航透明

    导航透明 效果一导航透明,但是导航栏仍然具有返回等功能image.png -效果二导航全透明,并且导航为空 效果一...

  • 修正半透明头发的渲染异常

    修正半透明头发的渲染异常 这两天在整理 小甜甜 的捏脸系统,顺带把前项目 半透明头发渲染异常的bug 修正了,效果...

网友评论

      本文标题:透明效果_双面渲染透明效果04

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