쉐이더 스트로크를 달성

뇌졸중은 일반적으로 게임에서 객체를 강조, 효과의 매우 일반적인 종류의 게임의 효과이다. 쉐이더를 사용하는 다음과 같은 간단한 획 효과.

스트로크는 일반적으로 두 가지 방법으로 달성된다 : 하나의 정점의 법선 방향에서의 간격을 확장 모델이며, 그 깊이 마이그레이션을 사용하는 것이다.

먼저, 연장에 의해 법선

원리 : 제 만 전방을 제외한이면 렌더링 회 렌더링 모델은 꼭지점 법선 방향 거리, 뇌졸중의 표시 색을 확장

위로 컬링 제 2 묘화 만 긍정적 정상 렌더링.

Shader "Custom/Stroke"
{
	Properties
	{
		_MainTex("main tex",2D) = ""{}
		_Factor("factor",Range(0,0.1)) = 0.01		//描边粗细因子
		_OutLineColor("outline color",Color) = (0,0,0,1)//描边颜色
	}

		SubShader
	{
		Pass
	{
		Cull Front //剔除前面
		CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"

		struct v2f
	{
		float4 vertex :POSITION;
	};

	float _Factor;
	half4 _OutLineColor;

	v2f vert(appdata_full v)
	{
		v2f o;
		//将顶点沿法线方向向外扩展一下
		v.vertex.xyz += v.normal * _Factor;
		o.vertex = UnityObjectToClipPos(v.vertex);

		return o;
	}

	half4 frag(v2f v) :COLOR
	{
		//只显示描边的颜色
		return _OutLineColor;
	}
		ENDCG
	}

		Pass
	{
		Cull Back //剔除后面
		CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"

		struct v2f
	{
		float4 vertex :POSITION;
		float4 uv:TEXCOORD0;
	};

	sampler2D _MainTex;

	v2f vert(appdata_full v)
	{
		v2f o;
		o.vertex = UnityObjectToClipPos(v.vertex);
		o.uv = v.texcoord;
		return o;
	}

	half4 frag(v2f v) :COLOR
	{
		half4 c = tex2D(_MainTex,v.uv);
		return c;
	}
		ENDCG
	}
	}
		FallBack "Diffuse"
}

둘째, 깊이 마이그레이션

원리 : 먼저 오프셋 명령, 심도있는 작업을 사용하여, 전면 만 다시 렌더링 제거, 두 번 렌더링합니다.

위로 컬링 제 2 묘화 만 긍정적 정상 렌더링.

오프셋 깊이 마이그레이션

계수, 단위 오프셋

팩터 : 주요 영향 우리는 다각형의 최대 깊이 기울기를 그릴

좌표계 창의 깊이 값의 가변 해상도의 차이는 주로 생성 될 수있는 최소의 값에 영향을 단위.

통용 명령 오프셋 라인에 일정한 값으로 단위는, 주요 기능 인자이다. 상기 Z 축 방향 팩터 조정은 계수가 0보다 큰 경우, 상기 오프셋 값은 상기 Z 축의 양의 방향으로 이동된다 로부터 멀리 화면. 계수는 0 미만이며, 상기 오프셋 값은 Z 축 방향을 따라 음수 가 화면에 가까이.

Shader "Custom/Stroke2" {
	Properties
	{
		_MainTex("main tex",2D) = ""{}
		_OutLineColor("outline color",Color) = (0,0,0,1)	//描边颜色
	}

	/*
		Offset:深度偏移
		Offset Factor,Units
		Factor参数表示 Z缩放的最大斜率的值。
		Units参数表示可分辨的最小深度缓冲区的值。
	*/
	SubShader{
		//描边
		pass {
			Cull Front		//剔除正面
			Offset -5,-1	//深度偏移
			CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"

			sampler2D _MainTex;
			half4 _OutLineColor;

			struct v2f {
				float4 pos : SV_POSITION;
			};

			v2f vert(appdata_base v) {
				v2f o;
				o.pos = UnityObjectToClipPos(v.vertex);
				return o;
			}

			float4 frag(v2f i) : COLOR{
				return _OutLineColor;
			}
			ENDCG
		}

		//正常渲染物体
		pass {
			Cull Back		//剔除背面
			CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"

			sampler2D _MainTex;
			float4 _MainTex_ST;

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

			v2f vert(appdata_base v)
			{
				v2f o;
				o.pos = UnityObjectToClipPos(v.vertex);
				o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
				return o;
			}

			float4 frag(v2f i) : COLOR	
			{
				float4 c = tex2D(_MainTex,i.uv);
				return c;
			}

			ENDCG
		}
	}

	
	FallBack "Diffuse"
}

렌더링 :

추천

출처blog.csdn.net/qq_38721111/article/details/89468332