【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,一经查实,立即删除!

相关文章

9 html综合案例-注册界面

9 综合案例-注册界面 一个只有html骨架的注册页面 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>…

1255: 石子合并

时间限制: 1 Sec 内存限制: 128 MB 提交: 1456 解决: 779 [提交] [状态] [讨论版] [命题人:外部导入] 题目描述 现在有n堆石子&#xff0c;你每次可以挑任意两堆将其合并成一堆&#xff0c;代价是两堆石子的数量和。可知经过n-1次合并后只剩下一堆石子&#xff0c;现在要求总…

LabVIEW机器视觉怎样在智能制造中实现高精度质量控制?

在智能制造中&#xff0c;LabVIEW&#xff08;Laboratory Virtual Instrument Engineering Workbench&#xff09;机器视觉系统能够通过以下方式实现高精度质量控制&#xff1a; 1. 图像采集与预处理 LabVIEW利用高分辨率相机和图像传感器来采集产品图像。通过使用LabVIEW的图…

stable diffusion webui prompt generator and translator

主要关注一些stable diffusion中的prompt的翻译器,prompt有很多优化的算法,本身prompt优化也是比较好的方向,这块主要有类似beautifulprompt之类算法,包括fooocus中内置了一个基于GPT2的语言模型来提供更好的prompt,这类的插件在git上有很多,对于目前的很多线上的图片生成…

PostgreSQL如何监控备库延迟

方案1&#xff1a; 主库查询 SELECT * FROM pg_stat_replication; NOTE1&#xff1a;PostgreSQL 10及以后版本 pg_stat_replication视图增加了write_lag&#xff0c;flush_lag&#xff0c;replay_lag。分别表示从库wal日志写入(写入到操作系统缓存)延迟&#xff0c;从库wal日…

头歌03-最优二叉查找树

""" 题目:给定n个互异的关键字组成的序列K=<k1,k2,...,kn>,且关键字有序(k1<k2<...<kn),从这些关键字中构造一棵二叉查找树。对每个关键字ki,每次搜索到的概率为pi。还有n+1个“虚拟键”d0,d1,...,dn,他们代表不在K的值。d0代表所有小于k…

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

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

php种调用jodConverter+ openoffic实现word转pdf

安装java环境 jdk文件 jdk-8u221-linux-x64.tar.gz将压缩包移到指定目录 sudo mv jdk-8u221-linux-x64.tar.gz /usr/local/ #解压 cd /usr/local sudo tar -zxvf /usr/local/jdk-8u221-linux-x64.tar.gz 配置java环境变量 sudo vim /etc/profile#在文件的最后添加如下内容…

二、信号连接槽函数

需求&#xff1a;点击Button按钮&#xff08;下班&#xff09;&#xff0c;label显示淦饭 信号发出者&#xff1a;Button 发送的信号&#xff08;signals&#xff09;&#xff1a;被点击 信号接收者&#xff1a;label 信号的处理&#xff08;slots&#xff09;&#xff1a;显示…

0基础安装 composer

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

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

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

Excel模板计算得出表格看板

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

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

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

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

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

计算机以及网络协议中常用16进制的原因

一、计算机为什么需要十六进制&#xff1f; 实际上计算机本身是不需要十六进制的&#xff0c;计算机只需要二进制&#xff0c;需要十六进制的是人。 每个十六进制中的数字代表4个比特&#xff0c;你可以非常直观的从十六进制中知道对应的二进制是啥&#xff0c;比如给定一个十…

第八届“英拿科技杯”上海高校金马程序设计联赛暨东华大学邀请赛——源石虫(基础DP)

题源 源石虫 &#xff08;小声哔哔&#xff1a;这题当时脑子抽了死活没想到是DP&#xff0c;一直用贪心试&#xff0c;拿来凑个DP专题的数&#xff09; 代码 #include <bits/stdc.h> using namespace std; using ll long long; #define For for (ll i 1; i < n; …

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

Clickhouse 算术函数操作总结—— Clickhouse 基础篇(五)

文章目录 加法函数减法函数乘法函数浮点除法函数整数除法函数带0整数除法函数取余函数带0取余函数负数函数绝对值函数最大公约数函数最小公倍数函数最大数函数最小数函数 加法函数 加法函数不仅可以计算数字&#xff0c;还可以使用日期和时间来进行加法运算。日期加的是天数&a…

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

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