Unity Shader-边缘光(RimLight)效果

unity物体边缘发光shader_Unity的shader学习:实现物体边缘高亮 游戏里常出现的一种需求,就是鼠标触碰到角色或物体时高亮。正在学习unity的shader,看官方的shader示例,其中有一个就是Rim Lighting,但是官方示例那个模型并没有把这个效果凸显出来,然后查了下Rim Lighting,看到了这个例子,才明白是物体边缘高亮的效果,联想到玩的游戏,瞬间明白了。这也算是个挺有用的效果,所以细心研究了下,而且发现官方示例和上面这个博客都没有提到为什么这... 阅读详情

简介


写了两篇简单光照模型的shader的文章,虽然Unity自带的shader就有diffuse和specular,效果还比自己写的好,然而要想学好shader,基础还是很重要的。不然到网上到处找shader,扔到项目里,能用就好,完全不看性能的话,迟早会出事的。今天不看光照模型了,物理渲染还没搞懂,所以只好先来个简单的shader玩一玩。正好最近在和某基友玩黑魂,这货一出来总是自带一个特效-边缘光。于是本人强迫症发作,决定研究一下这个怎么实现。



RimLight--边缘发光效果,是一个比较常用的效果,实现简单,在普通的光照计算后只需要两步操作,就可以实现边缘光效果。看下面一幅图,简单介绍一下RimLight的原理:

所谓RimLight边缘发光,也就是说对应我们当前视角方向,物体上位于边缘的地方额外加一个光的效果。那么,怎么判断一个点是否在物体的边缘呢?就是通过法线方向和视线方向的夹角来判断。当视线方向V与法线方向N垂直时,这个法线对应的面就与视线方向平行,说明当前这个点对于当前视角来说,就处在边缘;而视线方向与法线方向一致时,这个法线对应的面就垂直于视线方向,说明当前是直视这个面。所以,我们就可以根据dot(N,V)来获得视线方向与法线方向的余弦值,通过这个值来区分该像素是否处在边缘,进而判断是否需要增加以及增加边缘光的强弱。


边缘光效果Unity下的实现


上面已经说完了边缘光效果的实现原理,下面附上完整的边缘光效果shader,基于之前介绍过的 兰伯特光照模型,增加了边缘光效果:
//边缘发光Shader
//by:puppet_master
//2016.12.11

Shader "ApcShader/RimLight"
{
	//属性
	Properties{
		_Diffuse("Diffuse", Color) = (1,1,1,1)
		_RimColor("RimColor", Color) = (1,1,1,1)
		_RimPower("RimPower", Range(0.000001, 3.0)) = 0.1
		_MainTex("Base 2D", 2D) = "white"{}
	}

	//子着色器	
	SubShader
	{
		Pass
		{
			//定义Tags
			Tags{ "RenderType" = "Opaque" }

			CGPROGRAM
			//引入头文件
			#include "Lighting.cginc"
			//定义Properties中的变量
			fixed4 _Diffuse;
			sampler2D _MainTex;
			//使用了TRANSFROM_TEX宏就需要定义XXX_ST
			float4 _MainTex_ST;
			fixed4 _RimColor;
			float _RimPower;

			//定义结构体:vertex shader阶段输出的内容
			struct v2f
			{
				float4 pos : SV_POSITION;
				float3 worldNormal : TEXCOORD0;
				float2 uv : TEXCOORD1;
				//在vertex shader中计算观察方向传递给fragment shader
				float3 worldViewDir : TEXCOORD2;
			};

			//定义顶点shader,参数直接使用appdata_base(包含position, noramal, texcoord)
			v2f vert(appdata_base v)
			{
				v2f o;
				o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
				//通过TRANSFORM_TEX宏转化纹理坐标,主要处理了Offset和Tiling的改变,默认时等同于o.uv = v.texcoord.xy;
				o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
				o.worldNormal = mul(v.normal, (float3x3)_World2Object);
				//顶点转化到世界空间
				float3 worldPos = mul(_Object2World, v.vertex).xyz;
				//可以把计算计算ViewDir的操作放在vertex shader阶段,毕竟逐顶点计算比较省
				o.worldViewDir = _WorldSpaceCameraPos.xyz - worldPos;
				return o;
			}

			//定义片元shader
			fixed4 frag(v2f i) : SV_Target
			{
				//unity自身的diffuse也是带了环境光,这里我们也增加一下环境光
				fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz * _Diffuse.xyz;
				//归一化法线,即使在vert归一化也不行,从vert到frag阶段有差值处理,传入的法线方向并不是vertex shader直接传出的
				fixed3 worldNormal = normalize(i.worldNormal);
				//把光照方向归一化
				fixed3 worldLightDir = normalize(_WorldSpaceLightPos0.xyz);
				//根据半兰伯特模型计算像素的光照信息
				fixed3 lambert = 0.5 * dot(worldNormal, worldLightDir) + 0.5;
				//最终输出颜色为lambert光强*材质diffuse颜色*光颜色
				fixed3 diffuse = lambert * _Diffuse.xyz * _LightColor0.xyz + ambient;
				//进行纹理采样
				fixed4 color = tex2D(_MainTex, i.uv);
				
				//以下为本篇主题:计算RimLight
				//把视线方向归一化
				float3 worldViewDir = normalize(i.worldViewDir);
				//计算视线方向与法线方向的夹角,夹角越大,dot值越接近0,说明视线方向越偏离该点,也就是平视,该点越接近边缘
				float rim = 1 - max(0, dot(worldViewDir, worldNormal));
				//计算rimLight
				fixed3 rimColor = _RimColor * pow(rim, 1 / _RimPower);
				//输出颜色+边缘光颜色
				color.rgb = color.rgb* diffuse + rimColor;
				
				return fixed4(color);
			}

			//使用vert函数和frag函数
			#pragma vertex vert
			#pragma fragment frag	

			ENDCG
		}
	}
	//前面的Shader失效的话,使用默认的Diffuse
	FallBack "Diffuse"
}
下面看一下加了边缘光后的效果,普通diffuse shader:

