unity shader遮挡边缘光描边
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遮挡边缘光描边相关推荐
- Unity Shader 卡通渲染 模型描边之退化四边形
目录 前言 一.基于空间的边缘检测算法 二.退化四边形 三.Unity中的CommandBuffer和ComputeBuffer 四.构成描边的简单实例 五.模型描边的实现 前言 之前写了一篇< ...
- unity shader卡通渲染(描边)+阴影+多光源处理
说道卡通渲染,应该都会想到描边: 我所学的描边有三种: 一种是计算边缘深度检测描边 一种是色差检测描边 一种是利用顶点法线向外扩展返回单色pass,使用正面裁剪 我用的第三种: pass {//剔除前 ...
- shader graph 边缘光效果
要想物体有自发光效果那么久需要Fresnel Effect(菲尼尔)这个节点 我们创建一个常量来控制菲尼尔的强度值,就是自发光边缘轮廓的强度,最后给他乘以颜色就可以得到自己想要的自发光了.如果物体本身 ...
- unity shader 边缘光,内发光,外发光,轮廓边缘光,轮廓内边缘光,轮廓外边缘光
先上一张图片,看下实际效果 1:黑色为模型主color 2:白色为内发光,轮廓内边缘光 3:红色为外发光,轮廓外边缘光 Shader "Unlit/边缘光" {Properties ...
- Unity Shader 卡通渲染 实时模型动画描边的研究
前言 卡通渲染也叫非真实感渲染(英文简写:NPR),"描边"在图形学和数字图像里都叫边缘检测.因此你可以在很多文献网站上面找到很多这类文献,但最后我发现基于图形学使用的方式基本都是 ...
- Unity Shader - Simple Toon Shading - 简单卡通渲染
文章目录 最终效果 - Final Effect 无光照,只有纹理与主色调 Shader 加描边 - Outline GIF Shader 添加光影 - RecieveShadow 自身接收阴影 Sh ...
- 【unity shader】unity游戏特效-遮挡显示效果 (含边缘光、描边效果版)
不知道你们有没有在玩Black Squad这个游戏啊 在被对手干掉时会有敌人高亮显示效果 (未被做掉时) (被做掉后高亮显示敌人位置) 明明敌人被不透明物体挡住却仍然可以被渲染出来 这效果要是能扔进自 ...
- Unity Shader 表面着色器边缘光(Rim Lighting)二
这一节我们要实现下面的效果 (图一) (图二) 首先针对图一我们创建一个材质,并把颜色改成红色的,然后我们就得到了一个很普通的红色小球. 我们只需要在鼠标进入的时候把材质的Shader换成带边缘光的S ...
- Unity Shader Graph 制作Rim Light边缘光效果
效果图: 模型为Asset Store资源商店中免费资源Robot Kyle机器人 实现原理: 通过法线方向和视线方向的夹角来判断点是否处于边缘,从而给其增加边缘光,视线方向和法线方向垂直时,则该点在 ...
最新文章
- bmob php支付,基于Bmob在小程序端实现一键支付
- 自然语言处理NLP,如何使用AMBERT算法建立多粒度token预训练语言模型
- idea 提示vue插件_Vue + SpringBoot + MyBatis 音乐网站
- SAP标准工单入库时产生成本差异-求解进行时
- 总结】Android辅助功能(一)-AccessibilityEvent的分发
- 利用redis保存验证码并设置过期时间
- Bdsyn百度手机助手是何物,它是怎样神不知鬼不觉地安装到你的电脑里的?
- 试论述计算机辅助教学的特点,浅谈计算机辅助教学特点
- dijkstra java pre_Dijkstra算法实现
- 从零开始的服务器配置
- 谷歌医疗AI又有新进展:转移性乳腺癌检测准确率达99%
- 一个优秀的Android应用从建项目开始
- PyTorch源码解读之torch.utils.data.DataLoader
- xml转json的两种方法
- ALK/NH2/COOH/NHS/N3/hydrazide/maleimide/Tetrazine/DBCO/寡聚物等基团修饰BODIPY630/650氟硼荧
- Linux使用代理服务器上网
- 登顶多国免费榜,Zynga能否依靠超休闲游戏重回巨头行列
- Using the GNU Compiler Collection 目录翻译
- 读《如何有效阅读一本书:超实用笔记读书法》
- 计算机中各成绩所占成绩的比例计算方法,考研总成绩的计算方法和各科分数的比例占多少?...