利用ZTest Greater实现人物被场景遮挡X光效果

本文介绍了在第三人称游戏中,如何利用Unity的ZTest Greater实现角色被场景遮挡时的X光效果。通过在材质球中添加新的Pass并调整渲染顺序,当角色位于场景物件之后时,以AlphaBlend模式叠加显示,达到X光轮廓的效果,仅消耗1个DrawCall。

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

利用ZTest Greater实现人物被场景遮挡X光效果

背景

第三人称游戏,特别是ARPG中,主角有时会被一些场景物件或者其他NPC遮挡,此时有几种常见的处理方法:
1.遮挡物直接剔除
2.遮挡物半透
3.主角虽然被遮挡但是能看到一圈轮廓
此文章主要介绍第三种实现方式,消耗仅为1个DrawCall,而且实现方法也很方便。

ZTest

首先需要简单介绍下ZTest,一般的渲染顺序为 不透明物体从前往后渲染-》透明物体从后往前渲染,在渲染时会牵涉到深度排序,也就是ZTest和ZWrite,为了提升性能,只要在片段着色器里没有AlphaTest的情况下,都会使用Early-Z技术,就是在光栅化阶段后,片段着色器前,进行ZTest,在Unity中,默认使用的是

ZTest LEqual

当渲染的片元深度值小于当前深度缓冲中的值时才会被渲染,不然会被剔除。
关于渲染顺序、深度排序等详细知识本文不做赘述。

示例展示

人物未被遮挡
圆柱体代表我们的主角,方块代表场景物件,未被遮挡时可以看到主角的全貌(废话!)。
在这里插入图片描述
此时主角被场景物件遮挡,导致看不全。
在这里插入图片描述
加入X光效果后,我们看到圆柱体被遮挡的部分出现了一圈X光效果。

Unity中,要实现透明物体遮挡实体的效果并且clear flags设为skybox,可以使用Shader进行编写。 首先,在网上或者Unity的官方文档中找到一个透明着色器模板,用于创建透明的表面材质。 其次,在Shader文件中的SubShader中添加以下代码段实现透明度控制: ``` Tags {"Queue"="Transparent" "RenderType"="Transparent"} Blend SrcAlpha OneMinusSrcAlpha Cull Off ZWrite Off ``` 这段代码指定了渲染的队列、渲染类型以及融合模式。Queue设置为Transparent,使得透明物体在绘制时按照正确的顺序进行渲染。Blend设置为SrcAlpha OneMinusSrcAlpha,使用透明度混合模式。Cull设为Off,不进行剔除,保证两个物体都能被渲染。ZWrite设为Off,不写入深度缓冲区,保证透明物体不会深度测试被遮挡的实体物体。 然后,在Pass中添加以下代码段实现渲染到Skybox上: ``` Pass { Tags {"LightMode"="Skybox Only"} ZTest Always ColorMask RGB } ``` 这段代码指定了照模式为Skybox Only,使得渲染仅针对Skybox。ZTest设为Always,表示永远通过深度测试,确保透明物体可以覆盖实体物体。ColorMask设为RGB,只渲染RGB颜色通道,避免Alpha通道影响渲染。 最后,将编写好的Shader应用到透明物体的材质上,并将场景中的Skybox设置为所需的背景。 总而言之,通过编写透明着色器,并在其中设置正确的透明度控制和渲染到Skybox的代码段,可以实现透明物体遮挡实体的效果,并且clear flags设为skybox时能够正确渲染到背景上。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值