Shader 透明相关

1、设置深度写入与渲染队列

深度写入

深度写入默认是开启,需要通过渲染状态中的 ZWrite off 指令主动关闭深度写入

当我们把它写在Pass渲染通道中时,它只会影响该Pass

若我们把它写在SubShader语句块中,它将影响其中的所有Pass

渲染队列

通过渲染标签主动的设置物体的渲染顺序Tags{ "Queue" = "标签值" }

1.Background(背景)(队列号:1000),最早被渲染的物体的队列,一般用来渲染天空盒或者背景

2.Geometry(几何)(队列号:2000),不透明的几何体通常使用该队列,不设置时的默认队列

3.AlphaTest(透明测试)(队列号:2450) 需要透明度测试的物体使用的队列

4.Transparent(透明的)(队列号:3000) 半透明物体的渲染队列,该队列中几何体按照由远到近的

顺序进行绘制,所有进行透明混合的几何体都应该使用该队列

5.Overlay(覆盖)(队列号:4000),用是放在最后渲染的队列,于叠加渲染的效果

6.自定义队列,基于Unity预先定义好的这些渲染队列标签来进行加减运算来定义自己的渲染队列 如:Tags{ "Queue" = "Geometry+1" } 代表的队列号就是 2001

渲染队列一般都定义在SubShader语句块中,影响之后的所有Pass渲染通道使用该Shader(着色器)的物体,就会根据你设置的渲染队列在特定的时间进行渲染
在使用渲染队列Queue 时,一般会搭配忽视投影器IgnoreProjector 和 渲染类型RenderType 一起使用

忽视投影器 IgnoreProjector 标签:

投影器(Projector)是Unity中的一种特殊的光源,它用于在场景中投射纹理(Texture)或简单的几何形状(如圆形

或方形)来模拟光照、阴影或其他视觉效果。

渲染类型 RenderType 标签:

对着色器进行分类,用于着色器替换功能,摄像机上有对应API,可以指定渲染类型替换成别的着色器

Opaque(不透明的)、 Transparent(透明的)、 TransparentCutout(透明切割)、 Background(背景)、 Overlay(覆盖)

2、设置混合命令

编写Shader时可以通过添加【混合方式】 的渲染状态来控制源颜色和目标颜色如何进行混合计算

混合默认是关闭的,当使用了Blend混合命令时(除Blend off),Unity内部就会自动的帮助我们开启混合我们在实现透明效果时,就需要设置混合方式这个渲染状态

混合的基本原理

当我们在进行渲染时,当片元通过了深度测试后,会进入到混合流程中。在混合流程中:

当前片元的颜色被称为源颜色; 颜色缓冲区中的颜色被称为 目标颜色

混合就是将源颜色和目标颜色用对应的混合算法进行计算后,输出一个新的颜色更新到颜色缓冲区中

注意:这些颜色都是RGBA包含透明通道A

混合的计算规则

混合因子

我们假设
**当前片元的颜色被称为 源颜色 = S (source)
颜色缓冲区中的颜色被称为 目标颜色 = D (destination)
混合后的 输出颜色 = O(out)
混合计算的规则就是需要构建两个混合等式

  1. 计算RGB通道的混合等式
    Orgb = 源因子 * Srgb + 目标因子 * Drgb
  2. 计算A通道的混合等式
    Oa = 源透明因子 * Sa + 目标透明因子 * Da**

如果我们使用方式二来设置因子,由于没有指定透明相关因子,因此,在计算时
源透明因子 = 源因子
目标透明因子 = 目标因子

1. Orgb = 源因子 * Srgb + 目标因子 * Drgb
2. Oa = 源因子 * Sa + 目标因子 * Da

混合操作

Unity当中还可以选择其他的计算方式来进行混合计算,在ShaderLab当中除了可以使用 Blend 混合命令来设定混合因子,还提供了一个 BlendOp 混合操作命令 来设定混合的计算方式,它的基本语法是

常见的混合类型

相关推荐
omegayy14 小时前
Unity 2022.3.x部分Android设备播放视频黑屏问题
android·unity·视频播放·黑屏
与火星的孩子对话19 小时前
Unity3D开发AI桌面精灵/宠物系列 【三】 语音识别 ASR 技术、语音转文本多平台 - 支持科大讯飞、百度等 C# 开发
人工智能·unity·c#·游戏引擎·语音识别·宠物
向宇it20 小时前
【零基础入门unity游戏开发——2D篇】2D 游戏场景地形编辑器——TileMap的使用介绍
开发语言·游戏·unity·c#·编辑器·游戏引擎
牙膏上的小苏打23331 天前
Unity Surround开关后导致获取主显示器分辨率错误
unity·主屏幕
Unity大海2 天前
诠视科技Unity SDK开发环境配置、项目设置、apk打包。
科技·unity·游戏引擎
浅陌sss2 天前
Unity中 粒子系统使用整理(一)
unity·游戏引擎
维度攻城狮2 天前
实现在Unity3D中仿真汽车,而且还能使用ros2控制
python·unity·docker·汽车·ros2·rviz2
为你写首诗ge2 天前
【Unity网络编程知识】FTP学习
网络·unity
神码编程2 天前
【Unity】 HTFramework框架(六十四)SaveDataRuntime运行时保存组件参数、预制体
unity·编辑器·游戏引擎
菲fay2 天前
Unity 单例模式写法
unity·单例模式