Unity遮挡边缘光透明xray效果(RimShader)

unity3d 之 边缘(rim) unity shader 之 边缘的原理 和 实现 阅读详情

一. 前言
在3D游戏中,经常会出现控制的角色被房子或者墙壁之类的挡住,一些游戏会做一些特殊效果把角色被挡住的部分用xray边缘光显示出来,如下图,下面就用Shader实现遮挡透明效果。

在这里插入图片描述
二. 制作
1 创建Shader
shader需要两个pass来实现。其中一个pass正常显示贴图,另外一个pass实现xray效果。
创建一个Shader文件,Shader代码见文章末尾


2 创建材质球
创建材质球

使用刚刚的shader,设置RimColor

把材质球赋值给模型


3 测试
创建一个Cube遮挡角色,即可看到角色的边缘光透明xray效果

在这里插入图片描述
三. Shader代码
 

Shader "MyShader/RimShader"   
{
    Properties   
    { 
        _MainTex ("Base (RGB)", 2D) = "white" {}  
        _RimColor("RimColor",Color) = (0,1,1,1)
        _RimPower ("Rim Power", Range(0.1,8.0)) = 1.0
    }  
    SubShader   
    {
        LOD 300  
        Tags { "Queue" = "Geometry+500" "RenderType"="Opaque" } 
        Pass
        {
            Blend SrcAlpha One
            ZWrite off
            Lighting off
            ztest greater
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"
            float4 _RimColor;
            float _RimPower;
            struct appdata_t {
                float4 vertex : POSITION;
                float2 texcoord : TEXCOORD0;
                float4 color:COLOR;
                float4 normal:NORMAL;
            };
            struct v2f {
                float4  pos : SV_POSITION;
                float4  color:COLOR;
            } ;
            v2f vert (appdata_t v)
            {
                v2f o;
                o.pos = UnityObjectToClipPos(v.vertex);
                float3 viewDir = normalize(ObjSpaceViewDir(v.vertex));
                float rim = 1 - saturate(dot(viewDir,v.normal ));
                o.color = _RimColor*pow(rim,_RimPower);
                return o;
            }
            float4 frag (v2f i) : COLOR
            {
                return i.color; 
            }
            ENDCG
        }
        pass  
        {
            ZWrite on
            ZTest less 
            CGPROGRAM  
            #pragma vertex vert  
            #pragma fragment frag  
            sampler2D _MainTex;  
            float4 _MainTex_ST;
            struct appdata {
                float4 vertex : POSITION;  
                float2 texcoord : TEXCOORD0;  
            };  
            struct v2f  {
                float4 pos : POSITION;  
                float2 uv : TEXCOORD0;  
            };  
            v2f vert (appdata v) 
            {
                v2f o;  
                o.pos = UnityObjectToClipPos(v.vertex);  
                o.uv = v.texcoord;  
                return o;  
            } 
            float4 frag (v2f i) : COLOR  
            {
                float4 texCol = tex2D(_MainTex, i.uv);  
                return texCol;  
            }  
            ENDCG  
        }  
    } 
    FallBack "Diffuse" 
}  

————————————————
版权声明:本文为CSDN博主「林新发」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/linxinfa/article/details/105975216

UnityShader崩坏渲染解析系列(3)--高、Dither效果、Rim、特殊状态 身体渲染高 阅读详情

相关推荐

Unity Shader Example 24 (人物遮挡透明效果)

