Files
Gregtech-New-Bastards/.minecraft/shaderpacks/ComplementaryShaders_v4.6/shaders/lib/surface/materialGbuffers.glsl
2025-05-29 23:31:29 +02:00

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);
}