白色边缘光效果:

黄色边缘光效果:

增加 景深效果和 Bloom效果,Bloom可以把亮的部分处理得更亮,有一种光线溢出的效果,而景深效果可以突出我们要表现的重点。唉,最近发现自己身陷后处理不能自拔啊....


通过Mask图控制边缘光


我们把边缘光效果加大到一定程度,就快成了自发光效果,但是上面的shader有个问题,就是全身都会自发光。如下图所示:
如果只希望盔甲部分有自发光效果,而其他部分没有自发光,我们就需要用Mask图来控制了,我们用一张Alpha8的灰度图来控制是否开启边缘光效果,将上面的shader简单修改一下,增加Mask图的通道:
//边缘发光Shader
//by:puppet_master
//2016.12.11

Shader "ApcShader/RimLight"
{
	//属性
	Properties{
		_Diffuse("Diffuse", Color) = (1,1,1,1)
		_RimColor("RimColor", Color) = (1,1,1,1)
		_RimPower("RimPower", Range(0.000001, 20.0)) = 0.1
		_RimMask("RimMask", 2D) = "white"{}
		_MainTex("Base 2D", 2D) = "white"{}
	}

	//子着色器	
	SubShader
	{
		Pass
		{
			//定义Tags
			Tags{ "RenderType" = "Opaque" }

			CGPROGRAM
			//引入头文件
			#include "Lighting.cginc"
			//定义Properties中的变量
			fixed4 _Diffuse;
			sampler2D _MainTex;
			//使用了TRANSFROM_TEX宏就需要定义XXX_ST
			float4 _MainTex_ST;
			sampler2D _RimMask;
			fixed4 _RimColor;
			float _RimPower;

			//定义结构体:vertex shader阶段输出的内容
			struct v2f
			{
				float4 pos : SV_POSITION;
				float3 worldNormal : TEXCOORD0;
				float2 uv : TEXCOORD1;
				//在vertex shader中计算观察方向传递给fragment shader
				float3 worldViewDir : TEXCOORD2;
			};

			//定义顶点shader,参数直接使用appdata_base(包含position, noramal, texcoord)
			v2f vert(appdata_base v)
			{
				v2f o;
				o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
				//通过TRANSFORM_TEX宏转化纹理坐标,主要处理了Offset和Tiling的改变,默认时等同于o.uv = v.texcoord.xy;
				o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
				o.worldNormal = mul(v.normal, (float3x3)_World2Object);
				//顶点转化到世界空间
				float3 worldPos = mul(_Object2World, v.vertex).xyz;
				//可以把计算计算ViewDir的操作放在vertex shader阶段,毕竟逐顶点计算比较省
				o.worldViewDir = _WorldSpaceCameraPos.xyz - worldPos;
				return o;
			}

			//定义片元shader
			fixed4 frag(v2f i) : SV_Target
			{
				//unity自身的diffuse也是带了环境光,这里我们也增加一下环境光
				fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz * _Diffuse.xyz;
				//归一化法线,即使在vert归一化也不行,从vert到frag阶段有差值处理,传入的法线方向并不是vertex shader直接传出的
				fixed3 worldNormal = normalize(i.worldNormal);
				//把光照方向归一化
				fixed3 worldLightDir = normalize(_WorldSpaceLightPos0.xyz);
				//根据半兰伯特模型计算像素的光照信息
				fixed3 lambert = 0.5 * dot(worldNormal, worldLightDir) + 0.5;
				//最终输出颜色为lambert光强*材质diffuse颜色*光颜色
				fixed3 diffuse = lambert * _Diffuse.xyz * _LightColor0.xyz + ambient;
				//进行纹理采样
				fixed4 color = tex2D(_MainTex, i.uv);
				
				//以下为本篇主题:计算RimLight
				//把视线方向归一化
				float3 worldViewDir = normalize(i.worldViewDir);
				//计算视线方向与法线方向的夹角,夹角越大,dot值越接近0,说明视线方向越偏离该点,也就是平视,该点越接近边缘
				float rim = 1 - max(0, dot(worldViewDir, worldNormal));
				//计算RimLight
				fixed3 rimColor = _RimColor * pow(rim, 1 / _RimPower);
				//通过RimMask控制是否有边缘光,Rim目前存在一张Alpha8类型的图片中
				fixed rimMask = tex2D(_RimMask, i.uv).a;
				//输出颜色+边缘光颜色
				color.rgb = color.rgb* diffuse + rimColor * (1 - rimMask);
				
				return fixed4(color);
			}

			//使用vert函数和frag函数
			#pragma vertex vert
			#pragma fragment frag	

			ENDCG
		}
	}
	//前面的Shader失效的话,使用默认的Diffuse
	FallBack "Diffuse"
}
我们把下面这张自发光Mask图赋给材质:

