holopy3/Assets/PlattarExporter/UnityGLTF/Shaders/GLTFMobileCommon.cginc
Lena Biresch 490ef558ef CleanUp
2021-01-28 13:07:52 +01:00

144 lines
3.2 KiB
HLSL

#ifndef GLTF_MOBILE_COMMON_INCLUDED
#define GLTF_MOBILE_COMMON_INCLUDED
#include "UnityCG.cginc"
#include "AutoLight.cginc"
#include "UnityPBSLighting.cginc"
#include "UnityStandardBRDF.cginc"
#ifdef _ALPHATEST_ON
half _Cutoff;
#endif
fixed4 _Color;
fixed4 _MainTex_ST;
sampler2D _MainTex;
half _Metallic;
half _Roughness;
sampler2D _MetallicRoughnessMap;
half _OcclusionStrength;
sampler2D _OcclusionMap;
fixed3 _EmissionColor;
sampler2D _EmissionMap;
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
float3 normal : NORMAL;
#ifdef VERTEX_COLOR_ON
fixed4 vertColor : COLOR;
#endif
};
struct v2f
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
float3 normal : TEXCOORD2;
float3 viewDir : TEXCOORD3;
#ifdef VERTEX_COLOR_ON
fixed4 vertColor : COLOR;
#endif
};
v2f gltfMobileVert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
#ifdef VERTEX_COLOR_ON
o.vertColor = v.vertColor;
#endif
o.normal = UnityObjectToWorldNormal(v.normal);
float3 worldPos = mul(unity_ObjectToWorld, v.vertex);
o.viewDir = normalize(_WorldSpaceCameraPos - worldPos);
return o;
}
// NOTE: assumes that this is only used with directional light pass
fixed4 gltfMobileFrag (v2f i) : SV_Target
{
i.normal = normalize(i.normal);
#if defined(_ALPHATEST_ON)
#ifdef VERTEX_COLOR_ON
fixed4 color = tex2D(_MainTex, i.uv) * _Color * i.vertColor;
#else
fixed4 color = tex2D(_MainTex, i.uv) * _Color;
#endif
clip(color.a - _Cutoff);
fixed3 albedo = color.rgb;
#elif defined(_ALPHABLEND_ON)
#ifdef VERTEX_COLOR_ON
fixed4 color = tex2D(_MainTex, i.uv) * _Color * i.vertColor;
#else
fixed4 color = tex2D(_MainTex, i.uv) * _Color;
#endif
fixed3 albedo = color.rgb;
#else // ALPHA_MODE
#ifdef VERTEX_COLOR_ON
fixed3 albedo = tex2D(_MainTex, i.uv) * _Color * i.vertColor;
#else
fixed3 albedo = tex2D(_MainTex, i.uv) * _Color;
#endif
#endif // ALPHA_MODE
fixed3 metallicRoughness = tex2D(_MetallicRoughnessMap, i.uv);
fixed metallic = metallicRoughness.b * _Metallic;
#ifdef OCC_METAL_ROUGH_ON
fixed3 occlusion = metallicRoughness.r * _OcclusionStrength;
#else
fixed3 occlusion = tex2D(_OcclusionMap, i.uv).r * _OcclusionStrength;
#endif
fixed3 specularTint;
fixed oneMinusReflectivity;
albedo = DiffuseAndSpecularFromMetallic(
albedo, metallic, specularTint, oneMinusReflectivity
);
fixed3 emmission = tex2D(_EmissionMap, i.uv).rgb * _EmissionColor;
UnityLight light;
light.color = _LightColor0.rgb;
light.dir = _WorldSpaceLightPos0.xyz;
light.ndotl = DotClamped(i.normal, light.dir);
UnityIndirect indirectLight;
indirectLight.diffuse = max(0, ShadeSH9(float4(i.normal, 1)));
indirectLight.specular = 0;
fixed smoothness = metallicRoughness.g * (1 - _Roughness);
// we might want to also consider BRDF2_Unity_PBS
fixed3 pbsValue = BRDF3_Unity_PBS(
albedo, specularTint,
oneMinusReflectivity, smoothness,
i.normal, i.viewDir,
light, indirectLight
);
// TODO: are we using occlusion and emission correctly??
#ifdef _ALPHABLEND_ON
return fixed4(pbsValue * occlusion + emmission, color.a);
#else
return fixed4(pbsValue * occlusion + emmission, 1);
#endif
}
#endif // GLTF_MOBILE_COMMON_INCLUDED