#version 330 core in VS_OUT { vec3 Position; // world coordinates vec3 Normal; vec2 Texture; flat int BlockID; } fs_in; layout (location = 0) out vec3 Position; layout (location = 1) out vec3 Normal; layout (location = 2) out vec3 Color; uniform sampler2D TerrainSampler; int Textures[256] = int[256]( 185, 1, 0, 2, 16, 4, 15, 17, 205, 205, 237, 237, 18, 19, 32, 33, 34, 20, 52, 48, 49, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 39, 185, 185, 185, 64, 185, 13, 12, 29, 28, 39, 38, 5, 5, 7, 8, 35, 36, 37, 80, 31, 65, 4, 27, 84, 50, 40, 43, 88, 87, 44, 61, 185, 81, 83, 128, 16, 185, 96, 6, 82, 6, 51, 51, 115, 99, 185, 66, 67, 66, 70, 72, 73, 74, 4, 102, 103, 104, 105, 14, 102, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185 ); void main() { int terrain_ix = int(Textures[int(fs_in.BlockID)]); int terrain_x = terrain_ix % 16; int terrain_y = terrain_ix / 16; ivec2 coord = ivec2(terrain_x, terrain_y) * 16; coord += ivec2(fs_in.Texture.xy * 16.0); vec4 texture_color = texelFetch(TerrainSampler, coord, 0); if (texture_color.w != 1.0) { discard; return; } if (fs_in.BlockID == 18 || fs_in.BlockID == 31) // leaves texture_color.xyz *= vec3(0.125, 0.494, 0.027); Position = fs_in.Position; Normal = normalize(fs_in.Normal); Color = texture_color.xyz; }