イラスト、モデリング、Unity、VR関連

unityとかblenderとかvr関連の作業メモ

Shader ステンシルを使った改良版アウトライン

左が改良版、右が法線方向に伸ばしてアウトラインの上をテクスチャが上書きする方式

f:id:arumogina:20190611230657p:plain

 

Shader "Custom/Outline2" {
	Properties{
		_Color("Color",Color) = (1,1,1,1)
		_OutlineWide("OutlineWide",Range(0.,0.2)) = 0.
		_OutlinePow("OuwlinePow",Range(0,5.)) = 1.
		_MainTex("Texture",2D) = "white" {}
	}

	SubShader{
		Tags{"RenderType"="Opaque"}
		CGINCLUDE
		#pragma vertex vert
		#pragma fragment frag
		#include "UnityCG.cginc"

		struct appdata {
			float4 vertex :POSITION;
			float4 normal :NORMAL;
			float4 texcoord :TEXCOORD;
		};

		struct v2f {
			float4 pos: SV_POSITION;
			float2 uv: TEXCOORD;
		};
		ENDCG

		Pass{

			Stencil{
				Ref 1
				Comp always
				Pass replace
			}

			Cull Back

			CGPROGRAM

			sampler2D _MainTex;
			float4 _MainTex_ST;

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

			float4 frag(v2f i) :SV_Target{
				return tex2D(_MainTex	,i.uv);
			}
			ENDCG
		}//Pass

		Pass{
			Cull Front

			Stencil{
				Ref 1
				Comp NotEqual
			}

			CGPROGRAM

			float _OutlineWide;
			v2f vert(appdata v){
				v2f o;
				o.pos = UnityObjectToClipPos(v.vertex+v.normal*_OutlineWide);
				return o;
			}

			float4 _Color;
			float4 frag(v2f i) :SV_Target{
				return _Color;
			}
			ENDCG
		}//Pass

	}//SubShader
	FallBack "Diffuse"
}