Skip to content

Instantly share code, notes, and snippets.

@rickomax
Created May 18, 2021 22:22
Show Gist options
  • Save rickomax/95362b3355856378a1c78815497ebf4e to your computer and use it in GitHub Desktop.
Save rickomax/95362b3355856378a1c78815497ebf4e to your computer and use it in GitHub Desktop.
precision highp float;
varying vec2 vUv;
varying vec3 vecPos;
varying vec3 vecNormal;
uniform sampler2D _Diffuse;
uniform sampler2D _Specular;
const vec3 dielectricSpecular = vec3(0.04, 0.04, 0.04);
const float epsilon = 1e-6;
float solveMetallic(float diffuseBrightness, float specularBrightness, float oneMinusSpecularStrength) {
if (specularBrightness < dielectricSpecular.x) {
return 0.0;
}
float a = dielectricSpecular.x;
float b = diffuseBrightness * oneMinusSpecularStrength / (1.0 - dielectricSpecular.x) + specularBrightness - 2.0 * dielectricSpecular.x;
float c = dielectricSpecular.x - specularBrightness;
float D = b * b - 4.0 * a * c;
return clamp((-b + sqrt(D)) / (2.0 * a), 0.0, 1.0);
}
void main() {
vec4 diffuse = texture2D(_Diffuse, vUv);
vec3 specular = texture2D(_Specular, vUv).xyz;
float diffuseBrightness =
0.299 * pow(diffuse.x, 2.0) +
0.587 * pow(diffuse.y, 2.0) +
0.114 * pow(diffuse.z, 2.0);
float specularBrightness =
0.299 * pow(specular.x, 2.0) +
0.587 * pow(specular.y, 2.0) +
0.114 * pow(specular.z, 2.0);
float specularStrength = max(max(specular.x, specular.y), specular.z);
float oneMinusSpecularStrength = 1.0 - specularStrength;
float metallic = solveMetallic(diffuseBrightness, specularBrightness, oneMinusSpecularStrength);
vec3 baseColorFromDiffuse = diffuse.xyz * oneMinusSpecularStrength / ((1.0 - dielectricSpecular.x) * max(1.0 - metallic, epsilon));
vec3 baseColorFromSpecular = (specular - dielectricSpecular * (1.0 - metallic)) / max(metallic, epsilon);
vec3 baseColor = mix(baseColorFromDiffuse, baseColorFromSpecular, metallic * metallic);
gl_FragColor = vec4(baseColor, diffuse.w);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment