diff --git a/examples/js/ShaderExtras.js b/examples/js/ShaderExtras.js
index 7147704b..7dd7517d 100644
--- a/examples/js/ShaderExtras.js
+++ b/examples/js/ShaderExtras.js
@@ -21,6 +21,7 @@
* blend
* fxaa
* luminosity
+ * normalmap
*/
THREE.ShaderExtras = {
@@ -1281,6 +1282,59 @@ THREE.ShaderExtras = {
},
+ /* -------------------------------------------------------------------------
+ // Normal map shader
+ // - compute normals from heightmap
+ ------------------------------------------------------------------------- */
+
+ 'normalmap': {
+
+ uniforms: {
+
+ "heightMap" : { type: "t", value: 0, texture: null },
+ "resolution": { type: "v2", value: new THREE.Vector2( 512, 512 ) },
+ "scale" : { type: "v2", value: new THREE.Vector2( 1, 1 ) },
+ "height" : { type: "f", value: 0.05 }
+
+ },
+
+ vertexShader: [
+
+ "varying vec2 vUv;",
+
+ "void main() {",
+
+ "vUv = vec2( uv.x, 1.0 - uv.y );",
+
+ "gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );",
+
+ "}"
+
+ ].join("\n"),
+
+ fragmentShader: [
+
+ "uniform float height;",
+ "uniform vec2 resolution;",
+ "uniform sampler2D heightMap;",
+
+ "varying vec2 vUv;",
+
+ "void main() {",
+
+ "float val = texture2D( heightMap, vUv ).x;",
+
+ "float valU = texture2D( heightMap, vUv + vec2( 1.0 / resolution.x, 0.0 ) ).x;",
+ "float valV = texture2D( heightMap, vUv + vec2( 0.0, 1.0 / resolution.y ) ).x;",
+
+ "gl_FragColor = vec4( ( 0.5 * normalize( vec3( val - valU, val - valV, height ) ) + 0.5 ), 1.0 );",
+
+ "}",
+
+ ].join("\n")
+
+ },
+
// METHODS
buildKernel: function( sigma ) {
diff --git a/examples/webgl_terrain_dynamic.html b/examples/webgl_terrain_dynamic.html
index ccf9ff0a..c20dc833 100644
--- a/examples/webgl_terrain_dynamic.html
+++ b/examples/webgl_terrain_dynamic.html
@@ -78,27 +78,6 @@
-
-
-
-