《Unity Shader》8.4 透明度混合

(1)在Unity中新建一个场景。在本书资源中,该场景名为Scene_8_4。在Unity 5.2中,默认情况下场景将包含一个摄像机和一个平行光,并且使用了内置的天空盒子。在Window -> Lighting -> Skybox中去掉场景中的天空盒子。

command+N 创建scene

点击 window-rendering-lighting,点击 environment,点击 skybox material

(2)新建一个材质。在本书资源中,该材质名为AlphaBlendMat。

(3)新建一个Unity Shader。在本书资源中,该Unity Shader名为Chapter8-AlphaBlend。把新的Unity Shader赋给第2步中创建的材质。

(4)在场景中创建一个立方体,并把第2步中的材质赋给该模型。创建一个平面,使得平面位于立方体下面。

(5)保存场景。

打开新建的Chapter8-AlphaBlend,删除所有已有代码,并把8.3节的Chapter8-AlphaTest代码全部粘贴进去,我们只需要在这个基础上进行一些修改即可。

(1)修改Properties语义块:

我们使用一个新的属性_AlphaScale来替代原先的_Cutoff属性。_AlphaScale用于在透明纹理的基础上控制整体的透明度。相应的,我们也需要在Pass中修改和属性对应的变量:

(2)修改SubShader使用的标签:

(3)与透明度测试不同的是,我们还需要在Pass中为透明度混合进行合适的混合状态设置:

如在本节开头所讲的,我们将源颜色(该片元着色器产生的颜色)的混合因子设为SrcAlpha,把目标颜色(已经存在于颜色缓冲中的颜色)的混合因子设为OneMinusSrcAlpha,以得到合适的半透明效果。

(4)修改片元着色器:

(5)最后,修改Unity Shader的Fallback:

java 复制代码
Shader "Custom/Chapter8-AlphaBlend"

{
    Properties {
        _Color  ("Main  Tint",  Color)  =  (1,1,1,1)
        _MainTex  ("Main  Tex",  2D)  =  "white"  {}
        _AlphaScale  ("Alpha  Scale",  Range(0,  1))  =  1 //_AlphaScale用于在透明纹理的基础上控制整体的透明度
    }

    Subshader {
        Tags {
            "Queue"="Transparent" 
            "IgnoreProjector"="True"  //IgnoreProjector设置为True,这意味着这个Shader不会受到投影器(Projectors)的影响。
            "RenderType"="Transparent" //RenderType标签可以让Unity把这个Shader归入到提前定义的组(这里就是TransparentCutout组)中,以指明该Shader是一个使用了透明度测试的Shader
            //通常,使用了透明度测试的Shader都应该在SubShader中设置这三个标签
        }
        Pass {
            Tags  {  "LightMode"="ForwardBase" }
            ZWrite Off
            Blend SrcAlpha OneMinusSrcAlpha
            CGPROGRAM
            #pragma  vertex  vert
            #pragma  fragment  frag
            #include  "Lighting.cginc"
            fixed4  _Color;
            sampler2D  _MainTex;
            float4  _MainTex_ST;
            fixed  _AlphaScale;

            struct  a2v  {
                float4  vertex  :  POSITION;
                float3  normal  :  NORMAL;
                float4  texcoord  :  TEXCOORD0;
            };

            struct  v2f  {
                float4  pos  :  SV_POSITION;
                float3  worldNormal  :  TEXCOORD0;
                float3  worldPos  :  TEXCOORD1;
                float2  uv  :  TEXCOORD2;
            };

            v2f  vert(a2v  v)  {
                v2f  o;
                o.pos  =  UnityObjectToClipPos(v.vertex);
                o.worldNormal  =  UnityObjectToWorldNormal(v.normal);
                o.worldPos  =  mul(unity_ObjectToWorld,  v.vertex).xyz;
                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);

              
                fixed3  albedo  =  texColor.rgb  *  _Color.rgb;
                fixed3  ambient  =  UNITY_LIGHTMODEL_AMBIENT.xyz  *  albedo;
                fixed3 diffuse = _LightColor0.rgb * albedo * max(0, dot(worldNormal, worldLightDir));
                return  fixed4(ambient  +  diffuse,  1.0);
            }
            ENDCG
        }
    }

    Fallback  "Transparent/Cutout/VertexLit"
}

mat导入 texture,调整 AlphaScale

1

0.5

为啥感觉没啥区别

相关推荐
90后小陈老师11 小时前
Unity教学 项目2 2D闯关游戏
游戏·unity·游戏引擎
噗噗夹的TA之旅12 小时前
Unity Shader 学习20:URP LitForwardPass PBR 解析
学习·unity·游戏引擎·图形渲染·技术美术
nnsix12 小时前
Unity ReferenceFinder插件 多选资源查找bug解决
unity·游戏引擎·bug
gzroy13 小时前
Unity Shader Graph实现全息瞄准器
unity·游戏引擎
90后小陈老师16 小时前
Unity教学 基础介绍
unity·游戏引擎
90后小陈老师16 小时前
Unity教学 项目3 3D坦克大战
3d·unity·游戏引擎
秦奈18 小时前
Unity复习学习随笔(五):Unity基础
学习·unity·游戏引擎
nnsix19 小时前
Unity ReferenceFinder插件 窗口中选择资源时 同步选择Assets下的资源
java·unity·游戏引擎
麷飞花20 小时前
unity3d scene窗口选中物体, 在 hierarchy高光显示
unity·editor·unity3d·u3d·hierarchy
ۓ明哲ڪ21 小时前
Unity功能——关闭脚本自动编译(Unity2021.3)
unity·游戏引擎