Unity ShaderLab特效教程 着色器实例 代码+注释 【描边着色器】

如果代码中有什么不清楚请查看以下基础知识

Shader基础知识
unity3d 中 七种坐标知识详解

描边着色器

在物体周围生成一个颜色、宽度可调的描边
大致效果:
在这里插入图片描述

// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'

Shader "Unlit/NewUnlitShader"
{
    Properties
    {
		//定义与unity通信的变量名
		_MainColor("Main Color", Color) = (0.5,0.5,0.5,1)
		_OutlineColor("Outline Color",Color) = (0,0,0,1)   //轮廓颜色
		_Outline("Outline width",Range(0.0,10)) = 0.005    //轮廓线宽度
    }
    SubShader
    {
        Tags { "RenderType"="Transparent" }
        LOD 100

		//固定管线渲染器。背面剔除,并在深度缓冲区中留下背面剔除的深度值
        Pass{
			Name "BASE"
			//剔除背面
			Cull Back
			//保存缓冲区
			Blend Zero One

			SetTexture[_OutlineColor]
			{
				ConstantColor(1,0,0,0)
				Combine constant
			}
        }

		//顶点/片段着色器。正面剔除,那些经过法线伸展后的点会因为与深度剔除的缓存值比较后无法通过而被剔除
		//也就是说仅仅剩下正面与背面的边缘处因为伸展的原因保留了下来,  于是轮廓就出现了,这就是大体过程了
		Pass{
			Name"OUTLINE"
			Tags{"LightMode" = "Always"}
			Cull Front

			Blend One OneMinusDstColor

			//顶点片元着色器代码
			CGPROGRAM
				#pragma vertex vert 
				#pragma fragment frag 
				//引入unitycg库
				#include "UnityCG.cginc"
				
				//定义从应用到顶点着色器的数据,此处用于获取顶点位置信息和法线信息
				struct appdata{
					float4 vertex : POSITION;
					float3 normal : NORMAL;
				};
				
				//定义顶点着色器输出给片元着色器的数据,此处输出片元位置,及颜色
				struct v2f{
					float4 pos :POSITION;
					float4 color : COLOR;
				};

				uniform float _Outline;
				uniform float4 _OutlineColor;

				//顶点着色器程序块
				v2f vert(appdata v){
					v2f o;
					o.pos = UnityObjectToClipPos(v.vertex);

					float3 norm = mul((float3x3)UNITY_MATRIX_IT_MV,v.normal);
					float2 offset = TransformViewToProjection(norm.xy);

					o.pos.xy += offset * o.pos.z* _Outline;
					o.color = _OutlineColor;

					return o;
				}
				//片段着色器代码块
				half4 frag(v2f i) :COLOR{
					return i.color;
				}
			ENDCG
		}
    }
}

发布了134 篇原创文章 · 获赞 37 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/lengyoumo/article/details/103955381