Shader "Unlit/遮挡边缘光描边"
{Properties{_MainTex("Texture", 2D) = "white" {}_Diffuse("Color",Color) = (1,1,1,1)_Outline("Outline",Range(0,1)) = 0.1  //  描边参数控制_OutlineColor("Outline Color",Color) = (0,0,0,0)  //  描边颜色默认黑色_Steps("Steps",Range(1,30)) = 1  //  颜色分阶参数_ToonEffect("ToonEffect",Range(0,1)) = 0.5  //  卡通影响_RimColor("Rim Color",Color) = (1,1,1,1)  //  边缘光颜色默认白色_RimPower("Rim Power",Range(0.001,3)) = 1  //  边缘光强度//  X-ray_XRayColor("XRayColor",Color) = (1,1,1,1)_XRayPower("XRayPower",Range(0.01,3)) = 1}SubShader{Tags { "Queue" = "Geometry+1000" "RenderType" = "Opaque"}  //  +1000在其他不透明物体之后渲染LOD 100Pass  //  遮挡X-ray{Name "Xray"Tags{"ForceNoShadowCasting" = "true"}  //  无阴影Blend SrcAlpha One  //  SrcAlpha现颜色a通道做原颜色的目标因子  One目标颜色做目标颜色因子  就是将这两个因子混合叠加ZWrite Off  //  不写深度ZTest Greater  //  被挡住才画CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"struct v2f{float4 vertex : SV_POSITION;float3 viewDir : TEXCOORD0;  //  模型空间视角方向fixed3 normal : TEXCOORD1;  //  模型空间法线};fixed4 _XRayColor;float _XRayPower;v2f vert(appdata_base v) {v2f o;o.vertex = UnityObjectToClipPos(v.vertex);o.viewDir = ObjSpaceViewDir(v.vertex);  //  模型空间视角方向o.normal = v.normal;  //  模型空间法线return o;}fixed4 frag(v2f i) : SV_Target{float3 normal = normalize(i.normal);float3 viewDir = normalize(i.viewDir);  //  分别标准化float rim = 1 - dot(normal, viewDir);return _XRayColor * pow(rim , 1/ _XRayPower);  //  乘上_XRayColor赋值颜色  这两步添加控制}ENDCG}Pass  //  这个pass通道画图和边缘光{CGPROGRAM#pragma vertex vert#pragma fragment frag#include "Lighting.cginc"  //  不然没有 _LightColor0#include "UnityCG.cginc"struct v2f{float2 uv : TEXCOORD0;fixed3 worldNormal : TEXCOORD1;  //  世界法线向量,计算漫反射  需要世界光向量和世界法线向量点乘float3 worldPos : TEXCOORD2;  //  计算世界光向量需要世界坐标,所以这里把世界坐标传下去  计算漫反射float4 vertex : SV_POSITION;  //  顶点坐标};sampler2D _MainTex;float4 _MainTex_ST;float4 _Diffuse;float _Steps;float _ToonEffect;fixed4 _RimColor;float _RimPower;v2f vert(appdata_base v){v2f o;o.vertex = UnityObjectToClipPos(v.vertex);  //  顶点信息从模型转到裁剪空间再放到输出结构体o.worldNormal = UnityObjectToWorldNormal(v.normal);  //  法线从模型变换到世界坐标  法线是向量所以fixed3  为世界光向量和世界法线向量点乘计算漫反射做准备  所以要计算世界法线向量o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);  //  拿到uvo.worldPos = mul(unity_ObjectToWorld, v.vertex);  //  模型的世界坐标  顶点信息从模型坐标系转到世界坐标系得到return o;}fixed4 frag(v2f i) : SV_Target{fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;  //  环境光fixed4 albedo = tex2D(_MainTex, i.uv);  //  采样这个图fixed3 worldLightDir = UnityWorldSpaceLightDir(i.worldPos);  //  世界光向量  漫反射世界光向量和世界法线向量点乘fixed3 worldViewDir = normalize(UnityWorldSpaceViewDir(i.worldPos));  //  世界视角向量float difLight = max(0,dot(worldLightDir,i.worldNormal)) * 0.5 + 0.5;  //  max不让这个值小于零  *0.5+0.5半兰伯特光照模型  这是漫反射光的值//  卡通颜色difLight = smoothstep(0, 1, difLight);  //  颜色平滑在【0,1】之间  //  颜色离散化float toon = floor(difLight * _Steps) / _Steps;  //  floor参数向下取整  目的:分几块difLight = lerp(difLight, toon, _ToonEffect);  //  lerp前两个值插值,第三个是权值fixed3 diffuse = _LightColor0.rgb * albedo * _Diffuse.rgb * difLight;  //  漫反射  //  边缘光float rim =1 - dot(i.worldNormal, worldViewDir);  //  坐标的世界法线与世界视角方向点积  越接近0说明越垂直,也就越接近边缘  1-改逻辑为越近边值越大fixed3 rimColor = _RimColor * pow(rim , 1/_RimPower);  //  pow取次方  rim是0到1,取次方放大影响return fixed4(ambient + diffuse + rimColor,1);}ENDCG}Pass//  画边  裁剪空间外拓{  Name "Outline"Cull Front  //  模型不画正面  防止与画图发生冲突CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"float _Outline;fixed4 _OutlineColor;struct v2f {float4 vertex : SV_POSITION;  //  顶点坐标};v2f vert(appdata_base v) {  //  顶点v2f o;o.vertex = UnityObjectToClipPos(v.vertex);  //  顶点信息从模型转到裁剪空间float3 normal = normalize(mul((float3x3)UNITY_MATRIX_IT_MV, v.normal));  //  模型法线转到视角坐标系,z值变成纯粹的深度float2 viewNormal = TransformViewToProjection(normal.xy);  //  把世界法线xy轴转到投影(Projection)  z值是深度就不要了o.vertex.xy = o.vertex + viewNormal * _Outline;  //  添加控制参数return o;}fixed4 frag(v2f i) : SV_Target{  //  片元return _OutlineColor;}ENDCG}}FallBack "Diffuse"  //  阴影}

unity shader遮挡边缘光描边相关推荐

  1. Unity Shader 卡通渲染 模型描边之退化四边形

    目录 前言 一.基于空间的边缘检测算法 二.退化四边形 三.Unity中的CommandBuffer和ComputeBuffer 四.构成描边的简单实例 五.模型描边的实现 前言 之前写了一篇< ...

  2. unity shader卡通渲染(描边)+阴影+多光源处理

    说道卡通渲染,应该都会想到描边: 我所学的描边有三种: 一种是计算边缘深度检测描边 一种是色差检测描边 一种是利用顶点法线向外扩展返回单色pass,使用正面裁剪 我用的第三种: pass {//剔除前 ...

  3. shader graph 边缘光效果

    要想物体有自发光效果那么久需要Fresnel Effect(菲尼尔)这个节点 我们创建一个常量来控制菲尼尔的强度值,就是自发光边缘轮廓的强度,最后给他乘以颜色就可以得到自己想要的自发光了.如果物体本身 ...

  4. unity shader 边缘光,内发光,外发光,轮廓边缘光,轮廓内边缘光,轮廓外边缘光

    先上一张图片,看下实际效果 1:黑色为模型主color 2:白色为内发光,轮廓内边缘光 3:红色为外发光,轮廓外边缘光 Shader "Unlit/边缘光" {Properties ...

  5. Unity Shader 卡通渲染 实时模型动画描边的研究

    前言 卡通渲染也叫非真实感渲染(英文简写:NPR),"描边"在图形学和数字图像里都叫边缘检测.因此你可以在很多文献网站上面找到很多这类文献,但最后我发现基于图形学使用的方式基本都是 ...

  6. Unity Shader - Simple Toon Shading - 简单卡通渲染

    文章目录 最终效果 - Final Effect 无光照,只有纹理与主色调 Shader 加描边 - Outline GIF Shader 添加光影 - RecieveShadow 自身接收阴影 Sh ...

  7. 【unity shader】unity游戏特效-遮挡显示效果 (含边缘光、描边效果版)

    不知道你们有没有在玩Black Squad这个游戏啊 在被对手干掉时会有敌人高亮显示效果 (未被做掉时) (被做掉后高亮显示敌人位置) 明明敌人被不透明物体挡住却仍然可以被渲染出来 这效果要是能扔进自 ...

  8. Unity Shader 表面着色器边缘光(Rim Lighting)二

    这一节我们要实现下面的效果 (图一) (图二) 首先针对图一我们创建一个材质,并把颜色改成红色的,然后我们就得到了一个很普通的红色小球. 我们只需要在鼠标进入的时候把材质的Shader换成带边缘光的S ...

  9. Unity Shader Graph 制作Rim Light边缘光效果

    效果图: 模型为Asset Store资源商店中免费资源Robot Kyle机器人 实现原理: 通过法线方向和视线方向的夹角来判断点是否处于边缘,从而给其增加边缘光,视线方向和法线方向垂直时,则该点在 ...

最新文章

  1. bmob php支付,基于Bmob在小程序端实现一键支付
  2. 自然语言处理NLP,如何使用AMBERT算法建立多粒度token预训练语言模型
  3. idea 提示vue插件_Vue + SpringBoot + MyBatis 音乐网站
  4. SAP标准工单入库时产生成本差异-求解进行时
  5. 总结】Android辅助功能(一)-AccessibilityEvent的分发
  6. 利用redis保存验证码并设置过期时间
  7. Bdsyn百度手机助手是何物,它是怎样神不知鬼不觉地安装到你的电脑里的?
  8. 试论述计算机辅助教学的特点,浅谈计算机辅助教学特点
  9. dijkstra java pre_Dijkstra算法实现
  10. 从零开始的服务器配置
  11. 谷歌医疗AI又有新进展:转移性乳腺癌检测准确率达99%
  12. 一个优秀的Android应用从建项目开始
  13. PyTorch源码解读之torch.utils.data.DataLoader
  14. xml转json的两种方法
  15. ALK/NH2/COOH/NHS/N3/hydrazide/maleimide/Tetrazine/DBCO/寡聚物等基团修饰BODIPY630/650氟硼荧
  16. Linux使用代理服务器上网
  17. 登顶多国免费榜,Zynga能否依靠超休闲游戏重回巨头行列
  18. Using the GNU Compiler Collection 目录翻译
  19. 读《如何有效阅读一本书:超实用笔记读书法》
  20. 计算机中各成绩所占成绩的比例计算方法,考研总成绩的计算方法和各科分数的比例占多少?...

热门文章

  1. 3款windows实用软件,免费又良心,真正懂你的需求
  2. 1291亿美元,当Zoom市值超过了IBM之后
  3. Authentication failed for解决方案
  4. 【增强学习在无人驾驶中的应用】
  5. 经典网络结构梳理:Resnet深度残差网络结构
  6. wap的全面解析!!
  7. android 知识管理工具,Thoughts app下载
  8. java音乐_java实现简单音乐播放器
  9. 在Scrapy中如何利用Xpath选择器从网页中采集目标数据——详细教程(下篇)
  10. pta数据结构130-133