Shader "Occlusion" { Properties { _MainTex ("Base (RGB)", 2D) = "white" {} _Alpha ("Alpha", Range(0.0, 1.0)) = 0.25 } SubShader { Tags { "Queue"="Transparent" "RenderType"="Opaque" } Pass { Z

aa20274270的博客 2742

UnityShader实例04:遮挡透明材质

遮挡透明材质 边缘材质原理和xray材质相类似,shader代码也就长得几乎一样了,一般游戏中做一些角色的背效果,或者宝石材质(如下图所示),总之看怎么灵活运用了。

lupeng的博客 2万+

Unity Shader 之遮挡透明

Unity Shader 之遮挡透明

Unity3D Shader系列之边缘RimLight

1 引言 这一两个月会花一点时间来集中总结下用Shder实现的效果。其实我一直在想为什么自己将渲染流水线、坐标变换这些弄得非常清楚了,但看到某种效果的时候,依然不知从何下手?现在觉得最主要的原因是自己对实现这种效果的算法的知识是欠缺的。因为每种效果用到的算法是都是不一样的,不是说自己把这种效果弄懂后就能迁移到另外一种效果。说白了没有系统性的看过书,系统看过书之后,看到某种效果就能大概知道它底层的原理是什么,原理知道了写Shader相对来说就是简单的事情了。所以来总结下一些常用的效果,以便后面查阅。 2 原理

老王的博客 7922

Unity实现遮挡人物的障碍物体设为透明,并在不遮挡时恢复的个人解决方法

通过摄像机向人物发射射线,检测第一个碰到的物体是否为人物。如果不是人物,那么就判断为障碍,将其透明度设为0.2,并将其添加入一个GameObject数组中。当射线检测到第一个物体是人物时,将这个GameObject数组中的所有物体透明度恢复为1,并清空这个数组。

qianhang120的博客 3994

Unity Shader透明并具有遮挡效果

1、 Shader "MASK/PortalMaskShader" { SubShader { Tags{ "RenderType" = "Opaque" "Queue" = "Geometry-3" } ColorMask 0 ZWrite on CGINCLUDE #include "UnityCG.cginc" struct appdata { float4 vertex : POSITION; }; struct v2f { float4 pos :

龙胖胖的博客 5124

Unity Shader编程】之十四 边缘Shader(Rim Shader)的两种实现形态

这篇文章主要讲解了如何在Unity3D中分别使用Surface Shader和Vertex & Fragment Shader实现边缘Shader。 一、最终实现的效果 边缘Shader比较直观的一个运用便是模拟宇宙中的星球效果。将本文实现的边缘Shader先赋一个Material,此Material再赋给一个球体,加上Galaxy Skybox, 实现的效果如下图: 当然,边缘Shader也可以实现例如暗黑三中精英怪的高亮效果,将一个怪物模型本身的Shader用边缘Sh

【浅墨的游戏编程Blog】毛星云(浅墨)的专栏 4万+

Unity中URP下的菲涅尔效果实现(URP下的法线和视线向量怎么获取)

我们在这篇文章中,了解一下URP中Shader怎么实现菲涅尔效果,同时学习一下URP下怎么获取法线 和 视线向量。

楠溪泽岸的博客 3037

Unity入门精要03---透明效果

UnityShader入门精要之半透明效果

qq_24917263的博客 2963

unity shader-遮罩效果

效果: shader代码:Shader "Custom/Mask" { Properties { _MainTex ("Base (RGB)", 2D) = "white" {}//目标图片,即需要被遮罩的图片 _MaskLayer("Culling Mask",2D) = "white"{}//混合的图片,设置为白色的图片,任何颜色与白色混合,其颜色不

yiwei151的博客 6840

Unity Shader实现人物透视效果

透视效果图 shader Shader "Unlit/SeeThrough" { Properties { _Color("Color", Color) = (1,0,0,1) } SubShader { Tags { "RenderType"="Opaque" "Queue" = "Geometry+98" } LOD 100 ZTest Greater ZWrite

曾用名:极客柒 3012

unity遮挡人物的模型透明化_笔记

使用射线检测将挡住人物的模型透明化(未考虑性能问题)原理: 从相机向人物发射一条射线,将碰到的tag为"障碍"的模型mesh材质全换为透明贴图,并将当前透明化的材质存储,每帧刷新时复原。前置条件: 1. 将需要透明化的模型tag设置为"障碍" 2. 将"BuildSetFasle()"函数放在update中执行...

huojiweigb的博客 1560

UnityShader之遮挡透明

  好久没写博客了,最近在学shader,不得不说,shader真的非常美妙,我沉迷其中无法自拔= =   之前做过一个遮挡透明的功能,当物体遮挡住主角时,该物体会变成半透明显示出主角。这次同样是遮挡透明的功能,不过,变透明的刚刚相反,是主角变成半透明,更严谨的说是主角被遮挡的那一部分变成半透明。   先放出结果图:   当被遮挡时,遮挡部分透明处理,那么需要涉及渲染深度...

weixin_30797199的博客 1397

unity 模型描边中间透明(shader)

1.记录找到的一个模型描边中间透明的shader,大概就是下图Cube这样. 2.脚本 Shader "Unlit/Shaer" { Properties{ _Color("Main Tint", Color) = (1, 1, 1, 1) _MainTex("Texture", 2D) = "white" {} _OutlineWidth("OutlineWidth", Range(0, 1)) = 0.1 _OutlineColor("O

中灰灰的博客 2583

Unity Shader入门精要学习——透明效果

要么完全透明,要么完全不透明。实现简单,实质上是一种剔除机制,通过将不满足条件(通常使用小于某个阈值来判定,一般使用clip方法)的片元舍弃的方法来达到完全透明效果。这些被舍弃的片元不会再进行任何的处理,也不会对颜色缓冲产生任何影响,其余满足条件的片元则会继续按普通的不透明物体的处理方式继续处理。...

番茄猿的博客 3110

unity 显示3D模型被遮挡透明边框效果

在3D游戏中,地图上的各种物件会对模型照成遮挡。主要是在主角上 体验很不好。让被遮挡的部分有个透明边框显示出来,是个比较好的解决方案。 思路:要分成两个PASS来做,1个就是画出透明边框,另一个是正常的显示纹理。透明边框的PASS需要把在被遮挡时显示,这里需要对深度测试和深度写入做操作。当没被遮挡到时则正常显示模型。 上节做完边缘刚好可以用上,稍微改造下就可以被边缘显示出来。 看图: 成品效果: ZTest 默认是LEqual的 则是相对于摄像机在越靠前的物体优先渲染。则后面的物体会被前面的物体遮挡

许先森的博客 3139

U3D实现边缘

1.边缘方法(Rim Light)Unity官方教程里有例子,其中核心是这两句代码: half rim = 1.0 - saturate(dot (normalize(IN.viewDir), IN.worldNormal)); o.Emission = _RimColor.rgb * pow (rim, _RimPower); IN.viewDir是当前视角向量,IN.worl

afteryunlei的专栏 2590

Unity3D Shader系列之透视效果XRay

Shader实现透视效果,X效果

老王的博客 1万+
上一篇: unity特效之 建筑结构科技透视效果 贴近消失远离显示FadeInOut.shader
下一篇: 二维地图的处理方法
年年复始
博客等级 码龄10年 239粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值