From 1215f1eba22245489565e6e76ca12dba22c71c45 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fernando=20Garc=C3=ADa=20Li=C3=B1=C3=A1n?= <fernandogarcialinan@gmail.com> Date: Sat, 24 Jul 2021 13:35:53 +0200 Subject: [PATCH] HDR pipeline: add placeholder shaders for WS 3.0 --- Effects/ws30.eff | 99 +++++++++++++++++++++++++++++++++++++++++++ Effects/ws30water.eff | 35 +++++++++++++++ Shaders/HDR/ws30.frag | 54 +++++++++++++++++++++++ 3 files changed, 188 insertions(+) create mode 100644 Shaders/HDR/ws30.frag diff --git a/Effects/ws30.eff b/Effects/ws30.eff index 6f6e78e18..71f7bde28 100644 --- a/Effects/ws30.eff +++ b/Effects/ws30.eff @@ -671,4 +671,103 @@ </pass> </technique> + <technique n="109"> + <scheme>hdr-geometry</scheme> + <pass> + <blend><use>transparent</use></blend> + <alpha-test><use>transparent</use></alpha-test> + <shade-model>smooth</shade-model> + <cull-face>back</cull-face> + <render-bin> + <bin-number><use>render-bin/bin-number</use></bin-number> + <bin-name><use>render-bin/bin-name</use></bin-name> + </render-bin> + + <!-- texture unit 0 direct from VPBBuilder.cxx --> + + <texture-unit> + <unit>1</unit> + <image><use>texture[1]/image</use></image> + <filter>nearest-mipmap-nearest</filter> + <mag-filter>nearest-mipmap-nearest</mag-filter> + <wrap-s><use>texture[0]/wrap-s</use></wrap-s> + <wrap-t><use>texture[0]/wrap-t</use></wrap-t> + <internal-format><use>texture[0]/internal-format</use></internal-format> + </texture-unit> + + <texture-unit> + <unit>2</unit> + <image><use>texture[2]/image</use></image> + <filter><use>texture[2]/filter</use></filter> + <wrap-s><use>texture[2]/wrap-s</use></wrap-s> + <wrap-t><use>texture[2]/wrap-t</use></wrap-t> + <internal-format><use>texture[2]/internal-format</use></internal-format> + </texture-unit> + + <texture-unit> + <unit>3</unit> + <image><use>texture[3]/image</use></image> + <filter><use>texture[3]/filter</use></filter> + <wrap-s><use>texture[3]/wrap-s</use></wrap-s> + <wrap-t><use>texture[3]/wrap-t</use></wrap-t> + <internal-format><use>texture[3]/internal-format</use></internal-format> + </texture-unit> + + <texture-unit> + <unit>4</unit> + <image><use>texture[4]/image</use></image> + <filter><use>texture[4]/filter</use></filter> + <wrap-s><use>texture[4]/wrap-s</use></wrap-s> + <wrap-t><use>texture[4]/wrap-t</use></wrap-t> + <internal-format><use>texture[4]/internal-format</use></internal-format> + </texture-unit> + + <texture-unit> + <unit>6</unit> + <image><use>texture[6]/image</use></image> + <filter><use>texture[6]/filter</use></filter> + <wrap-s><use>texture[6]/wrap-s</use></wrap-s> + <wrap-t><use>texture[6]/wrap-t</use></wrap-t> + <internal-format><use>texture[6]/internal-format</use></internal-format> + </texture-unit> + + <program> + <vertex-shader>Shaders/HDR/geometry.vert</vertex-shader> + <fragment-shader>Shaders/HDR/ws30.frag</fragment-shader> + <fragment-shader>Shaders/HDR/gbuffer-include.frag</fragment-shader> + </program> + + <uniform> + <name>landclass</name> + <type>sampler-2d</type> + <value type="int">0</value> + </uniform> + <uniform> + <name>atlas</name> + <type>sampler-2d</type> + <value type="int">1</value> + </uniform> + <uniform> + <name>dimensionsArray</name> + <type>sampler-1d</type> + <value type="int">2</value> + </uniform> + <uniform> + <name>diffuseArray</name> + <type>sampler-1d</type> + <value type="int">3</value> + </uniform> + <uniform> + <name>specularArray</name> + <type>sampler-1d</type> + <value type="int">4</value> + </uniform> + <uniform> + <name>perlin</name> + <type>sampler-2d</type> + <value type="int">6</value> + </uniform> + </pass> + </technique> + </PropertyList> diff --git a/Effects/ws30water.eff b/Effects/ws30water.eff index 4bd3f748a..c2354e2fe 100644 --- a/Effects/ws30water.eff +++ b/Effects/ws30water.eff @@ -114,4 +114,39 @@ </texture-unit> </pass> </technique> + + <technique n="109"> + <scheme>hdr-geometry</scheme> + <pass> + <blend><use>transparent</use></blend> + <alpha-test><use>transparent</use></alpha-test> + <shade-model>smooth</shade-model> + <cull-face>back</cull-face> + <render-bin> + <bin-number><use>render-bin/bin-number</use></bin-number> + <bin-name><use>render-bin/bin-name</use></bin-name> + </render-bin> + <texture-unit> + <unit>0</unit> + <type>2d</type> + <image>Textures/Terrain/water.png</image> + <filter>linear-mipmap-linear</filter> + <wrap-s>repeat</wrap-s> + <wrap-t>repeat</wrap-t> + <environment> + <mode>modulate</mode> + </environment> + </texture-unit> + <program> + <vertex-shader>Shaders/HDR/geometry.vert</vertex-shader> + <fragment-shader>Shaders/HDR/geometry.frag</fragment-shader> + <fragment-shader>Shaders/HDR/gbuffer-include.frag</fragment-shader> + </program> + <uniform> + <name>color_tex</name> + <type>sampler-2d</type> + <value type="int">0</value> + </uniform> + </pass> + </technique> </PropertyList> diff --git a/Shaders/HDR/ws30.frag b/Shaders/HDR/ws30.frag new file mode 100644 index 000000000..af7aaf35a --- /dev/null +++ b/Shaders/HDR/ws30.frag @@ -0,0 +1,54 @@ +#version 330 core + +layout(location = 0) out vec4 gbuffer0; +layout(location = 1) out vec2 gbuffer1; +layout(location = 2) out vec4 gbuffer2; + +in vec3 normalVS; +in vec2 texCoord; + +uniform sampler2D landclass; +uniform sampler2DArray atlas; +uniform sampler1D dimensionsArray; +uniform sampler1D diffuseArray; +uniform sampler1D specularArray; +uniform sampler2D perlin; + +// Passed from VPBTechnique, not the Effect +uniform float tile_width; +uniform float tile_height; + +vec2 encodeNormal(vec3 n); + +void main() +{ + // The Landclass for this particular fragment. This can be used to + // index into the atlas textures. + int lc = int(texture(landclass, texCoord).g * 255.0 + 0.5); + + // Different textures have different have different dimensions. + // Dimensions array is scaled to fit in [0...1.0] in the texture1D, so has to be scaled back up here. + vec4 color = texture(diffuseArray, float(lc)/512.0); + vec4 specular = texture(specularArray, float(lc)/512.0); + vec2 atlas_dimensions = 10000.0 * texture(dimensionsArray, float(lc)/512.0).st; + vec2 atlas_scale = vec2(tile_width / atlas_dimensions.s, tile_height / 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.s); + } + + if (step(0.5, texture(perlin, - atlas_scale * texCoord / 16.0).r) == 1.0) { + st = -st; + } + + vec3 texel = texture(atlas, vec3(st, lc)).rgb; + + gbuffer0.rgb = pow(texel, vec3(2.2)); // Gamma correction + gbuffer0.a = 1.0; + gbuffer1 = encodeNormal(normalVS); + gbuffer2 = vec4(0.0, 0.9, 0.0, 0.0); +} + +