#version 330 core
in vec2 fTexCoord;
uniform usampler2D fTexture;
uniform sampler2D fMaterials;
uniform sampler2D fAtlas;
uniform vec2 fWorldMaterialSize;
uniform vec2 fTextureMaterialSize;
uniform vec2 fWorldSubTileSize;
uniform vec2 fTextureSubTileSize;
out vec4 FragColor;
void main()
{
uvec4 data = texture(fTexture, fTexCoord);
// data.x is two bytes in a single ushort
uvec2 material = uvec2(data.x & 0x00ffu, (data.x & 0xff00u) >> 8u);
vec2 wTexCoord = mod(fTexCoord, fWorldMaterialSize) / fWorldMaterialSize;
vec2 tTexCoord = (vec2(material) + wTexCoord) * fTextureMaterialSize;
// data.y is two bytes in a single ushort
uvec2 mask = uvec2(data.y & 0x00ffu, (data.y & 0xff00u) >> 8u);
vec2 wstTexCoord = mod(fTexCoord, fWorldSubTileSize) / fWorldSubTileSize;
vec2 stTexCoord = (vec2(mask) + wstTexCoord) * fTextureSubTileSize;
FragColor = texture(fMaterials, tTexCoord) * texture(fAtlas, stTexCoord);
}
#version 330 core
in vec2 fTexCoord;
uniform usampler2D fTexture;
uniform sampler2D fMaterials;
uniform sampler2D fAtlas;
uniform vec2 fWorldMaterialSize;
uniform vec2 fTextureMaterialSize;
uniform vec2 fWorldSubTileSize;
uniform vec2 fTextureSubTileSize;
out vec4 FragColor;
void main()
{
uvec4 data = texture(fTexture, fTexCoord);
// data.x is two bytes in a single ushort
uvec2 material = uvec2(data.x & 0x00ffu, (data.x & 0xff00u) >> 8u);
vec2 wTexCoord = mod(fTexCoord, fWorldMaterialSize) / fWorldMaterialSize;
vec2 tTexCoord = (vec2(material) + wTexCoord) * fTextureMaterialSize;
// data.y is two bytes in a single ushort
uvec2 mask = uvec2(data.y & 0x00ffu, (data.y & 0xff00u) >> 8u);
vec2 wstTexCoord = mod(fTexCoord, fWorldSubTileSize) / fWorldSubTileSize;
vec2 stTexCoord = (vec2(mask) + wstTexCoord) * fTextureSubTileSize;
FragColor = texture(fMaterials, tTexCoord) * texture(fAtlas, stTexCoord);
}