《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

为啥感觉没啥区别

相关推荐
真鬼1231 天前
【Unity WebGL】内嵌网页与双向通信
unity·游戏引擎·webgl
zyh______2 天前
C#语法糖(按照实用性排序)
unity·c#
avi91112 天前
[AI教做人]CinemachineCamera 各项调整配置参数入门 + Profiler
unity·游戏开发·camera·cinemachine·visual camera·镜头配置
郝学胜-神的一滴3 天前
[简化版 GAMES 101] 计算机图形学 16:纹理走样、Mipmap、三线性插值、各向异性过滤原理全解
unity·游戏引擎·godot·图形渲染·three.js·opengl·unreal
2301_767113984 天前
Superpowers 游戏引擎从零开发实战指南
游戏引擎
吴梓穆4 天前
untiy TextMeshPro (TMP) text 操作 中文字符集 字体材质操作(添加纹理 添加描边 添加阴影)
unity
想你依然心痛4 天前
嵌入式单元测试:Unity/CMock框架与硬件在环测试——测试驱动、桩函数
unity·单元测试·游戏引擎
yangmu32034 天前
《星露谷物语》MOD配置与实战安装综合指南
游戏·游戏引擎·游戏程序
xcLeigh4 天前
Unity基础:Game视图详解——游戏预览、分辨率模拟与性能显示
游戏·unity·游戏引擎·音频·视频·game·play模式
ZJU_fish19964 天前
全局光照/阴影的几个常见问题
游戏引擎·图形渲染