<shader>一个简单的边缘发光的例子(vf 语法)

 

Shader "Custom/BasicRimShader001"
{
	Properties{
		//主颜色
		_MainColor("MainColor",color) = (0.5,0.5,0.5,1)

		//漫反射纹理
		_TextureDiffuse("Texture Diffuse",2D) = "white" {}

		//边缘发光的颜色
		_RimColor("Rim color:",color) = (0.2,1,1,1)

		//边缘光的强度
		_RimColorPower("RimColor Power",Range(0.0,36.0)) = 0.1

		//边缘发光强度系数
		_RimIntensity("Rim Intensity",Range(0.0,100.0)) = 3
	}
	SubShader{
		//渲染类型为Opaque,不透明 || RenderType Opaque
		Tags
		{
			"RenderType" = "Opaque"
		}

		pass{

			//设置通道名称 
			Name "ForwardBase"

			//设置光照的模式
			Tags{
				"LightMode" = "ForwardBase"
			}

			CGPROGRAM


			#pragma vertex vert
			#pragma fragment frag

			//包含的头文件
			#include "AutoLight.cginc"
			#include "UnityCG.cginc"

			 float4 _MainColor;
			 float4 _LightColor0;
			 float4 _RimColor;
			 float4 _TextureDiffuse_ST;
			 float _RimColorPower;
			 float _RimIntensity; 
			 sampler2D _TextureDiffuse;

			//定数输入的结构
			struct VertexInput{
				float4 vertex : POSITION;
				float3 normal : NORMAL;
				float4 texcoord : TEXCOORD0; //设置一级纹理信息
			};

			//设置顶点输出的结构
			struct VertexOutput{
				//像素位置 
				float4 pos:SV_POSITION;

				//一级纹理
				float4 texcoord : TEXCOORD0;

				//法向量
				float3 normal:NORMAL;

				//世界空间的坐标
				float4 worldPos : TEXCOORD1;

				//创制光源坐标,用于内置的光照
				LIGHTING_COORDS(3,4)
			};

			//顶点着色气
			VertexOutput vert(VertexInput Input){

				VertexOutput OutPut;

				OutPut.pos = mul(UNITY_MATRIX_MVP,Input.vertex);
				OutPut.texcoord = Input.texcoord;

				//法线要在世界坐标系的位置
				OutPut.normal = mul(float4(Input.normal,1.0), unity_WorldToObject) .xyz;

				//获取顶点在世界坐标中的位置
				OutPut.worldPos = mul(unity_ObjectToWorld,Input.vertex);

				return OutPut;
			}

			//片段着色气
			float4 frag(VertexOutput i) : COLOR{
				//视角的方向
				float3 ViewDirection = normalize(_WorldSpaceCameraPos.xyz - i.worldPos.xyz);

				// 法线的方向
				float NormalDirection = normalize(i.normal);

				//光照的方向
				float3 LightDirection = normalize(_WorldSpaceLightPos0.xyz);

				//计算光照的衰减 
				//衰减值
				float Attenuation = LIGHT_ATTENUATION(i);
				//衰减后的颜色值
				float3 AttenColor = Attenuation * _LightColor0;

				//计算漫反射值
				float Ndot = dot(NormalDirection,LightDirection);
				float3 Diffuse = max(0.0,Ndot)  * AttenColor + UNITY_LIGHTMODEL_AMBIENT.xyz;

				//计算自发光参数
				//计算边缘强度
				half Rim = 1.0 - max(0,dot(i.normal,ViewDirection));
				//计算出边缘自发光强度
				float3 Emissive = _RimColor.rgb * pow(Rim,_RimColorPower) * _RimIntensity;

				//【8.5】计在最终颜色中加入自发光颜色 || Calculate the final color
				//最终颜色 = (漫反射系数 x 纹理颜色 x rgb颜色)+自发光颜色 || Final Color=(Diffuse x Texture x rgbColor)+Emissive
				float3 finalColor = Diffuse * (tex2D(_TextureDiffuse,TRANSFORM_TEX(i.texcoord.rgb, _TextureDiffuse)).rgb*_MainColor.rgb) + Emissive;
			
				//【8.6】返回最终颜色 || Return final color
				return fixed4(finalColor,1);

			}
		ENDCG

	   }
	}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值