《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

为啥感觉没啥区别

相关推荐
世洋Blog3 小时前
利用<<左移运算符优雅的设计游戏能力的任意组合和判断
游戏·unity·c#
毛甘木14 小时前
Unity MonoPInvokeCallback 使用教程
c++·unity
心疼你的一切14 小时前
Unity开发Rokid应用之离线语音指令交互模型
android·开发语言·unity·游戏引擎·交互·lucene
Sator117 小时前
Unity使用OpenXR时,初始化失败的问题
unity·游戏引擎·vr
雨泽‎1 天前
Unity在URP中开启后处理导致RenderTexture存在背景
unity·游戏引擎·图形渲染
冒泡P2 天前
【Unity】TextMeshPro富文本中使用精灵图集
ui·unity·c#·游戏引擎
世洋Blog2 天前
开发思想-(数据驱动+组合模式)VS 继承
unity·组合模式·数据驱动
B0URNE2 天前
【Unity基础详解】(9)Unity核心:UI系统
ui·unity·游戏引擎
jtymyxmz2 天前
《Unity Shader》7.3 渐变纹理
unity·游戏引擎