46 lines
1.3 KiB
GLSL
46 lines
1.3 KiB
GLSL
#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);
|
|
}
|