Unity Shader 被遮挡的部分半透高亮显示

效果图,上边是正常遮挡,下边是修改后的,遮挡部分半透明高亮显示出来

                                                        

                       

  1. 默认情况下,模型如果有一部分被其他物体遮挡,在进行深度测试的时候是不会被通过的,所以最终不会被渲染出来。如果想让被遮挡的部分渲染出来,那就只能让他通过深度测试,然后跟已存在的像素进行混合,从而产生半透明效果。
  2. 模型未被遮挡的部分走正常渲染流程即可。
  3. Shader "Custom/OcclusionShader"
    {
        Properties
        {
            //part of being occlusion
            _Color("Occlusion Color", Color) = (0,1,1,1)
            _Width("Occlusion Width", Range(0, 10)) = 1
            _Intensity("Occlusion Intensity",Range(0, 10)) = 1
    
            //ordinary part
            _Albedo("Albedo", 2D) = "white"{}
            _Specular("Specular (RGB-A)", 2D) = "black"{}
            _Normal("Nromal", 2D) = "bump"{}
            _AO("AO", 2D) = "white"{}
        }

    上半部分的变量用于控制被遮挡部分。_Color用于控制颜色;_Width控制边缘高亮的宽度;_Intensity控制高亮的亮度。

    下半部分是正常PBR Specular工作流的部分,为了节省资源,我把Shininess放在了_Specular的a通道里。

  4. 我们想要被遮挡的部分透明显示,所以把shader的渲染序列设为Transparent
  5. 我们想要被遮挡的部分仍然通过深度测试,所以把测试方式改为Greater,也就是说当前面有物体挡住它的时候,它就会显示出来
  6. 我们只需要使用普通的透明混合方式即可,所以使用Blend SrcAlpha OneMinusSrcAlpha
  7. 考虑到性能,我们在这一部分使用顶点-片段着色器。顶点着色器中使用内置的appdata_base结构体作为输入,然后输出包含“裁切空间顶点坐标”、“世界空间视线向量”和“世界空间法线向量”的v2f结构体。
  8. 在片段着色器中,我们把视线向量和法线向量进行点乘,然后使用saturate函数得到范围[0,1]内的数值,从而得到中间白边缘黑的效果。1减去这个结果,得到反相效果,也就是边缘白,中间黑的效果。使用pow函数,控制边缘的宽度,然后乘以一个变量控制边缘最终的亮度,最终输入给透明度,实现半透效果。
  9. 把_Color输出给颜色。

  然后再写pass正常渲染即可

工程下载

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一零壹0

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值