Created
May 18, 2021 22:22
-
-
Save rickomax/95362b3355856378a1c78815497ebf4e to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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