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

news2024/11/16 7:55:29

文章目录

  • 渲染队列
  • 透明度测试(Alpha Test)
    • 效果
    • Shader
  • 透明度混合(Alpha Blending)
    • 效果
    • Shader
  • 参考

渲染队列

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

名称队列索引号
Background1000
Geometry2000
AlphaTest2450
Transparent3000
Overlay4000

透明度测试(Alpha Test)

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

效果

在这里插入图片描述

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)

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

效果

在这里插入图片描述

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入门精要》冯乐乐
内置着色器变量
内置着色器函数

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1630636.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java后端如何生成二维码

为节约服务器资源,一般情况下,不要直接生成海量二维码。 可以考虑,前缀字符,自定义规则生成二维码。 支持自定义二维码大小、二维码logo、颜色等等 前端生成二维码 详见前端开发手册 附件:代码文件下载 ​​http…

03-JAVA设计模式-模板方法模式

模板方法模式 什么是模板方法 模板方法模式(Template Method Pattern)在Java中是一种行为型设计模式,它定义了一个操作中的算法骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重新定义该算法的某…

STM32入门_江协科技_1~2_OB记录的自学笔记_STM32简介

1.综述 1.1. 课程简介 手打代码是加入了实操,增加学习效果; STM最小系统板面包板的硬件平台; 配套0.96寸的显示屏,便于调试; 因为使用面板板,所以如果程序现象不出来也有可能是硬件连接的问题; …

创新科技赋能旅游服务:智慧文旅引领旅游发展新篇章,智能体验助力产业转型升级

随着科技的飞速发展和人们生活水平的提高,旅游业正迎来前所未有的发展机遇。创新科技在旅游服务领域的广泛应用,不仅提升了旅游体验的品质,也为旅游产业的转型升级注入了新的动力。智慧文旅作为旅游业与信息技术深度融合的产物,正…

Github进行fork后如何与原仓库同步[解决git clone 太慢的问题]

前言 fork了一个仓库以后怎么同步源仓库的代码? 先说一下git clone太慢的问题,可以通过代理拉取代码,具体请看: https://gitclone.com/ 步骤 1、执行命令 git remote -v 查看你的远程仓库的路径。 以一个实际例子说明&#x…

Spring Boot 的文件配置

SpringBoot的配置文件,有三种格式 1.properties 2.yaml 3.yml(yaml的简写) 这里主要介绍1和3格式的。 在项目中,同时存在properties和yml配置文件, properties的优先级更高 同时存在时,两个文件都生效 如果两个文件中,都包含同一个配置,以properties为主。 properties的配置…

免费实用在线小工具

免费在线工具 https://orcc.online/ pdf在线免费转word文档 https://orcc.online/pdf 时间戳转换 https://orcc.online/timestamp Base64 编码解码 https://orcc.online/base64 URL 编码解码 https://orcc.online/url Hash(MD5/SHA1/SHA256…) 计算 https://orcc.online/ha…

中国人工智能奠基人张钹院士:走进“无人区” 探索人工智能之路

4月23日,中国人工智能奠基人、清华大学计算机系教授、中国科学院院士张钹在“人文清华”讲坛作专题分享。在2小时的直播中,张钹以《走进“无人区” 探索人工智能之路》为主题,回顾人工智能的发展历程,为大家解读ChatGPT的意义&…

docker 搭建lnmp环境

一、环境准备 1. 项目环境 公司在实际的生产环境中,需要使用 Docker 技术在一台主机上创建 LNMP 服务并运行 Wordpress 网站平台。然后对此服务进行相关的性能调优和管理工作。 准备所有安装包: mysql-boost-5.7.20.tar.gz nginx-1.18.0.tar.gz php…

​「Python大数据」LDA主题分析模型

