【Unity Shader入门精要 第8章】透明效果(二)

1. 透明度测试

透明度测试的原理是将片元的 Alpha 值与某个指定的阈值进行比较,当 Alpha 超过阈值时,该片元正常显示,若 Alpha 值低于指定的阈值,则将该片元丢弃。准确来讲,透明度测试并不是为了渲染一种半透的效果,而是为了通过片元的 Alpha 值进行筛选,确定哪些像素需要渲染哪些像素不需要渲染,跟我们之前提到过的深度测试的效果是一样的,只不过筛选条件不同。

实际上,在透明度测试中,与阈值进行比较的并不一定必须是Alpha值,我们可以用采样得到的任意通道的值——甚至是某个计算得到的值,只要是我们通过某种方式可以掌控的值——来跟阈值进行比较。其重点是通过设定的阈值对像素进行筛选,以确定像素是否需要被丢弃。

因此,透明度测试的结果要么完全不显示,要么正常显示。

在【Unity Shader入门精要 第2章】渲染流水线 中我们曾经提到过,存在透明度测试时无法开启Early-Z,正是因为如果开启了 Early-Z,那么在进入片元着色器之前就已经完成了深度测试,此时像素的深度值就会被写入到深度缓冲当中。接着进入片元着色器,发现当前片元的 Alpha 值没有达到阈值,于是该片元被舍弃不会进行渲染,但已经写入深度缓冲中的深度值又不会被撤回,结果就导致深度缓存出错。

2. 示例

  • 创建 Chapter_8_AlphaTest_Mat 作为测试材质
  • 创建 Chapter_8_AlphaTest_Shader 作为测试shader,并赋给 Chapter_8_AlphaTest_Mat 材质
  • 场景中创建一个用于测试的立方体,将 Chapter_8_AlphaTest_Mat 材质赋给立方体
  • 场景中添加一盏平行光,并调整平行光角度
  • 为了便于观察效果,在立方体下方创建一个Plane

使用的测试纹理如下:
在这里插入图片描述
在Shader中增加 _AlphaTest 属性,用于控制进行透明度测试的阈值

在SubShader中设置标签

Tags {"Queue" = "AlphaTest" "IgnoreProjector" = "True" "RenderType" = "TransparentCutout"}

在片元着色器中,使用了clip 方法进行裁剪,该方法的参数可以传入float

void clip(float _checkValue);

此时若 _checkValue 小于0,则会舍弃当前片元的颜色输出,否则正常输出。
也可以传入float2、float3等矢量

void clip(float3 _checkValue);

此时,若 _checkValue 中的任意一个分量小于0,均会舍弃当前片元的颜色输出,否则正常输出。

在 Inpector 面板中改变 AlphaTest属性的值,即可看到效果。
在这里插入图片描述

最终Shader如下:

