diff --git a/Effects/ws30.eff b/Effects/ws30.eff index ab771c9b2..d9f12225c 100644 --- a/Effects/ws30.eff +++ b/Effects/ws30.eff @@ -1874,4 +1874,103 @@ + + hdr-geometry + + + + gequal + 1.0 + 0.0 + + + always + 9 + replace + + + transparent + transparent + smooth + back + + render-bin/bin-number + render-bin/bin-name + + + + + + 1 + texture[1]/image + nearest-mipmap-nearest + nearest-mipmap-nearest + texture[0]/wrap-s + texture[0]/wrap-t + texture[0]/internal-format + + + + 2 + texture[2]/image + texture[2]/filter + texture[2]/wrap-s + texture[2]/wrap-t + texture[2]/internal-format + + + + 3 + texture[3]/image + texture[3]/filter + texture[3]/wrap-s + texture[3]/wrap-t + texture[3]/internal-format + + + + 4 + texture[4]/image + texture[4]/filter + texture[4]/wrap-s + texture[4]/wrap-t + texture[4]/internal-format + + + + 6 + texture[6]/image + texture[6]/filter + texture[6]/wrap-s + texture[6]/wrap-t + texture[6]/internal-format + + + back + + Shaders/HDR/terrain_default.vert + Shaders/HDR/ws30.frag + Shaders/HDR/gbuffer_pack.glsl + Shaders/HDR/normal_encoding.glsl + Shaders/HDR/color.glsl + + + + landclass + sampler-2d + 0 + + + atlas + sampler-2d + 1 + + + perlin + sampler-2d + 6 + + + + diff --git a/Shaders/HDR/ws30.frag b/Shaders/HDR/ws30.frag new file mode 100644 index 000000000..2a45ca45f --- /dev/null +++ b/Shaders/HDR/ws30.frag @@ -0,0 +1,70 @@ +#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); +}