通过采样这张Mask就能控制那部分开启自发光,那部分关闭自发光了:

调整Mask图,也可以得到一些比较好玩的效果:


动态RimLight效果


看了一篇博文,其中的边缘光使用了一张动态图,达到了流动的效果,感谢 作者的无私分享,于是我也尝试一下动态RimLight的效果。其实思路跟上面的Mask图一样,只不过这次改成一张扫面线类型的纹理,然后通过这张纹理的采样滚动,达到动态的效果。一提到动态效果,我们第一个想到的应该就是_Time向量,这个向量中几个值都是跟时间相关的,我们如果做动态效果,肯定少不了和这个变量打交道,关于_Time及其变种,可以参考 这篇文章,我们这里用_Time.y就可以获得时间了。
我们用一张Mask纹理,白色代表有边缘光,黑色无边缘光,通过采样这张Mask纹理,控制模型上显示边缘光的部分:

动态RimLight的shader如下:
//边缘发光Shader
//by:puppet_master
//2016.12.11

Shader "ApcShader/RimLight"
{
	//属性
	Properties{
		_Diffuse("Diffuse", Color) = (1,1,1,1)
		_RimColor("RimColor", Color) = (1,1,1,1)
		_RimPower("RimPower", Range(0.000001, 20.0)) = 0.1
		_RimMask("RimMask", 2D) = "white"{}
		_MainTex("Base 2D", 2D) = "white"{}
		_RimSpeed("RimSpeed", Range(-10, 10)) = 1.0
	}

	//子着色器	
	SubShader
	{
		Pass
		{
			//定义Tags
			Tags{ "RenderType" = "Opaque" }

			CGPROGRAM
			//引入头文件
			#include "Lighting.cginc"
			//定义Properties中的变量
			fixed4 _Diffuse;
			sampler2D _MainTex;
			//使用了TRANSFROM_TEX宏就需要定义XXX_ST
			float4 _MainTex_ST;
			sampler2D _RimMask;
			fixed4 _RimColor;
			float _RimPower;
			float _RimSpeed;

			//定义结构体:vertex shader阶段输出的内容
			struct v2f
			{
				float4 pos : SV_POSITION;
				float3 worldNormal : TEXCOORD0;
				float2 uv : TEXCOORD1;
				//在vertex shader中计算观察方向传递给fragment shader
				float3 worldViewDir : TEXCOORD2;
			};

			//定义顶点shader,参数直接使用appdata_base(包含position, noramal, texcoord)
			v2f vert(appdata_base v)
			{
				v2f o;
				o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
				//通过TRANSFORM_TEX宏转化纹理坐标,主要处理了Offset和Tiling的改变,默认时等同于o.uv = v.texcoord.xy;
				o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
				o.worldNormal = mul(v.normal, (float3x3)_World2Object);
				//顶点转化到世界空间
				float3 worldPos = mul(_Object2World, v.vertex).xyz;
				//可以把计算计算ViewDir的操作放在vertex shader阶段,毕竟逐顶点计算比较省
				o.worldViewDir = _WorldSpaceCameraPos.xyz - worldPos;
				return o;
			}

			//定义片元shader
			fixed4 frag(v2f i) : SV_Target
			{
				//unity自身的diffuse也是带了环境光,这里我们也增加一下环境光
				fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz * _Diffuse.xyz;
				//归一化法线,即使在vert归一化也不行,从vert到frag阶段有差值处理,传入的法线方向并不是vertex shader直接传出的
				fixed3 worldNormal = normalize(i.worldNormal);
				//把光照方向归一化
				fixed3 worldLightDir = normalize(_WorldSpaceLightPos0.xyz);
				//根据半兰伯特模型计算像素的光照信息
				fixed3 lambert = 0.5 * dot(worldNormal, worldLightDir) + 0.5;
				//最终输出颜色为lambert光强*材质diffuse颜色*光颜色
				fixed3 diffuse = lambert * _Diffuse.xyz * _LightColor0.xyz + ambient;
				//进行纹理采样
				fixed4 color = tex2D(_MainTex, i.uv);
				
				//以下为本篇主题:计算RimLight
				//把视线方向归一化
				float3 worldViewDir = normalize(i.worldViewDir);
				//计算视线方向与法线方向的夹角,夹角越大,dot值越接近0,说明视线方向越偏离该点,也就是平视,该点越接近边缘
				float rim = 1 - max(0, dot(worldViewDir, worldNormal));
				//计算RimLight
				fixed3 rimColor = _RimColor * pow(rim, 1 / _RimPower);
				//通过RimMask控制是否有边缘光,Rim目前存在一张Alpha8类型的图片中
				fixed rimMask = tex2D(_RimMask, i.uv + float2(0 , _Time.y * _RimSpeed)).r;
				//输出颜色+边缘光颜色
				color.rgb = color.rgb* diffuse + rimColor * (1-rimMask);
				
				return fixed4(color);
			}

			//使用vert函数和frag函数
			#pragma vertex vert
			#pragma fragment frag	

			ENDCG
		}
	}
	//前面的Shader失效的话,使用默认的Diffuse
	FallBack "Diffuse"
}
来一张Gif截图(旁边好像有什么抢镜了):



