目录 |
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 给背面翻转法线
现在,我们看到了几何图形的两面,但内部照明不正确。