Files
Gregtech-New-Bastards/.minecraft/shaderpacks/ComplementaryShaders_v4.6/shaders/lib/surface/autoGenNormals.glsl
2025-09-28 22:53:13 +02:00

48 lines
1.9 KiB
GLSL

void AutoGenerateNormals(inout vec4 normalMap, vec3 albedoP, float delta) {
float packSizeGN = 128.0;
float lOriginalAlbedo = length(albedoP);
float normalMult = max(1.0 - delta, 0.0) * 1.8 * sqrt(NORMAL_MULTIPLIER);
float normalClamp = 0.05;
#ifndef SAFE_GENERATED_NORMALS
vec2 offsetR = 16.0 / atlasSize;
#else
vec2 offsetR = max(vTexCoordAM.z, vTexCoordAM.w) * vec2(float(atlasSize.y) / float(atlasSize.x), 1.0);
#endif
offsetR /= packSizeGN;
vec2 midCoord = texCoord - vTexCoordL / 2.0;
vec2 vTexCoordAM_M = vTexCoordAM.zw * (0.5 - 0.5 / packSizeGN);
if (normalMult > 0.0) {
for(int i = 0; i < 4; i++) {
vec2 offsetCoord;
if (i == 0) {
offsetCoord = texCoord + vec2( 0.0, offsetR.y);
if (offsetCoord.y > midCoord.y + vTexCoordAM_M.y) continue;
} else if (i == 1) {
offsetCoord = texCoord + vec2( offsetR.x, 0.0);
if (offsetCoord.x > midCoord.x + vTexCoordAM_M.x) continue;
} else if (i == 2) {
offsetCoord = texCoord + vec2( 0.0,-offsetR.y);
if (offsetCoord.y < midCoord.y - vTexCoordAM_M.y) continue;
} else if (i == 3) {
offsetCoord = texCoord + vec2(-offsetR.x, 0.0);
if (offsetCoord.x < midCoord.x - vTexCoordAM_M.x) continue;
}
float lNearbyAlbedo = length(texture2D(texture, offsetCoord).rgb);
float dif = lOriginalAlbedo - lNearbyAlbedo;
if (dif > 0.0) dif = max(dif - normalClamp, 0.0);
else dif = min(dif + normalClamp, 0.0);
dif *= normalMult;
if (i == 0)
normalMap.y += dif;
else if (i == 1)
normalMap.x += dif;
else if (i == 2)
normalMap.y -= dif;
else if (i == 3)
normalMap.x -= dif;
}
}
}