#import "Common/ShaderLib/GLSLCompat.glsllib" uniform vec4 m_Diffuse; uniform sampler2D m_DiffuseMap; uniform bool m_HasDiffuseMap; uniform sampler2D m_NormalMap; uniform bool m_HasNormalMap; uniform float m_Wetness; in vec2 texCoord; in vec3 vNormal; in vec3 vTangent; in float vHandedness; void main() { vec3 baseColor; if (m_HasDiffuseMap) { vec4 tex = texture2D(m_DiffuseMap, texCoord); if (tex.a < 0.5) discard; baseColor = tex.rgb * m_Diffuse.rgb; } else { vec2 uv = texCoord * 2.0 - 1.0; if (dot(uv, uv) > 0.95) discard; baseColor = m_Diffuse.rgb; } vec3 N = normalize(vNormal); if (m_HasNormalMap) { vec3 T = normalize(vTangent); vec3 B = normalize(cross(N, T) * vHandedness); mat3 TBN = mat3(T, B, N); vec3 nm = texture2D(m_NormalMap, texCoord).rgb * 2.0 - 1.0; N = normalize(TBN * nm); } vec3 sun = normalize(vec3(0.4, 1.0, 0.3)); float diff = max(0.0, dot(N, sun)); // two-sided: underside receives half brightness diff = max(diff, max(0.0, dot(-N, sun)) * 0.5); float lit = 0.45 + diff * 0.55; baseColor *= (1.0 - 0.18 * m_Wetness); float shine = pow(diff, 12.0) * m_Wetness * 0.25; gl_FragColor = vec4(baseColor * lit + vec3(shine), 1.0); }