学习100个Unity Shader (14) ---透明效果

这篇具有很好参考价值的文章主要介绍了学习100个Unity Shader (14) ---透明效果。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

渲染队列

由”Queue“ 标签决定,索引号越小越早被渲染:

名称 队列索引号
Background 1000
Geometry 2000
AlphaTest 2450
Transparent 3000
Overlay 4000

透明度测试(Alpha Test)

某一片元的透明度小于某个阈值,即被舍弃,反之,按非透明物体处理,进行正常的深度测试和深度写入【不需要关闭深度写入】。

效果

学习100个Unity Shader (14) ---透明效果,Unity3D,Shader,unity,游戏引擎,图形渲染

Shader

// Upgrade NOTE: replaced '_Object2World' with 'unity_ObjectToWorld'

Shader "Example/AlphaTest"
{
  Properties
  {
    _Color ("Main Tint", Color) = (1, 1, 1, 1 )
    _MainTex ("Main Tex", 2D) = "white" {} 
    _Cutoff ("Alpha Cutoff", Range(0, 1)) = 0.5
  }
  SubShader
  {
    //TransparentCutout: 指明使用了透明度测试
    //不受投影标签的影响
    Tags {"Queue" = "AlphaTest" "IgnoreProjector" = "True" "RenderType" = "TransparentCutout"}

    Pass
    {
      Tags{"LightMode" = "ForwardBase"}
      CGPROGRAM
      #pragma vertex vert
      #pragma fragment frag

      #include "UnityCG.cginc"

      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;
      };

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

      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);

        //透明度测试, 输入值小于0则丢弃该片元
        clip(texColor.a - _Cutoff);

        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"
}

UnityObjectToClipPos 将顶点从模型空间转到剪裁空间
UnityObjectToWorldNormal 将法线方向从模型空间变换到世界空间
unity_ObjectToWorld 当前模型矩阵
TRANSFORM_TEX UnityCG.cginc内置宏,变换贴图的平移和缩放的属性到UV:

#define TRANSFORM_TEX(tex,name) (tex.xy * name##_ST.xy + name##_ST.zw)

UnityWorldSpaceLightDir 光照模式在ForwardBase下,根据给定在模型空间下的顶点位置,计算朝向光源的世界空间方向。
tex2D 从纹理中获取像素的颜色信息,传入一个纹理和一个二维坐标(通常是纹理坐标),以获取该坐标处的像素颜色。

透明度混合(Alpha Blending)

可以得到真正的半透明效果,使用当前片元的透明度作为混合因子,与已经存储在颜色缓冲中的颜色值进行混合,得到新的颜色。需要关闭深度写入,但没有关闭深度测试。

效果

学习100个Unity Shader (14) ---透明效果,Unity3D,Shader,unity,游戏引擎,图形渲染

Shader

Shader "Example/AlphaBlend"
{
  Properties
  {
    _Color ("Main Tint", Color) = (1, 1, 1, 1)
    _MainTex ("Texture", 2D) = "white" {}
    _AlphaScale ("Alpha Scale", Range(0, 1)) = 1
  }
  SubShader
  {
    Tags {"Queue" = "Transparent" "IgnoreProjector" = "True" "RenderType" = "Transparent"}
    // Pass的先后顺序有影响
    //开启深度写入,不输出颜色
    Pass
    {
      ZWrite On
      ColorMask 0
    }
    //透明度混合
    Pass
    {
      Tags{"LightMode" = "ForwardBase"}
      // 关闭深度写入
      ZWrite Off
      // 设置Pass的混合模式,SrcAlpha: 片元着色器产生的颜色的混合因子
      // OneMinusSrcAlpha 已经存在于颜色缓冲中的颜色的混合因子
      Blend SrcAlpha OneMinusSrcAlpha
      CGPROGRAM
      #pragma vertex vert
      #pragma fragment frag

      #include "UnityCG.cginc"

      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;
      };

      fixed4 _Color;
      sampler2D _MainTex;
      float4 _MainTex_ST;
      fixed _AlphaScale;
      float4 _LightColor0;

      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, texColor.a * _AlphaScale);
      }
      ENDCG
    }
  }
  Fallback "Transparent/VertexLit"
}

使用两个Pass来渲染模型:第一个Pass开启深度写入,但不输出颜色,第二个Pass进行正常的透明度混合。注意写Pass有先后顺序。

使用两个Pass原因是,由于关闭了深度写入,当模型本身有复杂的遮挡关系或是包含了复杂的非凹凸网络,就会因为排序问题产生错误的透明效果。

ColorMask 设置颜色通道的写掩码,ColorMask RGB | A | 0 | 其他任何RGBA的组合,当设置为0时,Pass不写入任何的颜色通道,不会输出颜色。

参考

《Unity Shader入门精要》冯乐乐
内置着色器变量
内置着色器函数文章来源地址https://www.toymoban.com/news/detail-861519.html

