48 lines
1.9 KiB
GLSL
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;
|
|
}
|
|
}
|
|
} |