voxel-test/resources/shaders/tiling.fs

70 lines
3 KiB
Forth
Raw Normal View History

2024-09-19 21:33:32 +01:00
#version 330 core
uniform sampler2D diffuseMap;
2025-08-03 17:54:28 +01:00
uniform sampler2D occlusionMap;
2024-09-19 21:33:32 +01:00
uniform vec2 textureTiling;
in vec2 fragTexCoord;
in vec3 fragNormal;
in vec2 fragTileTexCoord;
2025-07-03 14:11:35 +01:00
flat in uvec4 occlusionSides;
flat in int topLeftObscured;
flat in int topRightObscured;
flat in int bottomLeftObscured;
flat in int bottomRightObscured;
2024-12-23 18:45:07 +00:00
flat in int quadHeight;
flat in int quadWidth;
2024-09-19 21:33:32 +01:00
out vec4 outColor;
2025-08-03 17:54:28 +01:00
int calculate_ao_square()
{
ivec2 tileCoord = ivec2(fragTileTexCoord);
int ao_square = 0;
if(tileCoord.x == quadWidth - 1 && ((occlusionSides.x & uint(1 << tileCoord.y)) > uint(0))) ao_square |= 1 << 0;
if(tileCoord.x == quadWidth - 1 && tileCoord.y == quadHeight - 1 && bottomRightObscured > 0) ao_square |= 1 << 1;
if(tileCoord.x == quadWidth - 1 && tileCoord.y != quadHeight - 1 && ((occlusionSides.x & uint(1 << (tileCoord.y+1))) > uint(0))) ao_square |= 1 << 1;
if(tileCoord.x != quadWidth - 1 && tileCoord.y == quadHeight - 1 && ((occlusionSides.w & uint(1 << (tileCoord.x+1))) > uint(0))) ao_square |= 1 << 1;
if(tileCoord.y == quadHeight - 1 && ((occlusionSides.w & uint(1 << tileCoord.x)) > uint(0))) ao_square |= 1 << 2;
if(tileCoord.x == 0 && tileCoord.y == quadHeight - 1 && bottomLeftObscured > 0) ao_square |= 1 << 3;
if(tileCoord.x == 0 && tileCoord.y != quadHeight - 1 && ((occlusionSides.y & uint(1 << (tileCoord.y+1))) > uint(0))) ao_square |= 1 << 3;
if(tileCoord.x != 0 && tileCoord.y == quadHeight - 1 && ((occlusionSides.w & uint(1 << (tileCoord.x-1))) > uint(0))) ao_square |= 1 << 3;
if(tileCoord.x == 0 && ((occlusionSides.y & uint(1 << tileCoord.y)) > uint(0))) ao_square |= 1 << 4;
if(tileCoord.x == 0 && tileCoord.y == 0 && topRightObscured > 0) ao_square |= 1 << 5;
if(tileCoord.x == 0 && tileCoord.y != 0 && ((occlusionSides.y & uint(1 << (tileCoord.y-1))) > uint(0))) ao_square |= 1 << 5;
if(tileCoord.x != 0 && tileCoord.y == 0 && ((occlusionSides.z & uint(1 << (tileCoord.x-1))) > uint(0))) ao_square |= 1 << 5;
if(tileCoord.y == 0 && ((occlusionSides.z & uint(1 << tileCoord.x)) > uint(0))) ao_square |= 1 << 6;
if(tileCoord.x == quadWidth - 1 && tileCoord.y == 0 && topLeftObscured > 0) ao_square |= 1 << 7;
if(tileCoord.x == quadWidth - 1 && tileCoord.y != 0 && ((occlusionSides.x & uint(1 << (tileCoord.y-1))) > uint(0))) ao_square |= 1 << 7;
if(tileCoord.x != quadWidth - 1 && tileCoord.y == 0 && ((occlusionSides.z & uint(1 << (tileCoord.x+1))) > uint(0))) ao_square |= 1 << 7;
return ao_square;
}
2024-09-19 21:33:32 +01:00
void main()
{
vec2 texCoord = (floor(fragTexCoord*textureTiling) + fract(fragTileTexCoord)) / textureTiling;
2024-12-23 18:45:07 +00:00
2025-08-03 17:54:28 +01:00
int ao_square = calculate_ao_square();
2025-08-03 17:54:28 +01:00
outColor = texture(diffuseMap, texCoord);
outColor *= texture(occlusionMap, (vec2(ao_square, 0)+fract(fragTileTexCoord))/vec2(256, 1));
2024-12-23 18:45:07 +00:00
outColor.a = 1;
2025-07-03 14:11:35 +01:00
2025-08-03 17:54:28 +01:00
//uint bit = uint(fragTileTexCoord * 32);
//outColor.g = (((uint(quadWidth) >> bit) & uint(1)) == uint(1)) ?
// ((bit % uint(2) == uint(0)) ? 1.0 : 0.8):
// ((bit % uint(2) == uint(0)) ? 0.0 : 0.2);
2024-09-19 21:33:32 +01:00
}
2025-08-03 17:54:28 +01:00