Unity可编程渲染管线系列(六)透明度(裁剪与淡化 Clipping and Fading)

本文是Unity可编程渲染管线系列的第六部分,主要讲解如何实现透明度裁剪、双面渲染、混合模式以及半透明效果。内容包括:设置Alpha裁剪阈值、调整渲染队列、支持不同混合模式、创建双面mesh、处理阴影投射与接收。同时,介绍了如何通过ShaderGUI自定义材质检查器,以方便切换不同的渲染模式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

1 Alpha裁剪

1.1 Alpha贴图

1.2 纹理化

1.3 丢弃片段

1.4 裁剪阴影

1.5 双面渲染

1.6 给背面翻转法线

1.7 可选的裁剪

1.8 Alpha-Test渲染队列

2 半透明

2.1 混合模式

2.2 透明渲染队列

2.3 不写入深度

2.4 双面材质的半透明

2.5 制作一个双面mesh

2.6 Alpha-Clipped 阴影

2.7 接受阴影

3 Shader GUI

3.1 投射阴影

3.2 设置着色器属性

3.3 预设

本文重点:

1、执行alpha裁减

2、渲染mesh的两个面

3、支持不同的混合模式

4、生成双面mesh

5、根据预设创建ShaderGUI

这是涵盖Unity的可脚本化渲染管道的教程系列的第六部分。这是关于增加对alpha裁剪和半透明材质的支持。

本教程是CatLikeCoding系列的一部分,原文地址见文章底部。“原创”标识意为原创翻译而非原创教程。

本教程使用Unity 2018.3.0f2制作。

(混合使用不透明,裁减和淡化的材质,所有都带有投射和接收阴影)

1 Alpha裁剪

如渲染11透明度中所述,可以通过丢弃基于alpha贴图的片段来在几何图形中切孔。此技术称为Alpha裁剪,Alpha测试或 (剪切)cutout渲染。除此之外,它与渲染不透明几何体完全相同。因此,要支持Alpha裁剪,我们只需要调整着色器即可。

1.1 Alpha贴图

仅当材质的Alpha值在其整个表面变化时,Alpha裁剪才有用。最简单的方法是使用Alpha贴图。这有两种纹理,一种用于正方形几何体(例如方形和立方体),一种用于球体。

(立方体和球体的alpha贴图,空白的是原图,新标签页中查看图片)

导入这些纹理,并指示其Alpha通道代表透明度。它们的RGB通道是均匀的白色,因此不会影响材质的外观。

(Alpha是透明的)

1.2 纹理化

将一个主纹理属性添加到“ Lit”着色器。我们将使用它作为反照率和Alpha的源,默认为纯白色。

使用适当的纹理,创建两种新材质,一种用于发光的alpha剪切球体,另一种用于发光的剪切正方形。

(lit clipped square材质)

在Lit include文件中,添加主纹理及其采样器状态的声明。这类似于阴影贴图,但使用TEXTURE2D和SAMPLER宏。

我们需要UV纹理坐标进行采样,这是网格数据的一部分。因此,将它们添加到顶点输入和输出结构。

要应用纹理的平铺和偏移,请在UnityPerMaterial缓冲区中添加所需的_MainTex_ST着色器变量。然后,当在LitPassVertex中传输UV坐标时,可以使用TRANSFORM_TEX宏。

现在,我们可以使用SAMPLE_TEXTURE2D宏在LitPassFragment中对主贴图进行采样,以获取反照率和Alpha数据,将其与颜色数据相乘。从现在开始,我们还将返回alpha值。现在不需要,但是以后会使用。

1.3 丢弃片段

当片段的alpha值低于某个临界值时,通过丢弃片段来进行alpha裁剪。截止值位于0到1之间,并且是可配置的,因此请为其添加一个着色器属性,默认值为?。

将相应的变量添加到UnityPerMaterial缓冲区。然后使用片段的alpha值减去阈值调用clip函数。这将导致所有最终低于阈值的片段被丢弃,这意味着它们不会被渲染。

(alpha裁剪之后的球体和立方体)

现在,将使用具有Alpa材质的对象渲染带有孔的对象。孔的大小取决于裁剪值。但是,这仅适用于对象表面本身。它们投射的阴影仍然是实体的,因为我们尚未对其进行调整。

1.4 裁剪阴影

剪切阴影的工作方式与lit通道中的剪切完全相同,因此请相应地调整ShadowCaster包含文件。因为最终的alpha值取决于主贴图和材质颜色,所以我们现在还必须在ShadowCasterPassFragment中对实例化的颜色进行采样,因此也需要传递实例ID。

(剪切阴影)

1.5 双面渲染

因为仅渲染了几何图形的正面,所以我们的Alpha剪切对象缺少背面。当围绕它们旋转视图时,这会显而易见。而且,它们的阴影与我们看到的并不匹配,因为只有相对于光源的前侧会投射阴影。解决方案是渲染几何图形的两面,使我们能够看到对象表面的内部并使内部表面投射阴影。

渲染哪一侧由着色器的剔除模式控制。要么不进行剔除,要么对所有正面三角形进行剔除,要么对所有背面三角形进行剔除。我们可以添加一个浮点着色器属性,该属性表示一个枚举值,默认值为2,对应于通常的背面剔除。

通过将枚举属性添加到该属性,我们可以通过枚举弹出窗口公开此属性。可以将所需的枚举类型作为参数提供,在本例中为UnityEngine.Rendering命名空间中的CullMode。

(禁用剔除)

虽然我们已将其定义为着色器属性,但着色器程序并未直接使用剔除模式。GPU使用它来决定将哪些三角形传递给片段程序以及将哪些三角形丢弃。我们通过着色器遍历中的Cull语句来控制它。如果我们使用固定的剔除模式,则可以满足诸如“Cull Off ”之类的要求,但是我们也可以通过编写Cull [_Cull]使其依赖于着色器属性。两次都执行此操作。

(双面渲染)

1.6 给背面翻转法线

现在,我们看到了几何图形的两面,但内部照明不正确。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值