到了这里,关于学习100个Unity Shader (14) ---透明效果的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 在Android中Unity3D透明背景的实现

    在Unity中,可以通过Window-Rendering-lighting-在属性面板中选择Environment,修改 Skybox Material 为 None 来去掉天空盒。 但去掉天空盒的效果是这样的: 这样的效果明显不是预期的效果。 去掉天空盒并不代表背景被透明,还需要设置Camera的背景。 需要设置黑色透明度0,即ARGB为(0,

    2023年04月08日
    浏览(92)
  • Unity3D Shader 引导遮罩,支持圆形、矩形、圆角矩形框

    unity3D新手引导遮罩,支持圆形,矩形框,圆角矩形框。图形位置和大小可以根据控件的位置和大小调节,通用所有分辨率设备。黄色区域遮挡,只有白色区域可以点穿。 原文链接:https://www.kadastudio.cn/archives/89 ​ 将MyGuideMask挂载到脚本上,然后通过GuideMask创建材质并赋值,根据

    2024年02月11日
    浏览(51)
  • 【Unity3D小功能】Unity3D中实现UI擦除效果、刮刮卡功能

    推荐阅读 CSDN主页 GitHub开源地址 Unity3D插件分享 简书地址 我的个人博客 大家好,我是佛系工程师 ☆恬静的小魔龙☆ ,不定时更新Unity开发技巧,觉得有用记得一键三连哦。 使用Unity3D实现UI的擦拭效果、刮刮卡功能的效果实现方式比较多,比如说用Shader、Texture渲染都是可以

    2024年02月04日
    浏览(246)
  • Unity Shader学习3:透明效果

    Unity中的透明效果由透明通道控制(RGBA中的A),其值为0是完全透明,为1时完全不透明。有两种方法可以实现透明效果: 透明度测试(Alpha Test) 和 透明度混合(Alpha Blend) 。 透明度测试是指通过特定的条件(通常是Alpha通道的值是否超过某个阈值)来判断片元是否透明,只

    2024年01月19日
    浏览(62)
  • Unity Shader入门精要学习——透明效果

    要么完全透明,要么完全不透明。 实现简单,实质上是一种剔除机制,通过将不满足条件(通常使用小于某个阈值来判定,一般使用clip方法)的片元舍弃的方法来达到完全透明效果。这些被舍弃的片元不会再进行任何的处理,也不会对颜色缓冲产生任何影响,其余满足条件

    2024年02月17日
    浏览(50)
  • 【Unity3D赛车游戏】【五】Unity中汽车加速效果是如何优化的?

    👨‍💻个人主页 :@元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏 :Unity游戏demo – 😶‍🌫️版本: Unity2021 😶‍🌫️适合人群:Unity初学者 😶‍🌫️学习目标:3D赛车游戏的基础制作 😶‍🌫️技能掌握

    2024年02月10日
    浏览(50)
  • Unity Shader学习记录(11) ——透明效果的实现方式

    1 透明效果的两种方法 透明是游戏中经常要使用的一种效果。在实时渲染中要实现透明效果,通常会在渲染模型时控制它的透明通道(Alpha Channel)。当开启透明混合后,当一个物体被渲染到屏幕上时,每个片元除了颜色值和深度值之外,它还有另一个属性一一透明度。 当透明度

    2024年02月07日
    浏览(45)
  • Unity3D 基础——使用 Mathf.SmoothDamp 函数制作相机的缓冲跟踪效果

    使用 Mathf.SmoothDamp 函数制作相机的缓冲跟踪效果,让物体的移动不是那么僵硬,而是做减速的缓冲效果。将以下的脚本绑定在相机上,然后设定好 target 目标对象,即可看到相机的缓动效果。通过设定 smoothTime 的值,可以调节缓动效果的持续时间。 Mathf-SmoothDamp - Unity 脚本 A

    2024年01月16日
    浏览(54)
  • Unity3D 基础——使用 Vector3.Lerp 实现缓动效果

     让一个物体从当前位置移动到另一个位置   Vector3-Lerp - Unity 脚本 API https://docs.unity.cn/cn/current/ScriptReference/Vector3.Lerp.html 1.在场景中新建两个 Cube 立方体,在 Scene 视图中将两个 Cude的位置错开。  2.新建 C# 脚本 MoveToTarget.cs(写完记得保存) 3.将脚本绑定到 Cude 上,然后将其

    2024年02月06日
    浏览(50)
  • 让AI臣服,而不是被它替代!让ChatGPT为我们编写Unity3d Shaderlab的着色器(shader)

    ChatGPT的火热大家应该都有目共睹,文案工作者、翻译工作者和画师等各种行业都在被嘲即将失业。不光是这些岗位的员工,作为资深社畜程序猿也能感受到会受到冲击。网上很多人都在发ChatGPT写的代码,并开始大肆宣扬AI要取代程序员了,今天测一测使用ChatGPT来生成一些代码,

    2023年04月23日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包