70 lines
1.9 KiB
GLSL
70 lines
1.9 KiB
GLSL
void GetMaterials(out float smoothness, out float metalness, out float f0, out float metalData,
|
|
inout float emissive, out float materialAO, out vec4 normalMap,
|
|
vec2 newCoord, vec2 dcdx, vec2 dcdy) {
|
|
#ifdef MC_SPECULAR_MAP
|
|
#ifdef WRONG_MIPMAP_FIX
|
|
vec4 specularMap = texture2DLod(specular, newCoord, 0);
|
|
#else
|
|
vec4 specularMap = texture2D(specular, newCoord);
|
|
#endif
|
|
#else
|
|
vec4 specularMap = vec4(0.0, 0.0, 0.0, 1.0);
|
|
#endif
|
|
|
|
#ifdef NORMAL_MAPPING
|
|
normalMap = textureGrad(normals, newCoord, dcdx, dcdy).rgba;
|
|
|
|
normalMap.xyz += vec3(0.5, 0.5, 0.0);
|
|
normalMap.xyz = pow(normalMap.xyz, vec3(NORMAL_MULTIPLIER));
|
|
normalMap.xyz -= vec3(0.5, 0.5, 0.0);
|
|
#endif
|
|
|
|
#if RP_SUPPORT == 4
|
|
smoothness = specularMap.r;
|
|
|
|
metalness = specularMap.g;
|
|
f0 = 0.78 * metalness + 0.02;
|
|
metalData = metalness;
|
|
|
|
materialAO = 1.0;
|
|
|
|
float materialEmissive = specularMap.b;
|
|
|
|
#ifdef NORMAL_MAPPING
|
|
normalMap.xyz = normalMap.xyz * 2.0 - 1.0;
|
|
#endif
|
|
#else
|
|
smoothness = specularMap.r;
|
|
|
|
f0 = specularMap.g;
|
|
metalness = f0 >= 0.9 ? 1.0 : 0.0;
|
|
metalData = f0;
|
|
|
|
#ifdef NORMAL_MAPPING
|
|
materialAO = normalMap.z;
|
|
#else
|
|
materialAO = texture2D(normals, newCoord).z;
|
|
#endif
|
|
materialAO *= materialAO;
|
|
|
|
float materialEmissive = specularMap.a < 1.0 ? specularMap.a : 0.0;
|
|
|
|
#ifdef NORMAL_MAPPING
|
|
normalMap.xyz = normalMap.xyz * 2.0 - 1.0;
|
|
float normalCheck = normalMap.x + normalMap.y;
|
|
if (normalCheck > -1.999) {
|
|
if (length(normalMap.xy) > 1.0) normalMap.xy = normalize(normalMap.xy);
|
|
normalMap.z = sqrt(1.0 - dot(normalMap.xy, normalMap.xy));
|
|
normalMap.xyz = normalize(clamp(normalMap.xyz, vec3(-1.0), vec3(1.0)));
|
|
} else {
|
|
normalMap.xyz = vec3(0.0, 0.0, 1.0);
|
|
materialAO = 1.0;
|
|
}
|
|
#endif
|
|
#endif
|
|
|
|
materialEmissive = pow(materialEmissive, 2.5 + 2.0 * materialEmissive);
|
|
emissive = mix(materialEmissive, 1.0, emissive);
|
|
|
|
materialAO = clamp(materialAO, 0.01, 1.0);
|
|
} |