前言 本文主要介绍通过python实现数据聚类、脚本开发、办公自动化。读取voc数据,聚类voc数据。 一、业务逻辑 读取voc数据采集的数据批处理,使用jieba进行分词,去除停用词LDA模型计算词汇和每个词的频率将可视化结果保存到HTML文件中二、具体产出 三、执行脚本 python ld…

mac M2 配置item2 rzsz

背景 apple m 系列处理器安装的 homebrew 跟 intel 处理器略有不同,其中安装目录的区别: m 系列处理器安装目录为 /usr/local/bin/homebrew intel 处理器安装目录为 /opt/homebrew 问题1: 卡住 产生原因: m 系列使用 brew install lrzs…

华为OD机试 - 密码解密(Java 2024 C卷 100分)

华为OD机试 2024C卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试(JAVA)真题(A卷B卷C卷)》。 刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试…

StringBoot 集成 Magic-Api

Magic-Api 简介: magic-api是一个基于Java的接口快速开发框架,编写接口将通过magic-api提供的UI界面完成,自动映射为HTTP接口。 无需定义Controller、Service、Dao、Mapper、XML、VO等Java对象即可完成常见的HTTP API接口开发。 Magic-Api 官…

【Spring Boot 源码学习】SpringApplication 的 run 方法监听器

《Spring Boot 源码学习系列》 SpringApplication 的 run 方法监听器 一、引言二、主要内容2.1 SpringApplicationRunListeners2.2 SpringApplicationRunListener2.3 实现类 EventPublishingRunListener2.3.1 成员变量和构造方法2.3.2 成员方法2.3.2.1 不同阶段的事件处理2.3.2…

R语言详解二

一&#xff0c;列表详解 创建一个列表 > myList<-list(id2,name"张三",age20) > myList $id [1] 2$name [1] "张三"$age [1] 20 获取第一个元素 > myList[[2]] [1] "张三" 获取第一个子列表 > myList[2] $name [1] "张…

Netperf网络测试

Netperf网络测试 Netperf简介安装NetperfCentos7安装NetperfWindows安装Netperf 批量网络流量性能测试启动netserver服务端 查看netperf帮助查看netper参数查看netserver参数 TCP_STREAM测试启动netserver服务端客户端 UDP_STREAM测试启动netserver服务端客户端 测试请求/应答网…

通配符SSL证书:功能特性与应用场景解析

随着网络技术的飞速发展&#xff0c;网络安全问题越来越受到人们的重视。在保护网站数据安全、提升用户信任度方面&#xff0c;SSL证书发挥着至关重要的作用。其中&#xff0c;通配符SSL证书以其独特的功能特性和广泛的应用场景&#xff0c;受到了众多网站运营者的青睐。本文将…

2021 年全国职业院校技能大赛高职组“信息安全管理与评估”赛项 A 卷 第三阶段任务书

一、赛项第三阶段时间90 分钟。 三、提示与注意事项 假定各位选手是某企业的信息安全工程师&#xff0c;负责服务器的维护&#xff0c; 该服务器可能存在着各种问题和漏洞&#xff08;见以下漏洞列表&#xff09;。你需要尽 快对服务器进行加固&#xff0c;30 分钟之后将会有很…

HTML学习笔记(二)

1.HTML图像 图像标签&#xff08;<img>)和源属性&#xff08;src&#xff09; HTML中&#xff0c;图像由<img>标签来定义&#xff0c;<img>是空标签&#xff0c;只包含属性&#xff0c;没有闭合标签。在页面上显示图像需要使用源属性&#xff08;src),src是指…

Q1季度方便速食行业线上市场(京东天猫淘宝)销售数据分析

方便食品行业作为快速消费品市场的重要组成部分&#xff0c;近几年表现出较为强劲的发展势头。当然&#xff0c;每年的食品安全问题也在一定程度上影响着市场的良性健康发展。那么&#xff0c;今年Q1季度方便食品的线上发展如何&#xff1f; 根据鲸参谋数据显示&#xff0c;Q1…