Unity Shader中可用的变量类型整理


在传递参数时总是忘了能传递哪些类型的参数,记录一下,方便以后查找,这种东西也没必要死记硬背下来,需要的时候几秒钟之内能找到就好了。
//Float类型,下面对应变量可以用flaot,half,fixed
_Name("Inspector Name", Float) = defaultValue
//Float类型,可以用一个滑动条控制范围,下面对应变量可以用float,half,fixed
_Name("Inspector Name", Range(min, max)) = defaultValue
//颜色类型,下面对应变量可以用float4,half4,fixed4,如果是颜色,尽量fixed4
_Name("Inspector Name", Color) = (defaultValue.r, defaultValue.g, defaultValue.b, defaultValue.a)
//2D纹理类型,默认纹理可以为空,白,黑,灰,凹凸,下面对应变量sampler2D
_Name("Inspector Name", 2D) = "" / "white" / "black" / "gray" / "bump"{options}
//长方形纹理,非2次方大小的纹理,其同上
_Name("Inspector Name", Rect) = "" / "white" / "black" / "gray" / "bump"{options}
//立方体贴图CubeMap
_Name("Inspector Name", Cube) = "" {options}
//传递一个Vector4向量
_Name("Inspector Name", Vector) = (defaultValue.x, defaultValue.y, defaultValue.z, defaultValue.w)

