Newer
Older
HoloAnatomy / Assets / HoloToolkit / Utilities / Scripts / GLTF / Shaders / GLTFVertexLitCommon.cginc
SURFACEBOOK2\jackwynne on 25 May 2018 3 KB v1
#ifndef GLTF_VERTEX_LIT_COMMON_INCLUDED
#define GLTF_VERTEX_LIT_COMMON_INCLUDED
#include "HLSLSupport.cginc"
#include "UnityCG.cginc"
#include "Lighting.cginc"
#include "AutoLight.cginc"

#ifdef _ALPHATEST_ON
half _Cutoff;
#endif

float4 _MainTex_ST;
sampler2D _MainTex;
fixed4 _Color;
half _OcclusionStrength;
#ifdef OCC_METAL_ROUGH_ON
sampler2D _MetallicRoughnessMap;
#else
sampler2D _OcclusionMap;
#endif
fixed4 _EmissionColor;
sampler2D _EmissionMap;

struct vertIn 
{
	float4 vertex : POSITION;
	float3 normal : NORMAL;
	float2 uv : TEXCOORD0;
	fixed4 color : COLOR;
};

struct v2f 
{
	float4 pos : SV_POSITION;
	float2 uv : TEXCOORD0;
	fixed3 computedShading : TEXCOORD2;
	#ifdef VERTEX_COLOR_ON
	fixed4 vertColor : COLOR;
	#endif
	LIGHTING_COORDS(3, 4)
	UNITY_FOG_COORDS(5)
};

// NOTE: this assumes that we only calculate lighting for directional lights!
v2f gltfVertexFunc(vertIn v)
{
	v2f o;
	o.pos = UnityObjectToClipPos(v.vertex);
	o.uv.xy = TRANSFORM_TEX(v.uv, _MainTex);

	float3 worldNormal = UnityObjectToWorldNormal(v.normal);
	// add ambient via spherical harmonics
	o.computedShading = max(0, ShadeSH9(float4(v.normal, 1)));
	fixed lambertianValue = DotClamped(worldNormal, _WorldSpaceLightPos0.xyz);
	o.computedShading += lambertianValue * _LightColor0.rgb;

	TRANSFER_VERTEX_TO_FRAGMENT(o);
	UNITY_TRANSFER_FOG(o, o.pos);

	#ifdef VERTEX_COLOR_ON
	o.vertColor = v.color;
	#endif

	return o;
}

fixed4 gltfFragFunc(v2f i) : SV_Target
{
	#ifdef VERTEX_COLOR_ON
	half4 albedo = tex2D(_MainTex, i.uv) * _Color * i.vertColor;
	#else
	half4 albedo = tex2D(_MainTex, i.uv) * _Color;
	#endif
	fixed4 mainColor = fixed4(albedo.rgb * i.computedShading, albedo.a);

	UNITY_APPLY_FOG(i.fogCoord, mainColor);

	#ifdef _ALPHATEST_ON
	clip(mainColor.a  - _Cutoff);
	#endif

	#ifdef OCC_METAL_ROUGH_ON
	fixed4 occlusion = tex2D(_MetallicRoughnessMap, i.uv).r * _OcclusionStrength;
	#else
	fixed4 occlusion = tex2D(_OcclusionMap, i.uv).r * _OcclusionStrength;
	#endif

	fixed4 emission = tex2D(_EmissionMap, i.uv) * _EmissionColor;

	return mainColor * fixed4(occlusion.rgb, 1.0) + fixed4(emission.rgb, 0.0);
}

struct vertInUnlit
{
	float4 vertex : POSITION;
	float2 uv : TEXCOORD0;
	fixed4 color : COLOR;
};

struct v2fUnlit
{
	float4 pos : SV_POSITION;
	float2 uv : TEXCOORD0;
#ifdef VERTEX_COLOR_ON
	fixed4 vertColor : COLOR;
#endif
	UNITY_FOG_COORDS(4)
};

v2fUnlit gltfVertexUnlit(vertInUnlit v)
{
	v2fUnlit o;
	o.pos = UnityObjectToClipPos(v.vertex);
	o.uv.xy = TRANSFORM_TEX(v.uv, _MainTex);

	UNITY_TRANSFER_FOG(o, o.pos);

#ifdef VERTEX_COLOR_ON
	o.vertColor = v.color;
#endif

	return o;
}

fixed4 gltfFragUnlit(v2fUnlit i) : SV_Target
{
#ifdef VERTEX_COLOR_ON
	half4 mainColor = tex2D(_MainTex, i.uv) * _Color * i.vertColor;
#else
	half4 mainColor = tex2D(_MainTex, i.uv) * _Color;
#endif

	UNITY_APPLY_FOG(i.fogCoord, mainColor);

#ifdef _ALPHATEST_ON
	clip(mainColor.a - _Cutoff);
#endif

#ifdef OCC_METAL_ROUGH_ON
	fixed4 occlusion = tex2D(_MetallicRoughnessMap, i.uv).r * _OcclusionStrength;
#else
	fixed4 occlusion = tex2D(_OcclusionMap, i.uv).r * _OcclusionStrength;
#endif

	fixed4 emission = tex2D(_EmissionMap, i.uv) * _EmissionColor;

	return mainColor * fixed4(occlusion.rgb, 1.0) + fixed4(emission.rgb, 0.0);
}

#endif