Shader "MyShader/Chapter_8/Chapter_8_AlphaTest_Shader"
{Properties{_MainTex("MainTex", 2D) = "white"{}_AlphaTest("AlphaTest", range(0, 1)) = 0}SubShader{Tags {"Queue" = "AlphaTest" "IgnoreProjector" = "True" "RenderType" = "TransparentCurout"}Pass{Tags {"LightMode" = "ForwardBase"}CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"#include "Lighting.cginc"struct a2v{float4 vertex : POSITION;float3 normal : NORMAL;float2 uv : TEXCOORD0;};struct v2f{float4 vertex : SV_POSITION;float2 uv : TEXCOORD0;float3 worldNormal : TEXCOORD1;};sampler2D _MainTex;float4 _MainTex_ST;fixed _AlphaTest;v2f vert(a2v i){v2f o;o.vertex = UnityObjectToClipPos(i.vertex);o.worldNormal = mul(i.normal, (float3x3)unity_WorldToObject);o.uv = TRANSFORM_TEX(i.uv, _MainTex);return o;}fixed4 frag(v2f i) : SV_Target{fixed3 _ambient = UNITY_LIGHTMODEL_AMBIENT.rgb;float3 _worldNormal = normalize(i.worldNormal);float3 _worldLight = normalize(_WorldSpaceLightPos0.xyz);fixed4 _sampledColor = tex2D(_MainTex, i.uv);clip(_sampledColor.w - _AlphaTest);fixed3 _diffuse = _LightColor0.rgb * _sampledColor.xyz * (0.5 * dot(_worldLight, _worldNormal) + 0.5);return fixed4(_ambient + _diffuse, 1);}ENDCG}}}

效果如下:
在这里插入图片描述

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

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

相关文章

IS-IS基本配置 IS-IS邻接关系

一.IS-IS基本配置 原理概述 和 OSPF 路由协议一样, IS-IS 也是一个应用非常广泛的 IGP 路由协议,很多 ISP 网络、特别是大型的ISP网络都部署了IS-IS网络协议。 RIP 、 OSPF 等许多 IGP 都是针对 IP ( Internet Protocol )这个网络层协议而开…

二、信号连接槽函数

需求:点击Button按钮(下班),label显示淦饭 信号发出者:Button 发送的信号(signals):被点击 信号接收者:label 信号的处理(slots):显示…

0基础安装 composer

解决: composer 不是内部或外部命令,也不是可运行的程序 或批处理文件。 php composer.phar可以运行 安装环境:系统w11 官网地址:Composer 1.安装composer 1.1打开命令行窗口 在命令行窗口里,右键是粘贴&#xff0…

精准安全运维,统信UOS服务器版V20(1070)漏洞修复指南丨年度更新

随着信息安全威胁的不断升级,操作系统的安全性已成为企业运维的关键要素。 为了确保业务运行环境的安全无忧,统信软件持续致力于技术创新和优化,并于日前重磅推出了统信UOS服务器版V20(1070)。该系统提供了高频补丁更…

Excel模板计算得出表格看板

背景 表格看板及导出,单元格时间年是根据筛选器时间变化的 较往年和往年是计算单元格 思路 1.通过excel模板来把数据填入excel再数据清洗得到数据返回前端 2.数据填充,通过行列作为key 列如:key整体20241月,根据key匹配数据填…

马蹄集 oj赛(双周赛第二十七次)

目录 栈的min 外卖递送 奇偶序列 sort 五彩斑斓的世界 括号家族 名次并列 栈间 双端队列 合并货物 逆序对 活动分组 栈的min 难度:黄金巴 占用内存:128 M时间限制:1秒 小码哥又被安排任务了,这次他需要要设计一个堆栈,他除了可以满足正常的栈…

半导体测试基础 - AC 参数测试

AC 测试确保 DUT 的时特性序满足其规格需求。 基本 AC 参数 建立时间(Setup Time) 建立时间指的是在参考信号(图中为 WE)发生变化(取中间值 1.5V)前,为了确保能被正确读取,数据(图中为 DATA IN)必须提前保持稳定不变的最短时间。在最小建立时间之前,数据可以随意变…

ROS | 实现SLAM的功能

用launch文件启动Hector_Mapping的建图功能 1.引入launch文件 2.args是引入的设置好的rviz文件 Hector_Mapping建图的参数设置

141.字符串:重复的字符串(力扣)

题目描述 代码解决 class Solution { public:// 计算字符串s的next数组&#xff0c;用于KMP算法void getNext(int *next, const string& s){int j 0; // j是前缀的长度next[0] 0; // 初始化next数组&#xff0c;第一个字符的next值为0for (int i 1; i < s.size(); …

2024 中青杯高校数学建模竞赛(B题)数学建模完整思路+完整代码全解全析

你是否在寻找数学建模比赛的突破点&#xff1f;数学建模进阶思路&#xff01; 作为经验丰富的数学建模团队&#xff0c;我们将为你带来2024 长三角高校数学建模竞赛&#xff08;A题&#xff09;的全面解析。这个解决方案包不仅包括完整的代码实现&#xff0c;还有详尽的建模过…

ubuntu server 22.04 使用docker安装 onlyoffice 8.0同时添加中文字体、字号

本文主要介绍在ubuntu server 22.04 系统上使用docker安装onlyoffice 8.0同时添加中文字体、字号方法。 1、硬件要求 CPU&#xff1a;双核2 GHz或更高 内存&#xff1a;最少4GB 硬盘&#xff1a;至少40 GB可用空间 Swap file&#xff1a;至少4 GB&#xff0c;但取决于主机操作…

[GUET-CTF2019]encrypt

我自己大致分析的是输入flag然后先 RC4加密再 base64加密&#xff0c;解了一下发现不对。 那就只能仔细分析了&#xff0c;看有没有魔改 嗯&#xff0c;可以动调试试&#xff0c;嗯就是要找其 key 的值 &#xff1a;0x10,0x20,0x30,0x30,0x20,0x10,0x40 aaaaaaaaaa--->dd…

MobaXterm使用私钥远程登陆linux

秘钥的形式使用MobaXterm 远程连接 linux 服务器 MobaXterm使用私钥远程登陆linux just填写远程主机 不指定用户 勾选使用私钥 选择私钥即可 1.使用秘钥连接 远程linux 服务器的好处 只需要第一次添加秘钥&#xff0c;并输入密码后&#xff0c;以后再连接就不需要再输入密码…

【每日刷题】Day47

【每日刷题】Day47 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. 112. 路径总和 - 力扣&#xff08;LeetCode&#xff09; 2. 2404. 出现最频繁的偶数元素 - 力扣&am…

ubuntu20.04安装cmake3.22.1

背景 由于第一套上位机windows clion22 嵌入式ubuntu20.04的开发环境中&#xff0c;ubuntu20.04上安装的是cmake3.22.1, 为了保持一致&#xff0c;需要指定安装的cmake版本。 下载指定版本的cmake 进入cmake官网的download页面&#xff0c;https://cmake.org/download/&…

番外篇 | YOLOv8改进之更换主干网络MobileNetv3 + 添加CA注意力机制

前言:Hello大家好,我是小哥谈。MobileNetv3是一种轻量级网络,采用了深度可分离卷积等轻量化技术,具有较小的模型参数量和计算复杂度,适合在计算能力较弱的设备上运行。本节课就让我们结合论文来对YOLOv8进行组合改进(更换主干网络MobileNetv3 + 添加CA注意力机制),希望…

第06章 数据加载、存储与文件格式

以下内容参考自https://github.com/iamseancheney/python_for_data_analysis_2nd_chinese_version/blob/master/%E7%AC%AC05%E7%AB%A0%20pandas%E5%85%A5%E9%97%A8.md 《利用Python进行数据分析第2版》 用以学习和记录。 输入输出通常可以划分为几个大类&#xff1a;读取文本文…

【Linux学习】进程基础API

下面是有关进程基础API的相关介绍&#xff0c;希望对你有所帮助&#xff01; 小海编程心语录-CSDN博客 目录 1. 僵尸进程与孤儿进程 1.1 孤儿进程 1.2 僵尸进程 2. 监视子进程 2.1 wait() 2.2 waitpid() 3. 执行新程序 exec族函数 4. 守护进程 1. 僵尸进程与孤儿进程…

(5)SK插件

&#xff08;5&#xff09;SK插件 什么是AI插件&#xff1f; 使用人工智能插件的目的是通过利用人工智能能力来增强软件应用程序的功能。人工智能插件可以提供各种功能&#xff0c;如自然语言处理、图像识别、预测分析等。 通过将AI插件集成到应用程序中&#xff0c;您可用为…

通过 Spring 操作 Redis

要想通过 Java 操作 redis&#xff0c;首先要连接上 redis 服务器&#xff0c;推荐看通过 Java 操作 redis -- 连接 redis 创建项⽬ 勾选 NoSQL 中的 Spring Data Redis 当然, 把 Web 中的 Spring Web 也勾选⼀下.⽅便写接进⾏后续测试. 配置 redis 服务地址 在 application.…