#version 330 core uniform sampler2D diffuseMap; uniform vec2 textureTiling; in vec2 fragTexCoord; in vec3 fragNormal; in vec2 fragTileTexCoord; flat in int ambientOcclusionSide1; flat in int ambientOcclusionSide2; flat in int ambientOcclusionCorner1; flat in int ambientOcclusionCorner2; flat in int ambientOcclusionCorner3; flat in int quadHeight; flat in int quadWidth; out vec4 outColor; // this is a shitty approximation of arcsin(x)/pi that gets the tails right and is reasonably close to the actual arcsin(x)/pi curve. float fakeArcsin(float x) { x = clamp(x, -1.0, 1.0); float ax = abs(x); float sqrtPart = sqrt(1.0 - ax); float result = 0.5 - sqrtPart * (0.5 - 0.06667 * ax); return x < 0.0 ? -result : result; } void main() { vec2 texCoord = (floor(fragTexCoord*textureTiling) + fract(fragTileTexCoord)) / textureTiling; outColor = texture(diffuseMap, texCoord); ivec2 floorFragTileTexCoord = ivec2(fragTileTexCoord); if(fragTileTexCoord.x < 1 && (((ambientOcclusionSide1 >> floorFragTileTexCoord.y) & 1) == 1)) outColor *= 0.5 + fakeArcsin(fragTileTexCoord.x); // if(fragTileTexCoord.x < 0.125 && fragTileTexCoord.x < fract(fragTileTexCoord.y) && fragTileTexCoord.x + fract(fragTileTexCoord.y) < 1.0 && ((ambientOcclusionSide1 >> floorFragTileTexCoord.y) & 1) == 1) outColor *= 0.5; //if((fragTileTexCoord.x < 0.25 || fragTileTexCoord.x > quadWidth-0.25) && (((ambientOcclusionSide1 >> floorFragTileTexCoord.y) & 1) == 1)) outColor *= 0.5; //if((fragTileTexCoord.y < 0.25 || fragTileTexCoord.y > quadHeight-0.25) && (((ambientOcclusionSide2 >> floorFragTileTexCoord.y) & 1) == 1)) outColor *= 0.5; outColor.a = 1; }