#version 330 core in vec3 vN; in vec2 texcoord; uniform sampler2D landclass; uniform sampler2DArray atlas; uniform sampler2D perlin; // Passed from VPBTechnique, not the Effect uniform float fg_tileWidth; uniform float fg_tileHeight; uniform bool fg_photoScenery; uniform vec4 fg_dimensionsArray[128]; uniform vec4 fg_ambientArray[128]; uniform vec4 fg_diffuseArray[128]; uniform vec4 fg_specularArray[128]; uniform vec4 fg_textureLookup1[128]; uniform vec4 fg_textureLookup2[128]; uniform mat4 fg_zUpTransform; uniform vec3 fg_modelOffset; const float TERRAIN_METALLIC = 0.0; const float TERRAIN_ROUGHNESS = 0.95; // gbuffer_pack.glsl void gbuffer_pack(vec3 normal, vec3 base_color, float metallic, float roughness, float occlusion, vec3 emissive, uint mat_id); // color.glsl vec3 eotf_inverse_sRGB(vec3 srgb); void main() { vec3 texel; vec4 specular = vec4(0.1, 0.1, 0.1, 1.0); if (fg_photoScenery) { texel = texture(landclass, vec2(texcoord.s, 1.0 - texcoord.t)).rgb; } else { // The Landclass for this particular fragment. This can be used to // index into the atlas textures. int lc = int(texture2D(landclass, texcoord).g * 255.0 + 0.5); uint tex1 = uint(fg_textureLookup1[lc].r * 255.0 + 0.5); //color = ambientArray[lc] + diffuseArray[lc] * NdotL * gl_LightSource[0].diffuse; specular = fg_specularArray[lc]; // Different textures have different have different dimensions. vec2 atlas_dimensions = fg_dimensionsArray[lc].st; vec2 atlas_scale = vec2(fg_tileWidth / atlas_dimensions.s, fg_tileHeight / atlas_dimensions.t ); vec2 st = atlas_scale * texcoord; // Rotate texture using the perlin texture as a mask to reduce tiling if (step(0.5, texture(perlin, atlas_scale * texcoord / 8.0).r) == 1.0) { st = vec2(atlas_scale.s * texcoord.t, atlas_scale.t * texcoord); } if (step(0.5, texture(perlin, - atlas_scale * texcoord / 16.0).r) == 1.0) { st = -st; } texel = texture(atlas, vec3(st, tex1)).rgb; } vec3 color = eotf_inverse_sRGB(texel); gbuffer_pack(vN, color, TERRAIN_METALLIC, TERRAIN_ROUGHNESS, 1.0, vec3(0.0), 3u); }