//注:上面纹理后面{}里面是一些纹理TexGen,LightmapMode光照模式等内容












unity物体边缘发光shader_Shaderlab Notizen 15 Rim Shader(边缘发光)的两种实现形态 一、实现思路在正常的漫反射Shader的基础之上,在最终的漫反射颜色值出来之后,再准备一个自发光颜色值,附加上去,即得到了最终的带自发光的颜色值。公式表达:最终颜色 = (漫反射系数 x 纹理颜色 x RGB颜色)+自发光颜色英文公式:FinalColor=(Diffuse x Texture x RGBColor)+Emissive二、Surface Shader版边缘发光Shader源码如下:... 阅读详情

相关推荐

Unity之ShaderGraph如何实现边缘光效果

游戏中最常用的一个效果就是边缘光了,既可以做物体的高亮效果,也可以给人物皮肤表面添加光泽。

TxNet 1831

Unity3D Shader系列之边缘光RimLight

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

老王的博客 7936

2023西工大NOJ (C语言版) 完结!!!

代码均可AC,不含解析。

annesede的博客 8万+

Unity用Shader实现边缘光效果

shader实现边缘光unity

qq_45879862的博客 2375

Intel网卡固件烧录实战:eeupdate与bootutil命令完全解析

固件作为硬件设备底层运行的软件,其稳定性直接决定硬件功能的完整性。网卡固件一旦损坏,常表现为MAC地址丢失、PXE启动失效、NVM数据异常导致降速或掉线。维护这类问题,需借助Intel官方工具eeupdate与bootutil在UEFI Shell或DOS环境下执行底层烧录操作。eeupdate负责网卡的身份信息与NVM存储管理,可重置MAC、恢复固件镜像;bootutil则专管启动行为,支持PXE配置与Boot Agent升级。从环境准备、命令参数到故障恢复,掌握这两款工具能让运维人员在修复存量网卡、应对

weixin_34269583的博客 312

WorkBuddy Skill赋能HYSYS与Comsol:AI工作台下的仿真自动化实践

AI Agent正将工业软件自动化带向新高度。在工程仿真领域,流程模拟与多物理场分析常因重复性操作而效率低下,Aspen HYSYS的批量工况调整、Comsol的参数扫描与网格重构均属此类。WorkBuddy这类AI工作台通过Skill将软件二次开发能力封装为可插拔技能包,利用HYSYS的COM/OLE接口和Comsol的Java API,实现自然语言指令到自动化执行的转变。其技术价值在于降低自动化门槛、沉淀工程经验,并支持日志审计与异常重试。在实际应用中,无论化工流程的灵敏度分析,还是激光焊接、移动网格等

weixin_29055699的博客 296

Unity Shader unity文档学习笔记(八):边缘光(RimLight)效果

