144 lines
3.2 KiB
HLSL
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
|