边缘光shader

Shader "CM/RimLight" {
    Properties
	{
        _Color ("Main Color", Color) = (1,1,1,1)
        _MainTex ("Base (RGB)", 2D) = "white" {}
		_IlluminPower("Illumin Power", Range(0, 2)) = 1
        _RimColor ("Rim Color", Color) = (1, 1, 1, 1)
        _RimPower ("Rim Power", Float) = 0.7
    }
    SubShader
	{
        Pass
		{
       		Lighting Off
            CGPROGRAM

			#pragma vertex vert
			#pragma fragment frag
			#include "UnityCG.cginc"

			uniform sampler2D _MainTex;
			uniform fixed4 _Color;
			uniform float4 _MainTex_ST;
			float _IlluminPower;
			uniform fixed4 _RimColor;
			float _RimPower;

			struct appdata {
				float4 vertex : POSITION;
				float3 normal : NORMAL;
				float2 texcoord : TEXCOORD0;
			};

			struct v2f {
				float4 pos : SV_POSITION;
				float2 uv : TEXCOORD0;
				fixed3 color : COLOR;
			};

			v2f vert (appdata_base v)
			{
				v2f o;
				o.pos = mul (UNITY_MATRIX_MVP, v.vertex);

				float3 viewDir = normalize(ObjSpaceViewDir(v.vertex));
				float dotProduct = 1 - dot(v.normal, viewDir);

				o.color = _RimColor * pow(dotProduct, _RimPower);//smoothstep(1 - _RimPower, 1.0, dotProduct);

				o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
				return o;
			}

			fixed4 frag(v2f i) : COLOR
			{
				fixed4 texcol = tex2D(_MainTex, i.uv);
				texcol.rgb = texcol.rgb  * _Color.rgb * _IlluminPower + i.color;
				return texcol;
			}

            ENDCG
        }
    }
}

  

冰冻效果

二、使用cap texture:

Shader "CM/Rimlight2" {
    Properties
	{
        _Color ("Main Color", Color) = (1,1,1,1)
        _MainTex ("Base (RGB)", 2D) = "white" {}
		_IlluminPower("Illumin Power", Range(0, 2)) = 1

		_CapTex("Cap Tex (RGB)", 2D) = "white" {}
		_CapColor("Cap Color", Color) = (1,1,1,1)
		_CapIntensity("Cap Intensity", Range(0,3)) = 0
    }
    SubShader
	{
        Pass
		{
       		Lighting Off
            CGPROGRAM

			#pragma vertex vert
			#pragma fragment frag
			#include "UnityCG.cginc"

			uniform sampler2D _MainTex;
			uniform fixed4 _Color;
			uniform float4 _MainTex_ST;
			float _IlluminPower;

			float _CapIntensity;
			uniform sampler2D _CapTex;
			fixed4 _CapColor;

			struct appdata {
				float4 vertex : POSITION;
				float3 normal : NORMAL;
				float2 texcoord : TEXCOORD0;
			};

			struct v2f {
				float4 pos : SV_POSITION;
				float2 uv : TEXCOORD0;
				fixed2 cap : COLOR;
			};

			v2f vert (appdata_base v)
			{
				v2f o;
				o.pos = mul (UNITY_MATRIX_MVP, v.vertex);

				half2 capCoord;
				capCoord.x = dot(UNITY_MATRIX_IT_MV[0].xyz,v.normal);
				capCoord.y = dot(UNITY_MATRIX_IT_MV[1].xyz,v.normal);
				o.cap = capCoord * 0.5 + 0.5;

				o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
				return o;
			}

			fixed4 frag(v2f i) : COLOR
			{
				fixed4 texcol = tex2D(_MainTex, i.uv);
				fixed4 cap = tex2D(_CapTex, i.cap);

				texcol.rgb = texcol.rgb  * _Color.rgb * _IlluminPower + cap.rgb * _CapIntensity * _CapColor;
				return texcol;
			}

            ENDCG
        }
    }
}

 

 

三、在光照射方向上存在边缘光

Shader "CM/Rimlight3" {
    Properties
	{
        _Color ("Main Color", Color) = (1,1,1,1)
        _MainTex ("Base (RGB)", 2D) = "white" {}
		_IlluminPower("Illumin Power", Range(0, 2)) = 1
        _RimColor ("Rim Color", Color) = (0, 0.8, 0.8, 1)
        _RimPower ("Rim Power", Float) = 0.7
    }
    SubShader
	{
        Pass
		{
       		Lighting Off
            CGPROGRAM

			#pragma vertex vert
			#pragma fragment frag
			#include "UnityCG.cginc"

			uniform sampler2D _MainTex;
			uniform fixed4 _Color;
			uniform float4 _MainTex_ST;
			float _IlluminPower;
			uniform fixed4 _RimColor;
			float _RimPower;

			struct appdata {
				float4 vertex : POSITION;
				float3 normal : NORMAL;
				float2 texcoord : TEXCOORD0;
			};

			struct v2f {
				float4 pos : SV_POSITION;
				float2 uv : TEXCOORD0;
				fixed3 color : COLOR;
			};

			v2f vert (appdata_base v)
			{
				v2f o;
				o.pos = mul (UNITY_MATRIX_MVP, v.vertex);

				float3 viewDir = normalize(ObjSpaceViewDir(v.vertex));
				float dotRim = 1 - dot(v.normal, viewDir);
				float3 lightDir = normalize(ObjSpaceLightDir(v.vertex));
				float dotDiff = dot(v.normal, lightDir);

				o.color = _RimColor * pow(dotRim, _RimPower) * dotDiff;

				o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
				return o;
			}

			fixed4 frag(v2f i) : COLOR
			{
				fixed4 texcol = tex2D(_MainTex, i.uv);
				texcol.rgb = texcol.rgb  * _Color.rgb * _IlluminPower + i.color;
				return texcol;
			}

            ENDCG
        }
    }
}

  