忘记dot的意思可以点这个 Shader "Unlit/outLine" { //属性 Properties{ _RimColor("RimColor", Color) = (1,1,1,1) _RimPower("RimPower", Range(1.0, 5.0)) = 1 } //子着色器 SubShader { Pass { //定义Tags Tags{ "RenderType" = "Opaque" } CGPROGRAM //引

qq_43204246的博客 490

wpa_supplicant EAPOL状态机分析

wpa_supplicant EAPOL状态机分析

加油鸭 1476

Unity Shader学习:RimLight边缘光

Unity Shader学习:RimLight边缘光 依旧是模仿实现,这次的边缘光比较简单,也稍微简化了一下计算的方法,区别几乎不大,大家可以选择合适的使用。 RimLight边缘光主要思路:法线和视角向量的点积越小,证明两向量夹角越大,说明在边缘处,如果夹角小,则说明是正对相机,所以没有边缘发光。 shader代码:(在半兰伯特漫反射上增加边缘光) //边缘光shader Shader "Cus...

咪咪博客 1629

Robocopy 参数进阶:/MIR 镜像同步与 /PURGE 删除操作的风险规避指南

本文深入解析Robocopy的/MIR镜像同步与/PURGE删除操作的高级用法及风险规避策略。通过实际案例和四重防护机制,指导用户安全实现目录同步,避免数据丢失风险,特别适用于远程主机间的数据复制与备份场景。

weixin_33462927的博客 355

Edge主页被2345劫持?手动清理注册表与组策略的完整方案

浏览器主页劫持是Windows系统中常见的恶意篡改行为,其原理是通过修改注册表、快捷方式、组策略等多处系统配置,强制锁定浏览器启动页。这类劫持不仅影响上网体验,还可能带来隐私泄露和恶意软件感染风险。在安全防护与系统优化场景中,掌握手动清理主页劫持的技能至关重要。本文针对Edge主页被2345导航劫持的问题,深入解析劫持入口,提供从快捷方式、注册表到组策略的逐层清理步骤,并给出防复发策略,帮助用户彻底摆脱顽固劫持。

weixin_30582943的博客 380

Rimlight 项目推荐

Rimlight 项目推荐 项目基础介绍和主要编程语言 Rimlight 是一个为 Unity 引擎开发的定制化边缘光(Rimlight)着色器项目。该项目主要使用 C#、HLSL、ShaderLab 和 GLSL 等编程语言。通过这些语言,开发者可以创建出具有高度自定义功能的边缘光效果,适用于各种游戏和虚拟现实场景。 项目核心功能 Rimlight 项目的主要功能包括: 自定义边缘光效果:开发...

gitblog_00922的博客 747

中图法第五版SQL,支持树形结构可直接导入使用

基于第五版中图法官方数据收集整理,效果图如下:

cloudin_adin的博客 978

边缘发光材质unity_Unity边缘光shader

shader脚本新建一个shader脚本,命名为RimLightshader代码如下Shader "CM/RimLight" {Properties{_Color ("Main Color", Color) = (1,1,1,1)_MainTex ("Base (RGB)", 2D) = "white" {}_IlluminPower("Illumin Power", Range(0, 2)) =...

weixin_36211941的博客 742

Unity必学:Protobuf-net预编译实战

本文深入解析Unity项目使用Protobuf-net Precompile的必要性。作为高效跨平台序列化方案,Protobuf-net解决了Unity工程在网络同步、存档系统中的性能瓶颈,特别是针对iOS等AOT平台的兼容问题。通过预编译模式,将运行时反射转为静态代码生成,显著提升移动端性能表现,支持协议平滑升级,已成为大厂项目的标配方案。文章从原理、实践到多平台适配,全面展示了这一"序列化发动机"如何支撑现代Unity项目的数据传输需求。

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 494

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

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的专栏 2596

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

边缘光+流光

自发光和流光合体

Mq110m的博客 356

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Unity商业shader开发之高光RimColor,RimLight关键代码解析

原理 puppert大神已经说的很清楚了,而关键还是viewDir Unity Shader-边缘光(RimLight)效果_puppet_master的专栏-优快云博客 代码一 #ifdef RIMLIGHT half rim = 1-saturate(dot(i.viewDir, i.normal)); c.rgb += saturate(_RimColor.rgb * pow(rim, _LightArgs.w)); #endif//RIMLIGHT 代码二 //计算视线方向与法

大话程序员 1306

用UCTS还原《原神》角色材质?卡通渲染Shader的进阶参数详解

本文详细解析如何利用Unity Chan Toon Shader(UCTS)复刻《原神》标志性卡通渲染材质效果。从阴影分层、高光控制到轮廓光处理,提供参数配置对照表和Shader代码示例,帮助技术美术师掌握进阶卡通渲染技巧,实现高质量二次元角色表现。

weixin_29009339的博客 168

给物体边缘加高光轮廓的办法

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

menuconfig的专栏 2633

unity 给物体边缘加高光轮廓的办法,付Demo(增加一组算法)

原文链接:http://dong2008hong.blog.163.com/blog/static/469688272013113052146887/ 1.边缘光方法(Rim Light): Unity官方教程里有例子,其中核心是这两句代码:   half rim = 1.0 - saturate(dot (normalize(IN.viewDir), IN.worldNorm

LisenYang的专栏 6535

Unity3d 描边shader详解

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.wor

苗伟业的专栏 6808
上一篇: 渲染到纹理(Render To Texture, RTT)详解
下一篇: Unity Shader-法线贴图(Normal)及其原理
puppet_master
puppet_master 领域专家: C/C++技术领域 领域专家: C/C++技术领域
博客等级 码龄12年 2695粉丝 161原创
评论 8
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值