四、在光照射方向上产生边缘光  ----------------- 使用matcap 贴图  (shader 依然用上面的rimlight2), 只需要替换matcap贴图 即可:

时间: 2025-01-01 21:31:52

边缘光shader的相关文章

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

本系列文章由@浅墨_毛星云 出品,转载请注明出处.   文章链接:http://blog.csdn.net/poem_qianmo/article/details/51764028 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 本文工程使用的Unity3D版本: 5.2.1  这篇文章主要讲解了如何在Unity3D中分别使用Surface Shader和Vertex & Fragment Shader来编写边缘发光Shader. 一.最终实现的效果

Rim 边缘光

边缘光:计算眼睛和模型顶点法线的点积,结果作为强度,和材质输出:顶点和法线平行时,强度最大,垂直时,强度最小.因此将他取反,即同一方向时,强度最小,垂直时,强度最大. float rim= 1-dot(normalize(viewDirection),normalDirection); 源代码: 1 Shader "JQM/Rim_1" 2 { 3 Properties 4 { 5 _Color("Color", color) = (1.0,1.0,1.0,1.0)

Unity3D 边缘高光Shader

Shader "Custom/NewShader" { Properties { _MainTex ("Base (RGB)", 2D) = "white" {} _RimColor("Rim Color", Color) = (1,1,1,1) _RimPower ("Rim power",range(0,5)) = 2//边缘强度 } SubShader { Pass { CGPROGRAM #incl

unity shader笔记

clip函数可以用来切割mesh clip(var); var 的值小于0时就会被切割 表面着色器 其实就是生成了定点片元着色器,相当于一种包装和简化吧 标准的填充结构 struct SurfaceOutput { fixed3 Albedo; // diffuse color fixed3 Normal; // tangent space normal, if written fixed3 Emission; half Specular; // specular power in 0..1 r

【浅墨Unity3D Shader编程】之七 静谧之秋篇: 表面着色器的写法(二)——自定义光照模式

本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://hpw123.net/plus/view.php?aid=183 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 邮箱: [email protected] QQ交流群:330595914 更多文章尽在:http://www.hpw123.net 本文主要讲解了Unity中SurfaceShader的自定义光照模式的写法. 上篇文章中我们已经说到,表面着色器将分为两次讲解,上

Unity3D游戏开发从零单排(九) - 进击的Shader

提要 今天要学习的是一些Shader 的例子,从简单到难.Let's go. 一大波例子来袭 还是用上一篇用到的工程.点我下载 红色的螃蟹 Test1.shader Shader "Custom/Test1" { SubShader { Tags { "RenderType" = "Opaque" } CGPROGRAM #pragma surface surf Lambert struct Input { float4 color : COLO

Unity Shader实现描边效果

http://gad.qq.com/article/detail/28346 描边效果是游戏里面非常常用的一种效果,一般是为了凸显游戏中的某个对象,会给对象增加一个描边效果.本篇文章和大家介绍下利用Shader实现描边效果,一起来看看吧. 最近又跑回去玩了玩<剑灵>,虽然出了三年了,感觉在现在的网游里面画面仍然算很好的了,剑灵里面走近或者选中NPC的一瞬间,NPC就会出现描边效果,不过这个描边效果是渐变的,会很快减弱最后消失(抓了好久才抓住一张图....) 还有就是最常见的LOL中的塔,我们把

Unity3d shader之卡通着色Toon Shading

卡通着色的目的是为了让被着色物体显得过渡的不那么好,明暗交界线很明显,等等卡通风格的一系列特征, 也叫Non-photorealisticrendering非真实渲染 重点要做到两点: 1.    描边 2.    着色 另:本片中cg函数均用绿色标明,想了解函数作用和函数内部构成请看这篇文章NVIDIA CG语言 函数之所有数学类函数(Mathematical Functions) 就从最初的描边开始 首先声明变量_Outline挤出描边的粗细_Factor挤出多远 Properties {

【OpenGL】Dota2 Shader分析(1)

转发,请保持地址:http://blog.csdn.net/stalendp/article/details/50953869 最近在总结OpenGL知识,想到了以前搜索到Dota2相关的文章:<Dota2-Character Shader Masks Guide>,而且dota2的模型在网上也可以下载到,所以非常值得用来作为光照相关知识的总结.我用Ogre模型做实验,效果如下: 这个Shader只是为了总结shader的知识点,对于实现可能比较粗糙了点,所以见谅. 我准备分两部分来讲这个Sh